mysql 視圖筆記

現有三張表:用戶(user)、課程(course)、用戶課程中間表(user_course),表結構及數據如下:

表定義:

複製代碼

-- ----------------------------
-- Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `description` varchar(500) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA課程');
INSERT INTO `course` VALUES ('2', 'C++', 'C++課程');
INSERT INTO `course` VALUES ('3', 'C語言', 'C語言課程');

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `address` varchar(255) DEFAULT NULL,
  `others` varchar(200) DEFAULT NULL,
  `others2` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'user1', '小陳', '美國', '1', '1');
INSERT INTO `user` VALUES ('2', 'user2', '小張', '日本', '2', '2');
INSERT INTO `user` VALUES ('3', 'user3', '小王', '中國', '3', '3');

-- ----------------------------
-- Table structure for `user_course`
-- ----------------------------
DROP TABLE IF EXISTS `user_course`;
CREATE TABLE `user_course` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `courseid` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_course
-- ----------------------------
INSERT INTO `user_course` VALUES ('1', '1', '2');
INSERT INTO `user_course` VALUES ('2', '1', '3');
INSERT INTO `user_course` VALUES ('3', '2', '1');
INSERT INTO `user_course` VALUES ('4', '2', '2');
INSERT INTO `user_course` VALUES ('5', '2', '3');
INSERT INTO `user_course` VALUES ('6', '3', '2');

複製代碼

表數據:

這時,當我們想要查詢小張上的所以課程相關信息的時候,需要這樣寫一條長長的SQL語句,如下:

複製代碼

SELECT
    `uc`.`id` AS `id`,
    `u`.`name` AS `username`,
    `c`.`name` AS `coursename`
FROM
    `user` `u`
LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))
LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))
WHERE
    u.`name` = '小張'

複製代碼

但是我們可以通過視圖簡化操作,例如我們創建視圖view_user_course如下:

複製代碼

-- ----------------------------
-- View structure for `view_user_course`
-- ----------------------------
DROP VIEW
IF EXISTS `view_user_course`;

CREATE ALGORITHM = UNDEFINED 
DEFINER = `root`@`localhost` 
SQL SECURITY DEFINER 
VIEW `view_user_course` AS (
    SELECT
        `uc`.`id` AS `id`,
        `u`.`name` AS `username`,
        `c`.`name` AS `coursename`
    FROM
        (
            (
                `user` `u`
                LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))
            )
            LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))
        )
);

複製代碼

幾點說明(MySQL中的視圖在標準SQL的基礎之上做了擴展):

ALGORITHM=UNDEFINED:指定視圖的處理算法;

DEFINER=`root`@`localhost`:指定視圖創建者;

SQL SECURITY DEFINER:指定視圖查詢數據時的安全驗證方式;

創建好視圖之後,我們可以直接用以下SQL語句在視圖上查詢小張上的所以課程相關信息,同樣可以得到所需結果:

複製代碼

SELECT
    vuc.username,
    vuc.coursename
FROM
    view_user_course vuc
WHERE
     vuc.username = '小張'

複製代碼

視圖實例2-增刪改數據操作

繼續,我們可以嘗試在視圖view_user_course上做增刪改數據操作,如下:

update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

遺憾的是操作失敗,提示錯誤信息如下:

[SQL] update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

[Err] 1393 - Can not modify more than one base table through a join view 'demo.view_user_course'

因爲不能在一張由多張關聯表連接而成的視圖上做同時修改兩張表的操作;

那麼哪些操作可以在視圖上進行呢?

視圖與表是一對一關係情況:如果沒有其它約束(如視圖中沒有的字段,在基本表中是必填字段情況),是可以進行增刪改數據操作;

如我們創建用戶關鍵信息視圖view_user_keyinfo,如下:

複製代碼

-- ----------------------------
-- View structure for `view_user_keyinfo`
-- ----------------------------
DROP VIEW
IF EXISTS `view_user_keyinfo`;

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_keyinfo` AS SELECT
    `u`.`id` AS `id`,
    `u`.`account` AS `account`,
    `u`.`name` AS `username`
FROM
    `user` `u`;

複製代碼

進行增刪改操作如下,操作成功(注意user表中的其它字段要允許爲空,否則操作失敗):

INSERT INTO view_user_keyinfo (account, username)
VALUES
    ('test1', 'test1');
DELETE
FROM
    view_user_keyinfo
WHERE
    username = 'test1';
UPDATE view_user_keyinfo
SET username = 'updateuser'
WHERE
    id = 1

視圖與表是一對多關係情況:如果只修改一張表的數據,且沒有其它約束(如視圖中沒有的字段,在基本表中是必填字段情況),是可以進行改數據操作,如以下語句,操作成功;

update view_user_course set coursename='JAVA' where id=1;
update view_user_course set username='test2' where id=3;

以下操作失敗:

delete from view_user_course where id=3;
insert into view_user_course(username, coursename) VALUES('2','3');

 

window下

1.導出整個數據庫
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u dbuser -p dbname > dbname.sql

2.導出一個表
mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u dbuser -p dbname users> dbname_users.sql

3.導出一個數據庫結構
mysqldump -u dbuser -p -d --add-drop-table dbname >d:/dbname_db.sql
-d 沒有數據 --add-drop-table 在每個create語句之前增加一個drop table

4.導入數據庫
常用source 命令
進入mysql數據庫控制檯,如
mysql -u root -p
mysql>use 數據庫
然後使用source命令,後面參數爲腳本文件(如這裏用到的.sql)
mysql>source d:/dbname.sql

 

 

1. 導入數據到數據庫

mysql -uroot -D數據庫名 

1. 導入數據到數據庫中得某個表

mysql -uroot -D數據庫名  表名

 

D:\APMServ5.2.6\MySQL5.1\bin>mysqldump -u root -p  erp lightinthebox_tags > ligh
tinthebox.sql

 

linux下

一、導出數據庫用mysqldump命令(注意mysql的安裝路徑,即此命令的路徑):
1、導出數據和表結構:
mysqldump -u用戶名 -p密碼 數據庫名 > 數據庫名.sql
#/usr/local/mysql/bin/   mysqldump -uroot -p abc > abc.sql
敲回車後會提示輸入密碼

2、只導出表結構
mysqldump -u用戶名 -p密碼 -d 數據庫名 > 數據庫名.sql
#/usr/local/mysql/bin/   mysqldump -uroot -p -d abc > abc.sql

注:/usr/local/mysql/bin/  --->  mysql的data目錄


二、導入數據庫
1、首先建空數據庫
mysql>create database abc;

2、導入數據庫
方法一:
(1)選擇數據庫
mysql>use abc;
(2)設置數據庫編碼
mysql>set names utf8;
(3)導入數據(注意sql文件的路徑)
mysql>source /home/abc/abc.sql;
方法二:
mysql -u用戶名 -p密碼 數據庫名 < 數據庫名.sql
#mysql -uabc_f -p abc < abc.sql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章