今天学习第五关--多表查询,本关分为4个部分:
- 表的加法
- 表的连结
- 连结应用
- case表达式
在日常业务中,我们不可能就在一个表里面获取数据,而是在多张表当中通过表与表之间的关系获取数据。那么就有下面的操作:
假设有两个表a和b,需要把他们合并到一个表当中时:
select 列名 from a
union <all>
select 列名 from b
加入all,则合并后的结果保留重复行。需要注意的是这里的列名必须相同,举个例子:
![1487d764755aa01774a7e4a2426b90d5.png](https://img-blog.csdnimg.cn/img_convert/1487d764755aa01774a7e4a2426b90d5.png)
![3e9d91f61ec5a9b3f83ef33bb89aef8a.png](https://img-blog.csdnimg.cn/img_convert/3e9d91f61ec5a9b3f83ef33bb89aef8a.png)
两张表分别为s和s1,执行如下语句后的结果:
![ea5aa2b20af7bad40854425ff74b4fb4.png](https://img-blog.csdnimg.cn/img_convert/ea5aa2b20af7bad40854425ff74b4fb4.png)
但如果改变列名个数:
![f275807801a3275c67f4ce373fe07e4e.png](https://img-blog.csdnimg.cn/img_convert/f275807801a3275c67f4ce373fe07e4e.png)
则会提示错误,将s中的SNO换为SNO1
![7546eb26ea4386fe5da9b9a7544543c6.png](https://img-blog.csdnimg.cn/img_convert/7546eb26ea4386fe5da9b9a7544543c6.png)
则会用SNO1覆盖掉SNO,所以连接的时候如果列名个数一致但列名不同,则合并后的表按照第一个列名取值。
常见的连接有交叉连接,内连接,左连接,右连接,全连接
交叉连接:(cross join)通过笛卡尔积连接两张表的所有数据,
![ca6bc89fb61dcaadb39bb8710edd18aa.png](https://img-blog.csdnimg.cn/img_convert/ca6bc89fb61dcaadb39bb8710edd18aa.png)
![c184ffffe4e0bf48132039e24af19359.png](https://img-blog.csdnimg.cn/img_convert/c184ffffe4e0bf48132039e24af19359.png)
![006eaeab00a561a3b37051cf93f04788.png](https://img-blog.csdnimg.cn/img_convert/006eaeab00a561a3b37051cf93f04788.png)
内连接:(inner join)删除班级表里的学生c再执行如下语句:
SELECT * FROM `班级` inner join `成绩`
where 班级.`学生`=成绩.`学生`
![c6340fcf5ddf8ff8377c361f75dd15bf.png](https://img-blog.csdnimg.cn/img_convert/c6340fcf5ddf8ff8377c361f75dd15bf.png)
通过了字段(学生)得到他们的交集,这就是inner join。由于选取了两个表中的交集,为删除重复的学生,可修改查询语句如下:
SELECT 班级,班级.学生,成绩 FROM `班级`
inner join `成绩`
where 班级.`学生`=成绩.`学生`
![e22147e200ee41eebba67f9bc37870b5.png](https://img-blog.csdnimg.cn/img_convert/e22147e200ee41eebba67f9bc37870b5.png)
左连接:(left join)加入刚才被删除的学生c,删除成绩表中的学生c成绩:
![2f1618a19d0a6af9ce8a0761fb445b25.png](https://img-blog.csdnimg.cn/img_convert/2f1618a19d0a6af9ce8a0761fb445b25.png)
![0a3e123032e2ecd9b4a7f3ce4d6e5193.png](https://img-blog.csdnimg.cn/img_convert/0a3e123032e2ecd9b4a7f3ce4d6e5193.png)
![be88df293d401c5881caa410381b4a46.png](https://img-blog.csdnimg.cn/img_convert/be88df293d401c5881caa410381b4a46.png)
将得到(班级)表中的所有信息,对于未匹配到的学生c的成绩按照空值处理。
右连接(right join):
![490b83de870188e103bcba6bf4f1f3e1.png](https://img-blog.csdnimg.cn/img_convert/490b83de870188e103bcba6bf4f1f3e1.png)
![570ca985ed888fdde3427f6787235f67.png](https://img-blog.csdnimg.cn/img_convert/570ca985ed888fdde3427f6787235f67.png)
![2de3b607bad6f32ac75dc610e0b79e5a.png](https://img-blog.csdnimg.cn/img_convert/2de3b607bad6f32ac75dc610e0b79e5a.png)
将按照右表成绩匹配,匹配不到学生d的班级则按照空值处理。
全连接(full join):
![490b83de870188e103bcba6bf4f1f3e1.png](https://img-blog.csdnimg.cn/img_convert/490b83de870188e103bcba6bf4f1f3e1.png)
![570ca985ed888fdde3427f6787235f67.png](https://img-blog.csdnimg.cn/img_convert/570ca985ed888fdde3427f6787235f67.png)
执行如下语句的结果:
![8df0561637bb0d34eaf143b18282fe1c.png](https://img-blog.csdnimg.cn/img_convert/8df0561637bb0d34eaf143b18282fe1c.png)
经查询得知mysql不支持full join,改用left join 和right join 的union可达到同样效果。
![db0d507e1862b2790400a0c96e6f097e.png](https://img-blog.csdnimg.cn/img_convert/db0d507e1862b2790400a0c96e6f097e.png)
case表达式:类似于c语言中的if-else子句,注意末尾加上end表示结束
![570ca985ed888fdde3427f6787235f67.png](https://img-blog.csdnimg.cn/img_convert/570ca985ed888fdde3427f6787235f67.png)
![554aae27fd972d7ebeabdc37bbb393df.png](https://img-blog.csdnimg.cn/img_convert/554aae27fd972d7ebeabdc37bbb393df.png)
求及格人数可按照如下方式:
![dc807f0b690167b9765e42daeeb868a2.png](https://img-blog.csdnimg.cn/img_convert/dc807f0b690167b9765e42daeeb868a2.png)
作业部分:
![bda1fdcfdbb10dc532b2687367262a2d.png](https://img-blog.csdnimg.cn/img_convert/bda1fdcfdbb10dc532b2687367262a2d.png)
![742205c71b545a2844db78a14377fe35.png](https://img-blog.csdnimg.cn/img_convert/742205c71b545a2844db78a14377fe35.png)
![40efc7c8974c6d78ccac52725d6f9dd8.png](https://img-blog.csdnimg.cn/img_convert/40efc7c8974c6d78ccac52725d6f9dd8.png)