Skip to main content

SQL连接查询

· 3 min read

内连接 (inner join)

内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。 在内连接查询中,只有满足条件的记录才能出现在结果关系中

如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表

select * from a inner join b on a.x = b.x;

外连接 (outer join)

外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中仅是符合查询条件和连接条件的行

外连接分为左连接右连接

  • 左连接(left join): 返回包括左表中的所有记录和右表中连接字段相等的记录。左表没有右表中的值则用null填充
  • 右连接(right join): 返回包括右表中的所有记录和左表中连接字段相等的记录。右表没有左表中的值则用null填充
# 左连接
select * from a left join b on a.x = b.x;
# 右连接
select * from a right join b on a.x = b.x;

自然连接 (natural join)

自然连接是特殊的等值连接,不需要指定连接的条件,会根据左右连接表中相同的字段作为连接条件

select * from a natural join b;

交叉连接 (cross join)

交叉连接主要用于生成笛卡尔积

select * from a natural join b;

连接查询注意点

  • 查询数据尽可能的加入条件,减少join后的数据集大小
  • join时要选择小表驱动大表 (大表驱动小表会导致外层循环过多,浪费资源)
for (大表) {
for (小表) { }
}

如何判断:

  1. left join左边表是驱动表
  2. right join右边表是驱动表
  3. inner join会自动选择数据量少的作为驱动表
  4. 查询 explain 执行计划,第一个表即驱动表