一、多表查詢概念
二、概述
1. 內連接
-
隱式內連接
SELECT 字段列表 FROM 表1,表2... WHERE 條件
-
顯示內連接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 條件
2. 外連接
- 左外連接
SELECT 列名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 連接條件;
- 右外連接
SELECT 列名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 連接條件;
語法要點:
-
LEFT JOIN: 以左表為主,保留左表所有記錄
-
RIGHT JOIN: 以右表為主,保留右表所有記錄
-
ON 條件: 指定兩表的連接條件
-
OUTER: 可選關鍵詞,LEFT JOIN 等同于 LEFT OUTER JOIN
-
FROM 左表 LEFT JOIN 右表 – 保留左表所有數據
-
FROM 左表 RIGHT JOIN 右表 – 保留右表所有數據
案例
左右連接等價轉換技巧: A LEFT JOIN B = B RIGHT JOIN A
-- 這兩個查詢結果相同,只是表的位置調換了
SELECT * FROM users u LEFT JOIN orders o ON u.user_id = o.user_id;
SELECT * FROM orders o RIGHT JOIN users u ON u.user_id = o.user_id;
三、案例
用戶表
user_id | user_name | email
--------|-----------|----------------
1 | 張三 | zhang@email.com
2 | 李四 | li@email.com
3 | 王五 | wang@email.com
4 | 趙六 | zhao@email.com
訂單表
order_id | user_id | total_amount | order_date
---------|---------|--------------|------------
101 | 1 | 299.99 | 2024-01-15
102 | 1 | 199.50 | 2024-01-20
103 | 2 | 399.00 | 2024-01-25
104 | 5 | 599.99 | 2024-02-01
左連接 (LEFT JOIN) 查詢
SELECT u.user_id, u.user_name, o.order_id, o.total_amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
左連接結果:
user_id | user_name | order_id | total_amount
--------|-----------|----------|-------------
1 | 張三 | 101 | 299.99
1 | 張三 | 102 | 199.50
2 | 李四 | 103 | 399.00
3 | 王五 | NULL | NULL
4 | 趙六 | NULL | NULL
說明: 保留了所有用戶,王五和趙六沒有訂單,顯示為NULL。
右連接 (RIGHT JOIN) 查詢
SELECT u.user_id, u.user_name, o.order_id, o.total_amount
FROM users u
RIGHT JOIN orders o ON u.user_id = o.user_id;
右連接結果:
user_id | user_name | order_id | total_amount
--------|-----------|----------|-------------
1 | 張三 | 101 | 299.99
1 | 張三 | 102 | 199.50
2 | 李四 | 103 | 399.00
NULL | NULL | 104 | 599.99
說明: 保留了所有訂單,訂單104的用戶ID是5,但users表中沒有這個用戶,所以用戶信息顯示為NULL。
內連接 (INNER JOIN) 對比
SELECT u.user_id, u.user_name, o.order_id, o.total_amount
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id;
內連接結果:
user_id | user_name | order_id | total_amount
--------|-----------|----------|-------------
1 | 張三 | 101 | 299.99
1 | 張三 | 102 | 199.50
2 | 李四 | 103 | 399.00
說明: 只顯示兩表都有匹配的記錄。
總結
- LEFT JOIN: 顯示5行,包含所有用戶(即使沒有訂單)
- RIGHT JOIN: 顯示4行,包含所有訂單(即使用戶不存在)
- INNER JOIN: 顯示3行,只包含有匹配的記錄
四、子查詢
舉例
多行單列:子查詢在 in 后面
多行多列:子查詢在from 后面
五、子查詢案例
內連接
隱式內連接
顯示內連接
select
六、事務
案例
修改 @@autocommit 為0 的時候,需要手動提交 commit, 默認自動提交,值為1