7.连接

作者: LucXion | 来源:发表于2023-04-23 23:07 被阅读0次

连接 是关系型数据库的核心之一,它可以用一条SQL语句在多个表之间进行查询。
连接的 五种方式:笛卡尔积、外连接(左右连接)、内连接、等值连接、非等值连接。

笛卡尔积(无条件)、等值连接(=、==)、非等值连接(其他比较符)
// 输出两张表中的所有行的两两组合,player中有37行,team有3行,输出结果111行 = 37 * 3
SELECT * FROM player,team;

// 等值连接,加入where判断,通过两张表中相同的列进行连接,结果输出37行,但team_id会重复出现,其中一个team_id会自动加上标签(1)区分,如果只需要输出一个team_id,那就加上表名
SELECT player_name,team.team_id,team_name FROM player,team WHERE player.team_id == team.team_id

// 除了=等值连接,其他的where判断条件都属于非等值连接
SELECT p.player_name, p.height, h.height_level FROM player AS p, height_grades AS h WHERE p.height BETWEEN h.height_lowest AND h.height_highest

等值连接、非等值连接是查询满足条件的连接。连接与子查询的区别就在于,子查询只能将子表的信息作为判断条件,并不能输出信息。

外连接

上面说到等值连接、非等值连接是查询满足条件的连接,那么外连接查询的就是某一方不满足条件的记录。
外连接需要区分主表,从表。主表会显示全部行。

// 以左表为主表的是左连接,SQLite只支持左连接,不支持右连接和全连接
SELECT * FROM player LEFT JOIN team on player.team_id = team.team_id;

当team表中没有10002这个team_id的时候,就能看出外连接与等值连接的区别了,如果是等值连接,只会输出10001的队员,如果是外连接,那么主表中的所有队员都会输出,没有team_id的列就为null

自连接:

查询条件使用了当前表内的值,以变量的形式

SELECT a.player_name,a.height FROM player AS a,player AS b WHERE b.player_name = '韦恩-艾灵顿' AND a.height > b.height 

当然,使用子查询也是可以做到的,但看起来就不是那么简洁

SELECT player_name,height FROM player WHERE height > (SELECT height FROM player WHERE player_name = '韦恩-艾灵顿')
SQL99标准使用关键字来明确连接的方式:

笛卡尔积 (CROSS JOIN ),交叉连接:

// team中有三行,height_grades中有4行,所以player中每有一行就输出 3* 4 = 12条数据
SELECT * FROM player CROSS JOIN team CROSS JOIN height_grades

自然连接(NATURAL JOIN ):相当于等值连接 where team.team_id == player.team_id

SELECT player_id,player_name,team_name FROM player NATURAL JOIN team

ON 连接:可以指定我们想要的条件,等值连接、非等值连接、自连接

// 等值连接
SELECT player_id,player_name,team_name FROM player AS p JOIN team AS t ON p.team_id = t.team_id
// 非等值连接
SELECT player_name,height_level FROM player AS p JOIN height_grades AS h ON p.height BETWEEN h.height_lowest AND height_highest 
// 自连接
SELECT b.player_name, b.height FROM player as a JOIN player as b ON a.player_name = '布雷克-格里芬' and a.height < b.height

USING 连接:team_id相当于等值连接的条件,比nature明确,比on简洁

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

总结:连接是关系型数据库的核心之一,它支持多表查询,在SQL99标准中,有许多关键字可以使连接更明确,比如(CROSS JOIN、NATURE JOIN、ON、USING)。
使用过程中需要注意的几个点:
1.通过JOIN可以支持嵌套连接。但这十分的消耗性能,使用的时候一定要注意控制连接表的数量。
2.多表连接不要忘记使用过滤条件,因为我们很少需要直接使用到笛卡尔积。
3.查询的时候多使用自连接而不是子查询,自连接的效率要大于子查询

相关文章

网友评论

      本文标题:7.连接

      本文链接:https://www.haomeiwen.com/subject/ccbyjdtx.html