连接 是关系型数据库的核心之一,它可以用一条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.查询的时候多使用自连接而不是子查询,自连接的效率要大于子查询
网友评论