先说一下union all的用法和使用情况:
将两个select的结果作为一个整体显示出来。
满足条件:
1、两个select查询的列的数量必须相同;
2、每个列的数据类型需要相似;
union all是将两个select语句的结果求并集。 union是将union all的结果下再去除重复数据
具体实例:
之前有遇到一个难题,如何把mysql表格的字段查询出来变成列,选课表sc如图:
要求查询出来效果如图:
这个乍一看非常简单,就是查课程名,但是忽略了选课序号这个新字段是从哪里来的?并且选课序号的1、2、3不就是对应着选课表sc中的选课1,选课2,选课3吗,不仅要把字段转为列,还要查询出相应的课程信息。后来了解到有union all这个用法。
整体思路:
采用表格数据如图所示(数据我只添加了几条)
1.先把sc表中所有的选课1(sc1)查出来,并且将1作为它的选课序号。这样选课序号为1和对应的课程名就出来了。(去掉空值)
select 1 as '选课序号',sc1 as '课程名' from sc where sc1!=''
2.再把选课2(sc2)查出来,并且将2作为它的选课序号。(去掉空值)
select 2 as '选课序号',sc2 as '课程名' from sc where sc2!=''
3.选课3也是如上所示
select 3 as '选课序号',sc3 as '课程名' from sc where sc3!=''
4.完了以后,该查出来的都查出来了,需要将三个查询结果连接起来成一个结果。刚好列的数据类型又相同,不是正好可以使用union all吗!
select 1 as '选课序号',sc1 as '课程名' from sc where sc1!=''
union all select 2 as '选课序号',sc2 as '课程名' from sc where sc2!=''
union all select 3 as '选课序号',sc3 as '课程名' from sc where sc3!=''
完美查询出我想要的结果
如果还需要查询其它信息,可以将查询结果当作另一张表,再联合查询。
本次总结:union all可以连接查询结果。使用这么久mysql了,还不知道原来查询的时候可以随便取一个字段并取名显示在查询结果中,例如本次的select 3 as '选课序号'
,这个3和选课序号都不在我的表格里面,但是查询却可以任意取值并且查出来。还有一种行数据转列的方法也可以使用union all,不过除了这个函数以外应该还要用到case when函数