MySQL數(shù)據(jù)庫(kù)高級(jí)查詢(xún)和多表查詢(xún)
MySQL多表查詢(xún)
添加練習(xí)表
-- 用戶(hù)表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用戶(hù)id(主鍵)', `username` VARCHAR(50) COMMENT '用戶(hù)姓名', `age` CHAR(3) COMMENT '用戶(hù)年齡' ); -- 訂單表(orders) CREATE TABLE `orders`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '訂單id(主鍵)', `price` DOUBLE COMMENT '訂單價(jià)格', `user_id` INT COMMENT '用戶(hù)id(外鍵)' ); -- 給已經(jīng)存在的表添加外鍵,語(yǔ)法如下 -- alter table 表名 add constraint [外鍵名字] foreign key (外鍵字段) references 父表(主鍵字段); ALTER TABLE orders ADD CONSTRAINT user_fk FOREIGN KEY (user_id) REFERENCES `user` (id); -- 向user表中添加數(shù)據(jù) INSERT INTO USER VALUES(1,'第一',11); INSERT INTO USER VALUES(2,'小二',12); INSERT INTO USER VALUES(3,'張三',33); INSERT INTO USER VALUES(4,'李四',24); INSERT INTO USER VALUES(5,'王五',17); INSERT INTO USER VALUES(6,'趙六',36); INSERT INTO USER VALUES(7,'七七',18); INSERT INTO USER VALUES(8,'粑粑',NULL); -- 向orders 表中插入數(shù)據(jù) INSERT INTO orders VALUES(111,1314,3); INSERT INTO orders VALUES(112,122,3); INSERT INTO orders VALUES(113,15,4); INSERT INTO orders VALUES(114,315,5); INSERT INTO orders VALUES(115,1014,NULL); INSERT INTO orders VALUES(116,666,6); INSERT INTO orders VALUES(117,1111,1); INSERT INTO orders VALUES(118,8888,NULL);
笛卡爾積
- 笛卡爾乘積是指在數(shù)學(xué)中,兩個(gè)集合X和Y的笛卡爾積(Cartesian product),又稱(chēng)直積,表示為X × Y,第一個(gè)對(duì)象是X的成員而第二個(gè)對(duì)象是Y的所有可能有序?qū)Φ钠渲幸粋€(gè)成員。(笛卡爾積)百度百科
- 什么笛卡爾積,如下所示
SELECT * FROM `user`,`orders`;
- 像如上圖查出來(lái)的數(shù)據(jù),對(duì)我們程序員是沒(méi)啥用的。
- 哪如何消除笛卡爾積呢?需要主外鍵的約束,去重復(fù)數(shù)據(jù)。
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;
1.內(nèi)連接
1.1隱式內(nèi)連接
- from 后面直接出現(xiàn)多表表名,這個(gè)屬于隱式內(nèi)連接
- select * from 表a,表b where a.id = b.a_id;
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;
1.2顯示內(nèi)連接(推薦使用)
- 使用 inner join 來(lái)鏈接表,后面 on 跟條件。(inner 可以省略)
- select * from 表a inner join 表b on a.id = b.a_id;
- 查詢(xún)成年用戶(hù)和訂單數(shù)據(jù);
SELECT * FROM `user` u JOIN `orders` o ON u.`id`=o.`user_id` WHERE age >= 18;
2.外連接
- 外鏈接可以顯示單表的全部數(shù)據(jù),包括null;
2.1右外鏈接
- 顯示右邊表的全部數(shù)據(jù)
- 使用 right outer join 來(lái)鏈接表,后面 on 跟條件。(outer 可以省略)
- select * from 表a right outer join 表b on a.id=b.a_id;
SELECT * FROM `user` u RIGHT JOIN `orders` o ON u.`id`=o.`user_id`;
左邊表數(shù)據(jù)(user)
右邊表數(shù)據(jù)(orders)
2.2左外鏈接(推薦使用)
- 顯示左邊表的全部數(shù)據(jù)
- 使用 left outer join 來(lái)鏈接表,后面 on 跟條件。(outer 可以省略)
- select * from 表a left outer join 表b on a.id=b.a_id;
SELECT * FROM `user` u LEFT JOIN `orders` o ON u.`id`=o.`user_id`;
左邊表數(shù)據(jù)(user)
右邊表數(shù)據(jù)(orders)
3.子查詢(xún)
- 子查詢(xún),嵌套的感覺(jué)。查詢(xún)出來(lái)的結(jié)果給另外一個(gè)查詢(xún)當(dāng)條件使用。
- 查詢(xún)年齡最大的用戶(hù)的訂單數(shù)據(jù)
SELECT * FROM orders o WHERE o.`user_id` IN ( SELECT u.`id` FROM `user` u WHERE u.`age` IN( SELECT MAX(u.`age`) FROM `user` u ) );
4.全連接(MySQL不支持)
- 全連接,左右兩張表的全部數(shù)據(jù)包括null。相當(dāng)于右外鏈接和左外鏈接的結(jié)合。
- select * from 表a full outer join 表b on a.id=b.a_id;(MySQL不支持,不做演示)
MySQL其它文章,請(qǐng)看下面鏈接
END…
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)高級(jí)查詢(xún)和多表查詢(xún)的文章就介紹到這了,更多相關(guān)MySQL高級(jí)查詢(xún)和多表查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql實(shí)用技巧之比較兩個(gè)表是否有不同數(shù)據(jù)的方法分析
這篇文章主要介紹了mysql實(shí)用技巧之比較兩個(gè)表是否有不同數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了mysql數(shù)據(jù)表比較的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12

MySQL如何查看數(shù)據(jù)庫(kù)連接數(shù)

使用MySQL實(shí)現(xiàn)一個(gè)分布式鎖

為mysql數(shù)據(jù)庫(kù)添加添加事務(wù)處理的方法