![7285080d994397b5923f9ab67d94006b.png](https://img-blog.csdnimg.cn/img_convert/7285080d994397b5923f9ab67d94006b.png)
文章结构:
- 表的加法
- 表的联结
- 表的联结案例
- case表达式
- sqlzoo练习题
表的加法【union|并集】:表的加法是指将表的数据按行合并在一起(要求两张表的数据结构一致),是按行进行添加数据。
关键字:union all可以将两个表的重复的数据也保存起来。
案例:合并下面两张表
![2643bf3c52ac0e6903ce9fcd4592d2a2.png](https://img-blog.csdnimg.cn/img_convert/2643bf3c52ac0e6903ce9fcd4592d2a2.png)
![1deb20596df4b9729a916b74d3ddbf21.png](https://img-blog.csdnimg.cn/img_convert/1deb20596df4b9729a916b74d3ddbf21.png)
SELECT
![880ff0498ac2dc89810960b59b82f845.png](https://img-blog.csdnimg.cn/img_convert/880ff0498ac2dc89810960b59b82f845.png)
表的联结:表的联结是指通过表和表之间的关系,将两个表合并在一起的操作,联结(JOIN)运算,简单来说,就是将其他表中的列添加过来,进行“添加列”的运算,是按列进行数据的添加。
![6292866e405f9048b4ba2d41204ac4b8.png](https://img-blog.csdnimg.cn/img_convert/6292866e405f9048b4ba2d41204ac4b8.png)
①交叉联结【cross join 笛卡尔积】:其他联结都是建立在笛卡尔积的基础上的
![35416fea3b96c4a741410f67e5731acc.png](https://img-blog.csdnimg.cn/img_convert/35416fea3b96c4a741410f67e5731acc.png)
②内联结【inner join】【只查询都存在于两张表中的数据,内联结会将各张表中符合条件的行记录都取出来】
![d3a4365839f69b684fc79f60cc4dc5c7.png](https://img-blog.csdnimg.cn/img_convert/d3a4365839f69b684fc79f60cc4dc5c7.png)
![d7f52517b2c102325e7db62b5a459069.png](https://img-blog.csdnimg.cn/img_convert/d7f52517b2c102325e7db62b5a459069.png)
![c6bbcaa8bc1046cdbc340f9ba3401ca5.png](https://img-blog.csdnimg.cn/img_convert/c6bbcaa8bc1046cdbc340f9ba3401ca5.png)
sql对表的所有操作都是基于行的!
![72c031c28db5fff123f2f82e7fedb6a9.png](https://img-blog.csdnimg.cn/img_convert/72c031c28db5fff123f2f82e7fedb6a9.png)
ON 之后指定两张表联结所使用的列(联结键),ON 是专门用来指定联结条件的,它能起到与 WHERE 相同的作用。需要指定多个键时,同样可以使用 AND、 OR。在进行内联结时ON 子句是必不可少的,并且 ON 必须书写在 FROM 和 WHERE 之间。
操作实例:
![d034cfbc6000e48faf2db47ab18b092b.png](https://img-blog.csdnimg.cn/img_convert/d034cfbc6000e48faf2db47ab18b092b.png)
![88f1aff209eafa076750291c10766bd6.png](https://img-blog.csdnimg.cn/img_convert/88f1aff209eafa076750291c10766bd6.png)
③左联结【left join】:左联结会将left join关键字左侧表作为主表,并且将左侧的表的数据全部读取出来。
![dc1813a0e706e5d9e03a7cf20eba03b6.png](https://img-blog.csdnimg.cn/img_convert/dc1813a0e706e5d9e03a7cf20eba03b6.png)
![b6341fd2bdd03b65d4adf179e1f57646.png](https://img-blog.csdnimg.cn/img_convert/b6341fd2bdd03b65d4adf179e1f57646.png)
![35a0524127eefd6ee768f5b604da5c4b.png](https://img-blog.csdnimg.cn/img_convert/35a0524127eefd6ee768f5b604da5c4b.png)
![aa27441189aa4e06669ab182ad381ad5.png](https://img-blog.csdnimg.cn/img_convert/aa27441189aa4e06669ab182ad381ad5.png)
![c8a436ffed6a3cdbf8cefc5680bd797d.png](https://img-blog.csdnimg.cn/img_convert/c8a436ffed6a3cdbf8cefc5680bd797d.png)
实例操作:
![fa0c9af5192b93d968f3f6fc43d455aa.png](https://img-blog.csdnimg.cn/img_convert/fa0c9af5192b93d968f3f6fc43d455aa.png)
![5942242e591b3ac9723a48a5a959cd84.png](https://img-blog.csdnimg.cn/img_convert/5942242e591b3ac9723a48a5a959cd84.png)
![4f7dab0054191879a61ffc93bd54f278.png](https://img-blog.csdnimg.cn/img_convert/4f7dab0054191879a61ffc93bd54f278.png)
④右联结【right join】:右联结会将right join关键字右侧表作为主表,并且将右侧的表的数据全部读取出来。
![a17793eeb655536a79ac95e646fec39c.png](https://img-blog.csdnimg.cn/img_convert/a17793eeb655536a79ac95e646fec39c.png)
![9b93a646c06ac2684eb939e7187574cf.png](https://img-blog.csdnimg.cn/img_convert/9b93a646c06ac2684eb939e7187574cf.png)
![ea0754c58fc070f8b22e77c072dc697c.png](https://img-blog.csdnimg.cn/img_convert/ea0754c58fc070f8b22e77c072dc697c.png)
![4176f596a40fa682bdaf2494f7d41cce.png](https://img-blog.csdnimg.cn/img_convert/4176f596a40fa682bdaf2494f7d41cce.png)
![e22ec8de8ddb4195b6c71b6252077527.png](https://img-blog.csdnimg.cn/img_convert/e22ec8de8ddb4195b6c71b6252077527.png)
左右联结如何选择?
右联结和左联结本质上是相同的,只是指定的主表会有所差别,究竟是左联结还是右联结应该根据实际需求来决定,作为主表,需要做到的是,要覆盖所有查询主体【什么是查询主体,比如,我们要查询所有学生的身高,体重,.......,这个里面的主体就是学生】如果各表覆盖的主体个数没有差异,左右联结和内联结没有区别。
⑤全联结【full join】查询结果返回左表和右表中的所有行,如果某行和另一个表中的行匹配的时候,则进行交叉联结,如果某一行和另一个表中的行没有匹配地方的时候,另一表对应的值用空值填充。【mysql不支持全联结】
![6a94d5709454839ca6f469a2869dd15d.png](https://img-blog.csdnimg.cn/img_convert/6a94d5709454839ca6f469a2869dd15d.png)
各种联结应用场景的汇总:
内联结:获取两个表的公共部分
外联结-左联结/右联结:生成固定行数的表单,或者申明说要哪个表的全部数据的时候。
![5d757caac709e1cb18aaff5495b0ee01.png](https://img-blog.csdnimg.cn/img_convert/5d757caac709e1cb18aaff5495b0ee01.png)
联结应用案例:
练习1:查询所有学生的学号,姓名,选课数,总成绩
![eb61c398426e7b0c4c26700c85e44793.png](https://img-blog.csdnimg.cn/img_convert/eb61c398426e7b0c4c26700c85e44793.png)
练习2:查询平均成绩大于60分的所有学生的学号 ,姓名和平均成绩
![8bd0379efa584f0e643393e02f82dad2.png](https://img-blog.csdnimg.cn/img_convert/8bd0379efa584f0e643393e02f82dad2.png)
练习3:查询[所有]学生的选课情况【没选课的也需要显示】:学号,姓名,课程号,课程名称,授课老师。
![51783ce5d65a5b7d745fc200e7df08b2.png](https://img-blog.csdnimg.cn/img_convert/51783ce5d65a5b7d745fc200e7df08b2.png)
咋一看只需要学生表和课程表,教师表就能解决问题,但是分析发现,学生表和课程表之间并没有直接关系,是通过成绩表作为桥梁来产生关系的,所以,该题涉及了四张表,因为题目需求是查询是所有学生的相关选课信息,主体是学生,所以,student表应该成为第一个主表,以student表为主表组成的新表,也应该成为后续联结的主表,所以全部采用左联结。
![87aff296997b8b8ff654dbc1c5904d2d.png](https://img-blog.csdnimg.cn/img_convert/87aff296997b8b8ff654dbc1c5904d2d.png)
如果采用右联结,则王同学选课记录会被忽略,所以左右联结有别,需要根据题目进行选择,如下图:
![b2c7222941ddff2b792ba6d6e57d5e68.png](https://img-blog.csdnimg.cn/img_convert/b2c7222941ddff2b792ba6d6e57d5e68.png)
CASE表达式
CASE
案例1:查询成绩表中对及格和不及格分数做出区分。
![3d1a99c0f8d34a9f1373074a3a4fd10f.png](https://img-blog.csdnimg.cn/img_convert/3d1a99c0f8d34a9f1373074a3a4fd10f.png)
案例2:查询每门课程中,及格人数和不及格人数。
![6c445cd2cdc698dff599fef4088c3770.png](https://img-blog.csdnimg.cn/img_convert/6c445cd2cdc698dff599fef4088c3770.png)
![ac6d1c3050882370c04fd76fb27c1165.png](https://img-blog.csdnimg.cn/img_convert/ac6d1c3050882370c04fd76fb27c1165.png)
![a679619981c5f854a75c30a6736125b4.png](https://img-blog.csdnimg.cn/img_convert/a679619981c5f854a75c30a6736125b4.png)
案例3:使用分段[100-85],(85-70],(70,60],(60,-]来统计各科成绩,分别统计:各分数段的人数,课程号,和课程名称。
可以先看一下联结后的查询结果:
![ea5d2d8b46c70c0d4e799d554d04af06.png](https://img-blog.csdnimg.cn/img_convert/ea5d2d8b46c70c0d4e799d554d04af06.png)
加入自定义分组条件后的查询结果:
![d614984ec2bcf3659b388615ff7ece3d.png](https://img-blog.csdnimg.cn/img_convert/d614984ec2bcf3659b388615ff7ece3d.png)
CASE语句特点总结:①使用场景多涉及自定义分组,②在case语句分组后,常常会形成新的列。③CASE分成0/1两组的时候,多配合聚合函数一起使用。④CASE是基于行来操作的。
sqlzoo:
![961313cf3a657c9958fe49a0ea1b91a4.png](https://img-blog.csdnimg.cn/img_convert/961313cf3a657c9958fe49a0ea1b91a4.png)
![467b7a7e264545a60608c24f309c9b6a.png](https://img-blog.csdnimg.cn/img_convert/467b7a7e264545a60608c24f309c9b6a.png)
![dc3031666f3706d75afd2848ef9e1bfb.png](https://img-blog.csdnimg.cn/img_convert/dc3031666f3706d75afd2848ef9e1bfb.png)
![cd85bf4b17a2d407bbf90f8132abbf2c.png](https://img-blog.csdnimg.cn/img_convert/cd85bf4b17a2d407bbf90f8132abbf2c.png)
![f65cfa7949b39fec464954b2d22a53e6.png](https://img-blog.csdnimg.cn/img_convert/f65cfa7949b39fec464954b2d22a53e6.png)
![a42e04523e84f1ecbf25fb9e4a08df12.png](https://img-blog.csdnimg.cn/img_convert/a42e04523e84f1ecbf25fb9e4a08df12.png)
![b9a62c9990a9cdf5a84d26e7cde0f1ae.png](https://img-blog.csdnimg.cn/img_convert/b9a62c9990a9cdf5a84d26e7cde0f1ae.png)
![eb0f8a2125fed2c4fa5408b84018d3ce.png](https://img-blog.csdnimg.cn/img_convert/eb0f8a2125fed2c4fa5408b84018d3ce.png)
![7db3afa45a90e0522ba4186465bd5c30.png](https://img-blog.csdnimg.cn/img_convert/7db3afa45a90e0522ba4186465bd5c30.png)
![0ac51c1d06d0e41c8dc115cd601a735e.png](https://img-blog.csdnimg.cn/img_convert/0ac51c1d06d0e41c8dc115cd601a735e.png)
![1e1dcff9703823b90d01b6ac3cc3854e.png](https://img-blog.csdnimg.cn/img_convert/1e1dcff9703823b90d01b6ac3cc3854e.png)
错误原因:
![1d3d414166e95c2635e01da403bee1fa.png](https://img-blog.csdnimg.cn/img_convert/1d3d414166e95c2635e01da403bee1fa.png)
![65c2b2ee07f5f4cc33813a84b7fe5bf2.png](https://img-blog.csdnimg.cn/img_convert/65c2b2ee07f5f4cc33813a84b7fe5bf2.png)
正确示例【若想不分组,则可以把count函数去掉,但是不符合题目需要】:
![6a1eec6b8c7d4c01f68b6d081497639e.png](https://img-blog.csdnimg.cn/img_convert/6a1eec6b8c7d4c01f68b6d081497639e.png)
![2f86314eeaecbcbd25b5f390363edef2.png](https://img-blog.csdnimg.cn/img_convert/2f86314eeaecbcbd25b5f390363edef2.png)
![47b73ffe260c2858018334d2d55a2dbf.png](https://img-blog.csdnimg.cn/img_convert/47b73ffe260c2858018334d2d55a2dbf.png)
若13题采用右联结,则没有进球的球队会被漏掉,而题目是要统计所有球队的相关信息,所以统计的主体是球队,应该把包含所有球队信息的game表作为主表,goal表只是统计了进球的球队,并不是每个球队都能进球,比如国......。
![03befb0ef34694a5dc9df594775c9708.png](https://img-blog.csdnimg.cn/img_convert/03befb0ef34694a5dc9df594775c9708.png)