溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL數(shù)據(jù)庫多表查詢的方法

發(fā)布時間:2020-08-05 17:18:46 來源:億速云 閱讀:289 作者:小新 欄目:開發(fā)技術

MySQL數(shù)據(jù)庫多表查詢的方法?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

MySQL多表查詢

添加練習表

-- 用戶表(user)
CREATE TABLE `user`(
	`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用戶id(主鍵)',
	`username` VARCHAR(50) COMMENT '用戶姓名', 
	`age` CHAR(3) COMMENT '用戶年齡'
);

-- 訂單表(orders)
CREATE TABLE `orders`(
	`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '訂單id(主鍵)',
	`price` DOUBLE COMMENT '訂單價格',
	`user_id` INT COMMENT '用戶id(外鍵)'
);

-- 給已經(jīng)存在的表添加外鍵,語法如下
-- 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);

MySQL數(shù)據(jù)庫多表查詢的方法

MySQL數(shù)據(jù)庫多表查詢的方法

笛卡爾積

  • 笛卡爾乘積是指在數(shù)學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。(笛卡爾積)百度百科
  • 什么笛卡爾積,如下所示
SELECT * FROM `user`,`orders`;

MySQL數(shù)據(jù)庫多表查詢的方法

  • 像如上圖查出來的數(shù)據(jù),對我們程序員是沒啥用的。
  • 哪如何消除笛卡爾積呢?需要主外鍵的約束,去重復數(shù)據(jù)。
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;

MySQL數(shù)據(jù)庫多表查詢的方法

1.內(nèi)連接

1.1隱式內(nèi)連接

  • from 后面直接出現(xiàn)多表表名,這個屬于隱式內(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`;

MySQL數(shù)據(jù)庫多表查詢的方法

1.2顯示內(nèi)連接(推薦使用)

  • 使用 inner join 來鏈接表,后面 on 跟條件。(inner 可以省略)
  • select * from 表a inner join 表b on a.id = b.a_id;
  • 查詢成年用戶和訂單數(shù)據(jù);
SELECT * FROM `user` u JOIN `orders` o ON u.`id`=o.`user_id` WHERE age >= 18;

MySQL數(shù)據(jù)庫多表查詢的方法

2.外連接

  • 外鏈接可以顯示單表的全部數(shù)據(jù),包括null;

2.1右外鏈接

  • 顯示右邊表的全部數(shù)據(jù)
  • 使用 right outer join 來鏈接表,后面 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`;

MySQL數(shù)據(jù)庫多表查詢的方法

左邊表數(shù)據(jù)(user)

MySQL數(shù)據(jù)庫多表查詢的方法

右邊表數(shù)據(jù)(orders)

MySQL數(shù)據(jù)庫多表查詢的方法

2.2左外鏈接(推薦使用)

  • 顯示左邊表的全部數(shù)據(jù)
  • 使用 left outer join 來鏈接表,后面 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`;

MySQL數(shù)據(jù)庫多表查詢的方法

左邊表數(shù)據(jù)(user)

MySQL數(shù)據(jù)庫多表查詢的方法

右邊表數(shù)據(jù)(orders)

MySQL數(shù)據(jù)庫多表查詢的方法

3.子查詢

  • 子查詢,嵌套的感覺。查詢出來的結果給另外一個查詢當條件使用。
  • 查詢年齡最大的用戶的訂單數(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
	)
);

MySQL數(shù)據(jù)庫多表查詢的方法

4.全連接(MySQL不支持)

  • 全連接,左右兩張表的全部數(shù)據(jù)包括null。相當于右外鏈接和左外鏈接的結合。
  • select * from 表a full outer join 表b on a.id=b.a_id;(MySQL不支持,不做演示)

MySQL其它文章,請看下面鏈接

MySQL DDL 語句

MySQL CRUD 語句

MySQL 聚合函數(shù)

MySQL 多表查詢

END…

感謝各位的閱讀!看完上述內(nèi)容,你們對MySQL數(shù)據(jù)庫多表查詢的方法大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關文章內(nèi)容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI