1. 程式人生 > 資料庫 >MySQL資料庫高階查詢和多表查詢

MySQL資料庫高階查詢和多表查詢

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(外來鍵)'
);

-- 給已經存在的表新增外來鍵,語法如下
-- alter table 表名 add constraint [外來鍵名字] foreign key (外來鍵欄位) references 父表(主鍵欄位);
ALTER TABLE orders ADD CONSTRAINT user_fk FOREIGN KEY (user_id) REFERENCES `user` (id);

-- 向user表中新增資料
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 表中插入資料
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);

在這裡插入圖片描述

在這裡插入圖片描述

笛卡爾積

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

在這裡插入圖片描述

  • 像如上圖查出來的資料,對我們程式設計師是沒啥用的。
  • 哪如何消除笛卡爾積呢?需要主外來鍵的約束,去重複資料。
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;

在這裡插入圖片描述

1.內連線

1.1隱式內連線

  • from 後面直接出現多表表名,這個屬於隱式內連線
  • 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顯示內連線(推薦使用)

  • 使用 inner join 來連結表,後面 on 跟條件。(inner 可以省略)
  • select * from 表a inner join 表b on a.id = b.a_id;
  • 查詢成年使用者和訂單資料;
SELECT * FROM `user` u JOIN `orders` o ON u.`id`=o.`user_id` WHERE age >= 18;

在這裡插入圖片描述

2.外連線

  • 外連結可以顯示單表的全部資料,包括null;

2.1右外連結

  • 顯示右邊表的全部資料
  • 使用 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`;

在這裡插入圖片描述

左邊表資料(user)

在這裡插入圖片描述

右邊表資料(orders)

在這裡插入圖片描述

2.2左外連結(推薦使用)

  • 顯示左邊表的全部資料
  • 使用 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`;

在這裡插入圖片描述

左邊表資料(user)

在這裡插入圖片描述

右邊表資料(orders)

在這裡插入圖片描述

3.子查詢

  • 子查詢,巢狀的感覺。查詢出來的結果給另外一個查詢當條件使用。
  • 查詢年齡最大的使用者的訂單資料
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不支援)

  • 全連線,左右兩張表的全部資料包括null。相當於右外連結和左外連結的結合。
  • select * from 表a full outer join 表b on a.id=b.a_id;(MySQL不支援,不做演示)

MySQL其它文章,請看下面連結

MySQL DDL 語句

MySQL CRUD 語句

MySQL 聚合函式

MySQL 多表查詢

END…

到此這篇關於MySQL資料庫高階查詢和多表查詢的文章就介紹到這了,更多相關MySQL高階查詢和多表查詢內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!