跳到主要内容

join连接语句查询

  • join语句查询:表示连接查询,用于把两张或多张表的数据关联起来查询
  • JOIN 通过 ON 指定字段之间的匹配关系
  • 内连接:inner join
  • 外连接:outer join
    • 左外连接:left join
    • 右外连接:right join
    • 全外连接: full outer join
  • 自连接:一张表自己和自己连接

内连接​

  • 内连接只保留两边都能匹配的数据
    • 通过inner join表示内连接 (JOIN 、INNER JOIN)
    • inner也可以省略,默认是inner
  • 查询2个表匹配的数据

例子:

  • 如果某条用户记录没有订单,或者某条订单找不到对应用户,都不会出现在结果中。
sql
SELECT
users.id,
users.name,
orders.product
FROM users
INNER JOIN orders
ON users.id = orders.user_id;

外连接​

  • 外连接会保留无法匹配的数据
    • 这个外可以理解为:可以查询匹配不到的数据,也就是NULL的数据

外连接主要包含:

  • 这里的外连接的OUTER可以省略
text
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN

左外连接​

  • 左外连接:LEFT JOIN
  • 以左边的表为主、右边的表能匹配就返回,右边不能匹配的话,对应字段返回NULL
sql
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
sql
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来模拟

应用场景:

  • 适合需要比对两边的全部数据
sql
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 表中
  • 两边连接都是同一张表,可以说是自连接
sql
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 即可
sql
SELECT 字段
FROM 表1
JOIN 表2 ON 表1.字段 = 表2.字段
JOIN 表3 ON 表2.字段 = 表3.字段
JOIN 表4 ON 表3.字段 = 表4.字段;

连接查询技巧​

  • 在使用多表连接查询时,需要先确认哪张是核心主表
  • 只要两张表之间存在可以用于匹配的字段,就能进行连接查询。
    • 不一定要求存在外键关联