乐者为王

Do one thing, and do it well.

SQL连接总结

连接(join)可以在SELECT语句的FROM子句或WHERE子句中建立,在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。连接可以对同一个表操作,也可以对多个表操作,对同一个表操作的连接称为自连接(self join)。

连接类型(join type)分为三种:内连接、外连接和交叉连接。

  • 内连接(inner join):使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。
  • 外连接(outer join):与内连接不同的是外连接不只列出与连接条件相匹配的行,而且列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合条件的数据行。
  • 交叉连接(cross join):返回连接表中所有数据行的笛卡尔积。

内/外链接可以分为等值连接和不等连接:

  • 等值连接(equijoin):在连接条件中使用等于(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
  • 不等连接(non-equijoin):在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。

注意:自然连接(natural join)是一种特殊的等值连接。它使用选择列表指出查询结果中所包括的列,由此删除连接表中的重复列。

books数据表:

publishers数据表:

自连接查询:

1
SELECT * FROM books b1 [INNER] JOIN books b2 ON b1.price = b2.price

内连接(简称连接)查询:

1
SELECT * FROM books b [INNER] JOIN publishers p ON b.publisher_id = p.publisher_id

自然连接查询:

1
SELECT b.*, p.name FROM books b [INNER] JOIN publishers p ON b.publisher_id = p.publisher_id

左外连接(简称左连接)查询:

1
SELECT * FROM books b LEFT [OUTER] JOIN publishers p ON b.publisher_id = p.publisher_id

右外连接(简称右连接)查询:

1
SELECT * FROM books b RIGHT [OUTER] JOIN publishers p ON b.publisher_id = p.publisher_id

全外连接(简称全连接)查询:

1
SELECT * FROM books b FULL [OUTER] JOIN publishers p ON b.publisher_id = p.publisher_id

交叉连接查询:

1
SELECT * FROM books CROSS JOIN publishers

下图是由Moffatt在2008年制作的连接集合表示:

Comments