join连接语句查询
- join语句查询:表示连接查询,用于把两张或多张表的数据关联起来查询
- JOIN 通过
ON指定字段之间的匹配关系 - 内连接:inner join
- 外连接:outer join
- 左外连接:left join
- 右外连接:right join
- 全外连接: full outer join
- 自连接:一张表自己和自己连接
内连接
- 内连接只保留两边都能匹配的数据
- 通过inner join表示内连接 (JOIN 、INNER JOIN)
- inner也可以省略,默认是inner
- 查询2个表匹配的数据
例子:
- 如果某条用户记录没有订单,或者某条订单找不到对应用户,都不会出现在结果中。
SELECT
users.id,
users.name,
orders.product
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
外连接
- 外连接会保留无法匹配的数据
- 这个外可以理解为:可以查询匹配不到的数据,也就是NULL的数据
外连接主要包含:
- 这里的外连接的OUTER可以省略
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
左外连接
- 左外连接:LEFT JOIN
- 以左边的表为主、右边的表能匹配就返回,右边不能匹配的话,对应字段返回NULL
SELECT
users.id,
users.name,
orders.product
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
右外连接
- 右外连接:RIGHT JOIN
- 以右边的表为主, 左边边的表能匹配就返回,左边不能匹配的话,对应字段返回NULL
应用场景:
- 实际开发中,RIGHT JOIN 使用相对较少,通常都是用LEFT JOIN左外连接更容易阅读
- 尽量统一使用
LEFT JOIN,通过调整表的前后顺序代替RIGHT JOIN
SELECT
users.id,
users.name,
orders.id AS order_id,
orders.product
FROM users
RIGHT JOIN orders
ON users.id = orders.user_id;
全外连接
- 全外连接 FULL OUTER JOIN
- 返回左右两张表的全部数据
- 能匹配的数据合并;
- 左表不能匹配的数据保留;
- 右表不能匹配的数据也保留;
- 缺失的一边使用
NULL
- 注意mysql不支持全外连接,可以通过LEFT JOIN + RIGHT JOIN来模拟
应用场景:
- 适合需要比对两边的全部数据
SELECT
users.id,
users.name,
orders.id AS order_id,
orders.product
FROM users
FULL OUTER JOIN orders
ON users.id = orders.user_id;
自连接
- 一张表自己和自己连接
- 注意,自连接需要通过表别名来区分开,因为同张表出现多次,需要通过别名来区分
- 自连接可以配合不同 JOIN,如LEFT JOIN、RIGHT JOIN
例子:
- 员工和上级都存放在 employees 表中
- 两边连接都是同一张表,可以说是自连接
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.id;
超过两张表连接查询
- 当超过两张表连接查询时,继续追加多个
JOIN即可
SELECT 字段
FROM 表1
JOIN 表2 ON 表1.字段 = 表2.字段
JOIN 表3 ON 表2.字段 = 表3.字段
JOIN 表4 ON 表3.字段 = 表4.字段;
连接查询技巧
- 在使用多表连接查询时,需要先确认哪张是核心主表
- 只要两张表之间存在可以用于匹配的字段,就能进行连接查询。
- 不一定要求存在外键关联