leftjoin多表联合查询_SQL——第五关:多表查询

今天学习第五关--多表查询,本关分为4个部分:

  1. 表的加法
  2. 表的连结
  3. 连结应用
  4. case表达式

在日常业务中,我们不可能就在一个表里面获取数据,而是在多张表当中通过表与表之间的关系获取数据。那么就有下面的操作:

假设有两个表a和b,需要把他们合并到一个表当中时:

select 列名 from a

union <all>

select 列名 from b

加入all,则合并后的结果保留重复行。需要注意的是这里的列名必须相同,举个例子:

1487d764755aa01774a7e4a2426b90d5.png

3e9d91f61ec5a9b3f83ef33bb89aef8a.png

两张表分别为s和s1,执行如下语句后的结果:

ea5aa2b20af7bad40854425ff74b4fb4.png

但如果改变列名个数:

f275807801a3275c67f4ce373fe07e4e.png

则会提示错误,将s中的SNO换为SNO1

7546eb26ea4386fe5da9b9a7544543c6.png

则会用SNO1覆盖掉SNO,所以连接的时候如果列名个数一致但列名不同,则合并后的表按照第一个列名取值。

常见的连接有交叉连接,内连接,左连接,右连接,全连接

交叉连接:(cross join)通过笛卡尔积连接两张表的所有数据,

ca6bc89fb61dcaadb39bb8710edd18aa.png

c184ffffe4e0bf48132039e24af19359.png
执行以下语句后的结果:

006eaeab00a561a3b37051cf93f04788.png

内连接:(inner join)删除班级表里的学生c再执行如下语句:

SELECT * FROM `班级` inner join `成绩`

where 班级.`学生`=成绩.`学生`

c6340fcf5ddf8ff8377c361f75dd15bf.png

通过了字段(学生)得到他们的交集,这就是inner join。由于选取了两个表中的交集,为删除重复的学生,可修改查询语句如下:

SELECT 班级,班级.学生,成绩 FROM `班级`

inner join `成绩`

where 班级.`学生`=成绩.`学生`

e22147e200ee41eebba67f9bc37870b5.png

左连接:(left join)加入刚才被删除的学生c,删除成绩表中的学生c成绩:

2f1618a19d0a6af9ce8a0761fb445b25.png

0a3e123032e2ecd9b4a7f3ce4d6e5193.png

be88df293d401c5881caa410381b4a46.png

将得到(班级)表中的所有信息,对于未匹配到的学生c的成绩按照空值处理。

右连接(right join):

490b83de870188e103bcba6bf4f1f3e1.png

570ca985ed888fdde3427f6787235f67.png

2de3b607bad6f32ac75dc610e0b79e5a.png

将按照右表成绩匹配,匹配不到学生d的班级则按照空值处理。

全连接(full join):

490b83de870188e103bcba6bf4f1f3e1.png

570ca985ed888fdde3427f6787235f67.png

执行如下语句的结果:

8df0561637bb0d34eaf143b18282fe1c.png

经查询得知mysql不支持full join,改用left join 和right join 的union可达到同样效果。

db0d507e1862b2790400a0c96e6f097e.png

case表达式:类似于c语言中的if-else子句,注意末尾加上end表示结束

570ca985ed888fdde3427f6787235f67.png

554aae27fd972d7ebeabdc37bbb393df.png

求及格人数可按照如下方式:

dc807f0b690167b9765e42daeeb868a2.png

作业部分:

bda1fdcfdbb10dc532b2687367262a2d.png

742205c71b545a2844db78a14377fe35.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值