一、多表設(shè)計
1.一對一
實現(xiàn)原則 在任意一個表建立外鍵,去關(guān)聯(lián)另外一個表的主鍵 代碼演示
-- 創(chuàng)建db5數(shù)據(jù)庫
CREATE DATABASE db5;
-- 使用db5數(shù)據(jù)庫
USE db5;-- 創(chuàng)建person表
CREATE TABLE person(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加數(shù)據(jù)
INSERT INTO person VALUES (NULL,'張三'),(NULL,'李四');-- 創(chuàng)建card表
CREATE TABLE card(id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR(50),pid INT UNIQUE,CONSTRAINT cp_fk1 FOREIGN KEY (pid) REFERENCES person(id) -- 添加外鍵
);
-- 添加數(shù)據(jù)
INSERT INTO card VALUES (NULL,'12345',1),(NULL,'56789',2);
2.一對多
分析 用戶和訂單。一個用戶可以有多個訂單! 商品分類和商品。一個分類下可以有多個商品! 實現(xiàn)原則 在多的一方,建立外鍵約束,來關(guān)聯(lián)一的一方主鍵 代碼演示
/*用戶和訂單
*/
-- 創(chuàng)建user表
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加數(shù)據(jù)
INSERT INTO USER VALUES (NULL,'張三'),(NULL,'李四');-- 創(chuàng)建orderlist表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR(20),uid INT,CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id) -- 添加外鍵約束
);
-- 添加數(shù)據(jù)
INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),(NULL,'hm003',2),(NULL,'hm004',2);/*商品分類和商品
*/
-- 創(chuàng)建category表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);
-- 添加數(shù)據(jù)
INSERT INTO category VALUES (NULL,'手機數(shù)碼'),(NULL,'電腦辦公');-- 創(chuàng)建product表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(30),cid INT,CONSTRAINT pc_fk1 FOREIGN KEY (cid) REFERENCES category(id) -- 添加外鍵約束
);
-- 添加數(shù)據(jù)
INSERT INTO product VALUES (NULL,'華為P30',1),(NULL,'小米note3',1),
(NULL,'聯(lián)想電腦',2),(NULL,'蘋果電腦',2);
3.多對多
分析 學(xué)生和課程。一個學(xué)生可以選擇多個課程,一個課程也可以被多個學(xué)生選擇! 實現(xiàn)原則 需要借助第三張表中間表,中間表至少包含兩個列,這兩個列作為中間表的外鍵,分別關(guān)聯(lián)兩張表的主鍵 代碼演示
-- 創(chuàng)建student表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加數(shù)據(jù)
INSERT INTO student VALUES (NULL,'張三'),(NULL,'李四');-- 創(chuàng)建course表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);
-- 添加數(shù)據(jù)
INSERT INTO course VALUES (NULL,'語文'),(NULL,'數(shù)學(xué)');-- 創(chuàng)建中間表
CREATE TABLE stu_course(id INT PRIMARY KEY AUTO_INCREMENT,sid INT, -- 用于和student表的id進(jìn)行外鍵關(guān)聯(lián)cid INT, -- 用于和course表的id進(jìn)行外鍵關(guān)聯(lián)CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id), -- 添加外鍵約束CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id) -- 添加外鍵約束
);
-- 添加數(shù)據(jù)
INSERT INTO stu_course VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);
二、多表查詢
1.多表查詢-數(shù)據(jù)準(zhǔn)備
-- 創(chuàng)建db6數(shù)據(jù)庫
CREATE DATABASE db6;
-- 使用db6數(shù)據(jù)庫
USE db6;-- 創(chuàng)建user表
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT, -- 用戶idNAME VARCHAR(20), -- 用戶姓名age INT -- 用戶年齡
);
-- 添加數(shù)據(jù)
INSERT INTO USER VALUES (1,'張三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'趙六',26);-- 訂單表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT, -- 訂單idnumber VARCHAR(30), -- 訂單編號uid INT, -- 外鍵字段CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加數(shù)據(jù)
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);-- 商品分類表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT, -- 商品分類idNAME VARCHAR(10) -- 商品分類名稱
);
-- 添加數(shù)據(jù)
INSERT INTO category VALUES (1,'手機數(shù)碼');
INSERT INTO category VALUES (2,'電腦辦公');
INSERT INTO category VALUES (3,'煙酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');-- 商品表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT, -- 商品idNAME VARCHAR(30), -- 商品名稱cid INT, -- 外鍵字段CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加數(shù)據(jù)
INSERT INTO product VALUES (1,'華為手機',1);
INSERT INTO product VALUES (2,'小米手機',1);
INSERT INTO product VALUES (3,'聯(lián)想電腦',2);
INSERT INTO product VALUES (4,'蘋果電腦',2);
INSERT INTO product VALUES (5,'中華香煙',3);
INSERT INTO product VALUES (6,'玉溪香煙',3);
INSERT INTO product VALUES (7,'計生用品',NULL);-- 中間表
CREATE TABLE us_pro(upid INT PRIMARY KEY AUTO_INCREMENT, -- 中間表iduid INT, -- 外鍵字段。需要和用戶表的主鍵產(chǎn)生關(guān)聯(lián)pid INT, -- 外鍵字段。需要和商品表的主鍵產(chǎn)生關(guān)聯(lián)CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加數(shù)據(jù)
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);
2.多表查詢-笛卡爾積查詢
有兩張表,獲取這兩個表的所有組合情況 要完成多表查詢,需要消除這些沒有用的數(shù)據(jù) 多表查詢格式
SELECT列名列表
FROM表名列表
WHERE條件...
-- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名1,表名2,...;-- 查詢user表和orderlist表
SELECT * FROM USER,orderlist;
3.多表查詢-內(nèi)連接查詢
查詢原理 內(nèi)連接查詢的是兩張表有交集的部分?jǐn)?shù)據(jù)(有主外鍵關(guān)聯(lián)的數(shù)據(jù)) 顯式內(nèi)連接
-- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 條件;-- 查詢用戶信息和對應(yīng)的訂單信息
SELECT * FROM USER INNER JOIN orderlist ON user.id=orderlist.uid;
SELECT * FROM USER JOIN orderlist ON user.id=orderlist.uid;-- 查詢用戶信息和對應(yīng)的訂單信息,起別名
SELECT * FROM USER u JOIN orderlist o ON u.id=o.uid;-- 查詢用戶姓名,年齡。和訂單編號
SELECTu.`name`, -- 姓名u.`age`, -- 年齡o.`number` -- 訂單編號
FROMUSER u -- 用戶表
JOINorderlist o -- 訂單表
ON u.`id` = o.`uid`;
-- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名1,表名2 WHERE 條件;-- 查詢用戶姓名,年齡。和訂單編號
SELECTu.`name`, -- 姓名u.`age`, -- 年齡o.`number` -- 訂單編號
FROMUSER u, -- 用戶表orderlist o -- 訂單表
WHEREu.`id`=o.`uid`;
4.多表查詢-外連接查詢
左外連接
查詢原理 查詢左表的全部數(shù)據(jù),和左右兩張表有交集部分的數(shù)據(jù) 基本演示 -- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 條件;-- 查詢所有用戶信息,以及用戶對應(yīng)的訂單信息
SELECTu.`name`, -- 姓名u.`age`, -- 年齡o.`number` -- 訂單編號
FROMUSER u -- 用戶表
LEFT OUTER JOINorderlist o -- 訂單表
ONu.`id`=o.`uid`;
右外連接
查詢原理 查詢右表的全部數(shù)據(jù),和左右兩張表有交集部分的數(shù)據(jù) 基本演示 -- 基本語法
SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 條件;-- 查詢所有訂單信息,以及訂單所屬的用戶信息
SELECTu.`name`, -- 姓名u.`age`, -- 年齡o.`number` -- 訂單編號
FROMUSER u -- 用戶表
RIGHT OUTER JOINorderlist o -- 訂單表
ONu.`id`=o.`uid`;
5.多表查詢-子查詢
子查詢介紹
查詢語句中嵌套了查詢語句。我們就將嵌套查詢稱為子查詢! 子查詢-結(jié)果是單行單列的
可以作為條件,使用運算符進(jìn)行判斷! 基本演示 -- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函數(shù)(列名) FROM 表名 [WHERE 條件]);-- 查詢年齡最高的用戶姓名
SELECT MAX(age) FROM USER; -- 查詢出最高年齡
SELECT NAME,age FROM USER WHERE age=26; -- 根據(jù)查詢出來的最高年齡,查詢姓名和年齡
SELECT NAME,age FROM USER WHERE age = (SELECT MAX(age) FROM USER);
子查詢-結(jié)果是多行單列的
可以作為條件,使用運算符in或not in進(jìn)行判斷! 基本演示 -- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 條件]); -- 查詢張三和李四的訂單信息
SELECT id FROM USER WHERE NAME='張三' OR NAME='李四'; -- 查詢張三和李四用戶的id
SELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根據(jù)id查詢訂單
SELECT number,uid FROM orderlist WHERE uid IN (SELECT id FROM USER WHERE NAME='張三' OR NAME='李四');
子查詢-結(jié)果是多行多列的
-- 標(biāo)準(zhǔn)語法
SELECT 列名 FROM 表名 [別名],(SELECT 列名 FROM 表名 [WHERE 條件]) [別名] [WHERE 條件];-- 查詢訂單表中id大于4的訂單信息和所屬用戶信息
SELECT * FROM USER u,(SELECT * FROM orderlist WHERE id>4) o WHERE u.id=o.uid;
6.多表查詢-自關(guān)聯(lián)查詢
自關(guān)聯(lián)查詢介紹 同一張表中有數(shù)據(jù)關(guān)聯(lián)。可以多次查詢這同一個表! 自關(guān)聯(lián)查詢演示
-- 創(chuàng)建員工表
CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),mgr INT,salary DOUBLE
);
-- 添加數(shù)據(jù)
INSERT INTO employee VALUES (1001,'孫悟空',1005,9000.00),
(1002,'豬八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龍',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林沖',1009,8100.00),
(1009,'宋江',NULL,16000.00);-- 查詢所有員工的姓名及其直接上級的姓名,沒有上級的員工也需要查詢
/*
分析:員工姓名 employee表 直接上級姓名 employee表條件:employee.mgr = employee.id查詢左表的全部數(shù)據(jù),和左右兩張表交集部分?jǐn)?shù)據(jù),使用左外連接
*/
SELECTt1.name, -- 員工姓名t1.mgr, -- 上級編號t2.id, -- 員工編號t2.name -- 員工姓名
FROMemployee t1 -- 員工表
LEFT OUTER JOINemployee t2 -- 員工表
ONt1.mgr = t2.id;
總結(jié)
以上是生活随笔 為你收集整理的mysql多表操作常用语法命令 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。