连接查询

连接查询

在设计表的时候,为了避免数据的冗余,我们往往会将数据分散到多个表中。因此,在我们查询数据的时候,需要连接多个表进行查询。

SQL92 和 SQL99 连表查询的语法有很大的不同。建议大家采用 SQL99 标准,因为它的层次性更强,可读性也更高。我们也以 SQL99 标准进行讲解。

连接查询大致可以分为 5 种,分别为:交叉连接,等值连接,非等值连接,外连接和自连接。接下来,我们就分别讲解下这 5 种连接方式。

交叉连接

交叉连接也叫笛卡尔乘积。那什么是笛卡尔乘积呢?wikipedia 对笛卡尔乘积的定义如下:

在数学中,两个集合 X \mathbf{X} X Y \mathbf{Y} Y笛卡儿积(英语:Cartesian product),又称直积,在集合论中表示为 X × Y \mathbf{X} \times \mathbf{Y} X×Y,是所有可能的有序对组成的集合,其中有序对的第一个对象是 X \mathbf{X} X 的成员,第二个对象是 Y \mathbf{Y} Y 的成员。

在 SQL99 种,我们可以通过 CROSS JOIN 获取多张表的笛卡尔乘积。

select * from player;
select * from team;
select * from player cross join team;

交叉连接只是获取所有数据的集合,其中大多数数据都是没意义的,所以我们还需要对数据进行筛选。交叉连接是所有其它连接的基础。

等值连接

等值连接就是对多张表中相同的字段进行等值判断。在 SQL99 中可以有多种方式表示等值连接。

自然连接

NATURAL JOIN 会自动帮你查询两张连接表中所有相同的字段,然后进行等值连接。

SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team;

USING 连接

当然我们还可以用 USING 来指定用哪些同名字段进行等值连接。

SELECT player_id, team_id, player_name, height, team_name FROM player JOIN team USING(team_id);

ON 连接

ON 表示我们想要连接的条件,我们也可以用 ON 来实现等值连接。

SELECT player_id, player.team_id, player_name, height, team_name FROM player JOIN team ON player.team_id = team.team_id;

非等值连接

连接两张表的条件如果是相等判断,那就是等值连接,否则就是非等值连接。

比如说:我们想查询每个球员的身高级别。

SELECT player_name, height, height_level
FROM player JOIN height_grades AS h
ON player.height BETWEEN h.height_lowest AND h.height_highest;

外连接

外连接除了查询满足条件的记录以外,还可以查询某一方不满足条件的记录。两张表做外连接,会有一张表是主表,另一张表是从表。

左外连接

左外连接,就是左边的表是主表,需要显示左边表的全部行。右边表是从表,只显示满足条件的行。关键字为 LEFT OUTER JOIN

select girls.gid, gname, bname 
from girls left join boys
on girls.bid = boys.bid;

右外连接

右外连接,就是右边的表是主表,需要显示右边表的全部行。左边表是从表,只显示满足条件的行。关键字为 RIGHT OUTER JOIN

select boys.bid, bname, gname
from girls right join boys
using (gid);

全外连接

两张表都是主表,都需要显示全部行。但是MySQL不支持全外连接。关键字为 FULL OUTER JOIN

自连接

我们可以连接不同的表,也可以对同一张表进行连接,这样的连接我们称之为自连接

比如我们想要查看比布雷克·格里芬高的球员都有谁?


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

联合查询

我们可以用 UNION 关键字,将多个结果集合并成一个结果集,这样的查询我们叫联合查询。

应用场景:
要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时。

注意事项:
a. 列数一致
b. 对应的数据最好一致
c. UNION会去重, UNION ALL不会去重

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务