- 表的加法 Union
![42c891f8509c491e39ab64ea5dd51aaa.png](https://i-blog.csdnimg.cn/blog_migrate/365fd39f815c0110c67490223217384e.png)
加法会把表当中重复的值删掉
如果想要保留重复的行,用union all, 这样重复的行就会原封不动地出现,如下图:
![3c637aa32561e14a5bf100a49e472269.png](https://i-blog.csdnimg.cn/blog_migrate/8577fb98bedb53245636315d5daece52.png)
2. 表的联结 Join
关系数据库里,各个表之间都是有关系的
比如学生表和成绩表是由 ‘学号’联结起来的
![77dfaf1475656ffd43f21af7377a4343.png](https://i-blog.csdnimg.cn/blog_migrate/ee5f0239dbbd17f854678289ae2a1546.jpeg)
2.1 常用的联结
2.2.1交叉联结 cross join
A表的所有行和B表的所有行分别联结在一起
2.2.2 内联结 inner join
查找出同时存在于两张表的数据
![a815bd5937e16d5b347c447602d61859.png](https://i-blog.csdnimg.cn/blog_migrate/453b74795006e0efbd6a28f914c8c0fd.png)
- 取出同时存在于两张表元素的所在行
- 然后进行交叉联结
- 输出的表里有两张表的所有列的信息
可想而知,整张表是很庞大的
2.2.3 左联结 left join
以左边的表为中心
从右边的表中,选出和左边表中cue一样的行
![edb0f2b8a8177ece58a09de1825c7ff9.png](https://i-blog.csdnimg.cn/blog_migrate/b66377764a2b9d6da1eb23f566813441.jpeg)
如图所示,cue数量不一样的话,通过复制行来填满;
如果只想要获得Student(左边表格)当中独特的那一行,即学号为0004的那一行,加上Null就可以了;
![b6fbd84cd93cba714f308a64d00410a5.png](https://i-blog.csdnimg.cn/blog_migrate/6da2fbad3b39a4e47a5e86b9a1bcf610.jpeg)
2.2.4 右联结 right join
和左联结类似,以右边表为中心。
2.2.5 全联结
Mysql里面没有全联结
2.3 运行顺序
![0778d754dcec96928484a7111c0605b8.png](https://i-blog.csdnimg.cn/blog_migrate/d65fa8a493308bed12c910c1dc8f0140.jpeg)
联结是放在from子句后面,并不影响整体的运行顺序;
3. 联结应用案例
案例1:查询所有学生的学号、姓名、选课数、总成绩
![bd6dda071088aef2d67d9c9d6146ff3d.png](https://i-blog.csdnimg.cn/blog_migrate/54f603563ddf9b5e5ad1f015ec7b5bdf.jpeg)
要注意的是既然现在每张表都给了代号,而且是联结在一起看,在提及每一个列名/参数的时候都需要加上a/b表示来源,否则sql就会报错;
案例2: 查询出平均成绩大于85的所有学生的学号、姓名和平均成绩
![055883a903d6866319ed428df1996912.png](https://i-blog.csdnimg.cn/blog_migrate/15d815e7699ef62a5bfde035220387d6.jpeg)
注意:注明参数来源的时候需要紧贴着列名/参数,而不要写到函数前面去。我一开始写的是 ‘b.avg(成绩)’,就错了。
案例3: 查询学生的选课情况 (学号、姓名、课程号、课程名称)
![f9eb4f705902a196efec6ce50c0a781e.png](https://i-blog.csdnimg.cn/blog_migrate/93803d5d4ef8625b13d8b1066a0f67f1.png)
自己额外做了一个小练习,来确保自己懂得了左联结/右联结:
首先我给course那张表加了一个栏目:课程0004,如下图
![1e177ac204697fe10b9eef7aaf98c38f.png](https://i-blog.csdnimg.cn/blog_migrate/a5561927b1648aaee47e4b8a6f6ac995.jpeg)
然后我输入如下四段代码,分别‘拷问’自己出来的结果会是什么:
![0a6abcd3bbcfed809f93cd872786f6dc.png](https://i-blog.csdnimg.cn/blog_migrate/1da01bb77a9fc24d9b45da0929775a38.jpeg)
![4a018af26634cdd87a4672792f2209ae.png](https://i-blog.csdnimg.cn/blog_migrate/370d7242c91a7822f1d09967f585b73b.jpeg)
![0d4e02dc7f0e7afaf01f1b0af270fb92.png](https://i-blog.csdnimg.cn/blog_migrate/15660f25ccf4aa8bc8092a529ef1853c.jpeg)
![d480d82abc70eaaf26c43cd1e7d195bf.png](https://i-blog.csdnimg.cn/blog_migrate/065b08fe87987d7b2ee20eedefc7509e.jpeg)
![a7c5a896b1c328e1abd8da935b5089f0.png](https://i-blog.csdnimg.cn/blog_migrate/14e9d40a12b0df8be92d764550daaf97.jpeg)
总之就是left join是代码左边的表格为主导,right join是此代码右边的表格为主导;
4. Case表达式
使用Case表达式可以帮助我们解决复杂的查询问题
Case表达的作用相当于一个判断条件的函数:用来判断每一行是不是满足某个条件,每一行返回一个结果;
![c2a9f53c944468c944c3c2d845f30a6e.png](https://i-blog.csdnimg.cn/blog_migrate/3c4d23e74f3df0a3341d6f90c1d31723.jpeg)
注意:这一长串case子句是数据输出里面的一个元素,不要忘记把它与前面的元素用逗号隔开。
案例1:查询出每门课程的及格人数和不及格人数
![54094c87be6d32bfcf1350dc245dd962.png](https://i-blog.csdnimg.cn/blog_migrate/37ed1106a3d6b0c08b2e75a81380ceda.jpeg)
注意:记得是case when…不是when…我就是漏写了case,结果检查了好久;另外要注意的是,不要因为行数/转折变多就开始空行!一段指令里面不能空行!不然报错找死你……
案例2: 使用分段 [85-100], [70-85], [60-70] , [< 60] 来统计各科成绩,分别统计各分数段人数,课程号和课程名称
*在使用group by子句的时候,select的列名一定是group by里面定义的列名;
![ebcfe361528b71aeb2b892142c1d0fd6.png](https://i-blog.csdnimg.cn/blog_migrate/f7426ea698c42c479a3441b816e9fe55.jpeg)
![7c835e4d3388e079ba6c924470a7d8e4.png](https://i-blog.csdnimg.cn/blog_migrate/111c69fc97f45dd0f4b6d07227a8314a.png)
注意:在打函数的时候,不要莫名其妙来一个空格….‘sum ()’ 这里的空格检查了我十分钟….
5. Sqlzoo
![8440037e302beb9525b1fa05bef9ae57.png](https://i-blog.csdnimg.cn/blog_migrate/c5627f45f95e57f1e5acb78d6bd51d63.jpeg)
注意:这里select里面想要提取的列名,group by里面就得用这个,这里虽然id和teamname是对应的,但是既然最后要提取teamname,那么必须要teamname,id可以额外写,但是不可以只写id;