mysql之多表查询,子查询

多表连接查询

连接类型
连接(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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值