![a36575011605687b06930479a408b870.png](https://i-blog.csdnimg.cn/blog_migrate/034db8f09b2124e60479b60af4583c58.jpeg)
![994822903b6eb420c71e89198c54aa04.png](https://i-blog.csdnimg.cn/blog_migrate/ce4e8b20c61e4ad8525a6566aa1e26a9.jpeg)
一.表的加法 union
1.1 表的加法/并集
使用union子句,合并两张结构相同 的表。
union子句默认去重合并,即去除重复数据只保留一个,需要保留重复数据,就使用union all ,即在union子句后面加上 all子句。
/*表的去重合并*/
select <列名1>,<列名2>,...
from <表1>
union
select <列名1>,<列名2>,...
from <表2>;
-
/*保留重复数据合并*/
select <列名1>,<列名2>,...
from <表1>
union all
select <列名1>,<列名2>,...
from <表2>;
1.2 union 的应用
![c732f269390e42a87d240e3f689188e4.png](https://i-blog.csdnimg.cn/blog_migrate/8838c201fc05f369ff74688915efd58f.png)
![e6b4aceb31a9c8b1466880f1f8f6e059.png](https://i-blog.csdnimg.cn/blog_migrate/d92466a07453ea7692f3d432fab9e3b8.png)
1.3 union 的注意事项
- 列数必须相同
- 列的类型必须一致
- order by 只能用一次
二.表的联结 join
2.1 表的联结
关系数据库是由多张表组成的,各表之间通过关联的字段/列 建立联结关系。
联结时,如果主表在与另一张表未匹配到数据则会在相应的列输出空值。
![4c1cf747e3a796e36bdf7783d490d31e.png](https://i-blog.csdnimg.cn/blog_migrate/cfb8a92613d5c8fe738e4a5fe99448ba.jpeg)
2.2 交叉联结 /笛卡尔积 cross join
![66f937775141cb335890a064663a3d39.png](https://i-blog.csdnimg.cn/blog_migrate/ea4fecd59fe8094244363236b2881dde.jpeg)
将表中的每一行数据都跟另一个表的全部数据合并在一起,以此逐条合并。交叉联结是所有联结的基础,其他联结方法即在交叉基础上加入了过滤条件。
/*交叉联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
cross join
<表2> as <表别名2>
on <联结条件>
2.2.1 cross join 的应用
![be94ec1aeb040611e56f89b9d68d9148.png](https://i-blog.csdnimg.cn/blog_migrate/c5ae7168108f5b6ff91253f2e9f255ee.jpeg)
交叉联结由于输出的结果较多,在实际业务中应用较少。
2.3 内联结 inner join
![3be05193a18b44c293c1f7d79e80a341.png](https://i-blog.csdnimg.cn/blog_migrate/78522c90e31ccb9b6c5e5794a41a0a1c.png)
内联结即查找出同时存在于两张表中的数据。
/*内联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
inner join
<表2> as <表别名2>
on <联结条件>
2.3.1 inner join 的应用
![99c0d71b35209cfdd4536b4b1bbe234c.png](https://i-blog.csdnimg.cn/blog_migrate/3dc009aa2b461a7c6b79df98eab8c553.jpeg)
2.4 左联结 left join
![e1d08125b5da10ac96554468f31f4046.png](https://i-blog.csdnimg.cn/blog_migrate/4a62661fe8090411de2a0b8f14c900f3.png)
以左侧的表作为主表,提取左表中的数据全部,右侧的表只取出与左表联结相同的数据。(如果主表的数据次表没有则联结时次表没有的数据会显示空值)
/*左联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
left join
<表2> as <表别名2>
on <联结条件>
2.4.1 left join 的应用
![25b713484780f6039c9cd4b132646780.png](https://i-blog.csdnimg.cn/blog_migrate/a59d056d4fab755e106b2e3e9d4d433e.jpeg)
2.5 右联结 right join
![d67ec02fef8831e7e9940d98582c0b9c.png](https://i-blog.csdnimg.cn/blog_migrate/559630a1aa45a97b8902c4a9b7e46b13.png)
以右侧的表作为主表,提取右表中的数据全部,左侧的表只取出与右表联结相同的数据。(如果主表的数据次表没有则联结时次表没有的数据会显示空值)
/*右联结的书写*/
select <列名1>,<列名2>,...
from <表1> as <表别名1>
right join
<表2> as <表别名2>
on <联结条件>
2.5.1 right join 的应用
![ee36044829f8ac9457c4c24b2601be55.png](https://i-blog.csdnimg.cn/blog_migrate/bb2144603cf25926c5646a75b880efa0.jpeg)
2.6 全联结 full join (My SQL不支持全联结)
![443a2bdab64c6d804ea675a2d7bf1cf2.png](https://i-blog.csdnimg.cn/blog_migrate/6cf85b64c3a8a7c37997a22bd667d458.png)
全联结的查询结果会返回左表和右表中的所有行,当某行与另一个表中有匹配的时候,两个行会进行合并,如果某行数据另一个表没有匹配则用空值来填充。
三. 联结的运行顺序,及其运用方法
3.1 运行顺序
![138d3cf330caf70012e5f0a1a659ba29.png](https://i-blog.csdnimg.cn/blog_migrate/dd4b15b077a2441f9b2a3ba73544e082.jpeg)
3.2 运用方法
- 当实际工作业务中要用到两个表以上的时候就要使用联结。
- 想要生成固定行数的表单或者特别说明了要那一张表中的全部数据的时候,使用左/右联结,其他情况都用内联结获取两个表的公共部分。
3.3联结的应用案例
![3e509146e663a8357e75734dcb440678.png](https://i-blog.csdnimg.cn/blog_migrate/a0a50f836f5475e374eff24c28305d93.jpeg)
![dae5bb399ec0ffed79d7ee41235150a9.png](https://i-blog.csdnimg.cn/blog_migrate/1f8d25278cce770ba0bfbd567d6ce74d.jpeg)
![0c3ae4736d3a68d77d32ea66be5fa680.png](https://i-blog.csdnimg.cn/blog_migrate/c9b9d6facbaab9c0f6c1766bbd4f145d.jpeg)
因为是联结多个表查询,所以要在select子句中给各个列名加上表的别名。
![e7936fa7ba98476c9ea37b2da1f1c1b5.png](https://i-blog.csdnimg.cn/blog_migrate/372cce0a0a9766d0cafdcf89900615c8.jpeg)
若只想要主表除次表以外的数据,只需在where 子句中将次表联结的列输入=NULL即可。
四.case 表达式
4.1 case 表达式的运用方法
case 表达式 相当于条件判断函数,满足条件输出一个值,不满足条件输出另一个值。
可以和汇总函数一起使用 ,可以使用多个case表达式。当有多种情况需要条件判断的时候,就要使用case 表达式。
/*case 表达式的书写*/
case when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
...
else <表达式>
end
4.2 case 表达式的应用
![f8bf42478bf5b66c0f48ec44b5f502a5.png](https://i-blog.csdnimg.cn/blog_migrate/801fc56046ac8352a81f3951f25ea128.jpeg)
![89cd6404cce0259c045af9a3d269977f.png](https://i-blog.csdnimg.cn/blog_migrate/cf3d26e6b2eb764bb27019bb0bc548bf.jpeg)
![e20ff72f269e1ad3f737a32e80a4be58.png](https://i-blog.csdnimg.cn/blog_migrate/fa9cb3274f0dee337a6717acb5caa831.jpeg)
4.3 case 表达式的注意事项
- else<表达式>可以省略不写,即默认为返回空值。(培养书写习惯,不建议省略不写)
- end 语句不能省略不写。
- case 语句能写在任何SQL子句中。
五.SQLZOO:SELECT 练习
![9fa58709bd36fbd6a1b7f6044bc2ca38.png](https://i-blog.csdnimg.cn/blog_migrate/a47330162e8b30532367c1872dfcce4d.jpeg)
![79789bc0028b5679389df70e267c569d.png](https://i-blog.csdnimg.cn/blog_migrate/d472f5584b04d45c3aacdd67bd0293f9.jpeg)
![5968e8dfc4f3088828011f0f519a064a.png](https://i-blog.csdnimg.cn/blog_migrate/0e2295c8287e3199d990409262bdd4d5.jpeg)
![69c99c13bc6d0de32423571278a648c4.png](https://i-blog.csdnimg.cn/blog_migrate/72c7802b0bb5268c874b4fc868fc6d52.jpeg)
![2342afde75b3bc33657b9414cf4f2651.png](https://i-blog.csdnimg.cn/blog_migrate/41bd0098b35742c710889ab5ebd8760c.jpeg)
![9c611a3529804a2f4cc213d99cd24259.png](https://i-blog.csdnimg.cn/blog_migrate/9a4db11ffcccfd90c87d566a1487912b.jpeg)
![107c4b2bdab37c3db4c59398bed99be2.png](https://i-blog.csdnimg.cn/blog_migrate/db15e6d2dc6a68ca7fb69e56c10754e0.jpeg)
![e3d050a8320abc8d532edf821067a7aa.png](https://i-blog.csdnimg.cn/blog_migrate/ceed757bf082ee2f289d2645dd8adeae.jpeg)
![492d7fefac6a750c9eb13ee4f9b4a5f0.png](https://i-blog.csdnimg.cn/blog_migrate/26832642346cdf983b712681010ec355.jpeg)
![c2e8fca4b862c3ee92ffcdd4ef5e744d.png](https://i-blog.csdnimg.cn/blog_migrate/8605e535f818706d6af083b4e441c313.jpeg)
![0e1308924fb1b0b9a4a4c4333ef0971d.png](https://i-blog.csdnimg.cn/blog_migrate/e04958f6eea0d974adb809f11ced7415.jpeg)
![0477f90fd859146f10962cc4f1d47380.png](https://i-blog.csdnimg.cn/blog_migrate/a9da1a74274324a2fac00136505515e7.jpeg)
![362a595afa0accf94c76f1a7c4af6275.png](https://i-blog.csdnimg.cn/blog_migrate/11f75faffaf00b478cd3b18ed4eb8eda.jpeg)