正是因为在数据库中,表的组成是基于关系模型的,所以一个表就是一个关系。一个数据库中可以包括多个表,也就是存在多种数据之间的关系。而我们之所以能使用 SQL 语言对各个数据表进行复杂查询,核心就在于连接,它可以用一条 SELECT 语句在多张表之间进行查询。你也可以理解为,关系型数据库的核心之一就是连接

常用的 SQL 标准有哪些

不同规范下的表连接操作是有区别的。

  • SQL92 的形式更简单,但是写的 SQL 语句会比较长,可读性较差。
  • SQL99 相比于 SQL92 来说,语法更加复杂,但可读性更强。

在 SQL92 中是如何使用连接的

SQL92 中的 5 种连接方式:

  1. 笛卡尔积
  2. 等值连接
  3. 非等值连接
  4. 外连接(左连接、右连接)
  5. 自连接

笛卡尔积

笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。

  • 也叫 CROSS JOIN, 交叉连接
  1. SELECT * FROM player, team

等值连接

两张表的等值连接就是用两张表中都存在的列进行连接。我们也可以对多张表进行等值连接。

  • 笛卡尔 + WHERE
  1. SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id

非等值连接

当我们进行多表查询的时候,如果连接多个表的条件是等号时,就是等值连接,其他的运算符连接就是非等值查询。

  • 笛卡尔 + WHERE
  1. SELECT p.player_name, p.height, h.height_level
  2. FROM player AS p, height_grades AS h
  3. WHERE p.height BETWEEN h.height_lowest AND h.height_highest

外连接

除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。两张表的外连接,会有一张是主表,另一张是从表。如果是多张表的外连接,那么第一张表是主表,即显示全部的行,而第剩下的表则显示对应连接的信息。在 SQL92 中采用(+)代表从表所在的位置,而且在 SQL92 中,只有左外连接和右外连接,没有全外连接。

  • 等值/非等值 + 左/右


左外连接

左外连接,就是指左边的表是主表,需要显示左边表的全部行,而右侧的表是从表,(+)表示哪个是从表。

  1. SELECT * FROM player, team where player.team_id = team.team_id(+)

相当于 SQL99 中的:

  1. SELECT * FROM player LEFT JOIN team on player.team_id = team.team_id

image.png

右外连接

右外连接,指的就是右边的表是主表,需要显示右边表的全部行,而左侧的表是从表。

  1. SELECT * FROM player, team where player.team_id(+) = team.team_id

相当于 SQL99 中的:

  1. SELECT * FROM player RIGHT JOIN team on player.team_id = team.team_id

image.png

自连接

自连接可以对多个表进行操作,也可以对同一个表进行操作。也就是说查询条件使用了当前表的字段。

  • 自己与自己进行等值/非等值连接

比如我们想要查看比布雷克·格里芬高的球员都有谁,以及他们的对应身高:

  1. SELECT b.player_name, b.height FROM player as a , player as b WHERE a.player_name = '布雷克-格里芬' and a.height < b.height

采用两次 SQL 查询的方式:

  1. # 1.
  2. SELECT height FROM player WHERE player_name = '布雷克-格里芬'
  3. # 结果: 2.08
  4. # 2.
  5. SELECT player_name, height FROM player WHERE height > 2.08

总结

  • SQL92 和 SQL99 是经典的 SQL 标准,也分别叫做 SQL-2 和 SQL-3 标准。
  • 现如今 SQL 已经不仅仅是数据库领域的主流语言,还是信息领域中信息处理的主流语言。在图形检索、图像检索以及语音检索中都能看到 SQL 语言的使用。
  • Oracle 对 SQL92 支持较好,而 MySQL 则不支持 SQL92 的外连接。

image.png

精选留言

一步

有两个问题:
1: 在进行连接查询的时候,查询的顺序是什么呢? 是先进行笛卡尔积在进行条件条件筛选吗?
2: 在进行连接查询的时候 on 中的条件和 where 中的条件有什么区别呢? 这两个的筛选顺序一样吗?

作者回复: 1、查询顺序是:FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT 可以看下05篇后面的内容。 你说的正确,是先进行 CROSS JOIN 求笛卡尔积,然后进行条件筛选。 2、执行的顺序会先进行ON连接,然后进行WHERE筛选。ON连接是一般连接表的方式,当我们得到数据之后,再会对数据行进行条件筛选

ack

练习:
1.①内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接。自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。要求是两个这两个关系中参与比较的属性列必须是同名、同属性。
②外连接有三种方式:左连接,右连接和全连接。
③自连接,连接的两个表都是同一个表
2.SELECT * FROM team a,team b WHERE a.team_id < b.team_id;

参考