一、多表查询概念
二、概述
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