多表连接查询
连接类型
连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程叫做连接。
根据查询返回的结果,连接可以分为3大类:
内连接(inner join)
外连接(outer join)
交叉连接(cross join)
根据连接条件所使用的操作符,又可分为:
相等连接(使用等号操作符)
不等连接(不使用等号操作符)
内连接(inner join)
只返回两张表中所有满足连接条件的行
使用NATURAL JOIN子句(不推荐使用)
NATURAL JOIN子句自动到两张表中查找所有同名同类型的列拿来做连接列,进行相等连接,去除重复列。
例1: 对于出生在1920年6月30日之后并且至少有一次罚款的球员,得到编号、名字和罚款
SELECT p.playerno, p.name, pen.amount
FROM players p
NATURAL JOIN penalties pen
WHERE birth_date > ‘1920-06-30’;
连接列是playerno,并且在select子句只能出现一个连接列
使用using子句(不推荐使用)
例2:
SELECT *
FROM penalties
JOIN teams
USING (playerno);
可见,连接列在结果集中只出现一次
使用ON子句
重复的列显示两次
例3: 查询每个球队的编号以及队长的名字
SELECT t.teamno, p.name
FROM teams t
JOIN players p
ON t.playerno = p.playerno;
注意:
对于join where=and
对于left join中 where对前面执行的结果进行过滤,或者说后执行where
And 先用and条件去过滤left join前的表,然后执行其他的
传统的连接写法
在FROM子句中列出所有要连接的表的名字,以逗号分隔。连接条件写在WHERE子句中
例4: 对于每笔罚款,找出罚款编号,金额以及引起罚款的球员编号和姓名
SELECT paymentno, pen.playerno, amount,NAME
FROM penalties pen, players p
WHERE pen.playerno = p.playerno;
注意:一旦给表定义了别名,那么原始的表名就不能在出现在该语句的其它子句中了
3表连接查询
例5: 查询每场比赛的编号、球员编号、球队编号、球员的名字以及球队的分级
SELECT m.matchno, m.playerno, m.teamno, p.name, t.division
FROM matches m, players p, teams t
WHERE m.playerno = p.playerno
AND m.teamno = t.teamno;
左外连接
除了返回两张表中所有满足连接条件的行之外,还要返回左表中所有不满足连接条件的行。所谓左表,就是写在LEFT J