内容:
1. 了解常用的SQL标准. SQL存在不同的标准, 不同标准下的连接定义不同.
2. SQL92 标准
3. 跨表连接
常见的SQL标准
SQL92:
形式简单, 语句较长, 可读性较差.
笛卡尔积
所有可能组合.
假定 player 表的数据是集合X, SELECT * FROM player
假定 team 表的数据是集合Y, SELECT * FROM team
SELECT * FROM player, team
等值连接
用两张表中都存在的列进行连接
SELECT player_id, player.team_id, player_name, height, team_name FROM player, team
WHERE player.team_id = team.team_id;
非等值连接
除等号的其他运算符连接就是非等值查询
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;
外连接(左连接, 外连接)
可以查询某一方不满足条件的记录. 如果是多张表的外连接, 那么第一张表是主表, 即显示全部的行, 剩下的表显示对应连接的信息. SQL92中采用(+)代表从表所在位置.
左连接就是指左边的表为主表
SELECT * FROM player, team WHERE player.team_id = team.team_id(+);
在SQL99中:
SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id;
右连接:
SELECT * FROM player, team WHERE player.team_id(+) = team.team_id;
在SQL99中:
SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id;
自连接
可以对多个表进行操作, 也可以对同一个表进行操作.
SELECT b.player_name, b.height FROM player a, player b
WHERE a.player_name = '布雷克-格里芬' AND b.height > a.height;
SQL99:
语法更为复杂, 可读性强
交叉连接 cross join
select * from player cross join team;
select * from t1 cross join t2 cross join t3;
自然连接 natural join
SELECT player_id, team_id, player_name, height, team_name
FROM player NATURAL JOIN team;
ON 连接
SELECT player_id, team_id, player_name, height, team_name
FROM player JOIN team ON player.team_id = team.team_id; ## 等值连接
SELECT p.player_name, p.height, h.height_level
FROM player as p JOIN height_grades as h
ON height BETWEEN h.height_lowest AND h.height_highest; ## 非等值连接
USING 连接
制定数据表里同名字段进行等值连接, 指定了具体的相同的字段名称
SELECT player_id, team_id, player_name, height, team_name
FROM player JOIN team USING(team_id);
外连接
左外连接 left join
右外连接 right join
全外连接 full join
SQL99 和SQL92的区别
SQL92查询中, 把所有需要连接的表放在FROM后, 在WHERE中写明连接的条件.
SQL99更灵活, 不需要一次性把所有需要连接的表放在from后, 而是采用JOIN方式, 每次连接一张表, 可以多次使用join进行连接.
建议多表连接使用SQL99标准, 可读性强.
SELECT ...
FROM table1
JOIN table2 ON table1 和 table2 的连接条件
JOIN table3 ON table2 和 table3 的连接条件
连接的性能问题:
1. 控制连接表的数量
2. 在连接时不要忘记 WHERE 语句
3. 使用自连接而不是子查询
极客: SQL必知必会10,11整理