sql如何将不同表的查询结果合并并排序_数据分析师——旅程
篇(多表查询)...
实际⽣活中我们期望得到的数据往往分散在不同的表中,所以多表查询是很必要的,本篇⽂章包括四个部分:表的加法、表的联结、联结应⽤案例、case表达式。
⼀.表的加法
我们有两张表,score表和score1表:
表的加法是union:按⾏合并在⼀起
例如:
select 课程号,课程名称
from score
union
select 课程号,课程名称
from score1;
结果:
如果想要保留重复⾏:在union后⾯加上关键字all
select 课程号,课程名称
from score
union all
select 课程号,课程名称
from score1;
结果:
⼆.表的联结
1.交叉联结(cross join)
交叉联结也叫做笛卡尔积,是指将表中的每⼀⾏与另⼀张表中的每⼀⾏合并在⼀起,结果的⾏数是两张表中⾏数的乘积,如图所⽰:
2.内联结(inner join)
查出同时存在于两张表中的数据,例如:
student表:
course表:
内联结两张表:
SELECT a.学号,a.姓名,b.课程号
FROM student a INNER JOIN course b
ON a.学号 = b.学号;
结果:
3.左联结(left join)
左联结会将左侧表的数据全部查出来,例如:
SELECT a.学号,a.姓名,b.课程号
FROM student a LEFT JOIN course b
ON a.学号 = b.学号;
结果:
如果想要去掉公共部分的数据,只留下左边表的数据:
SELECT a.学号,a.姓名,b.课程号
FROM student a LEFT JOIN course b
ON a.学号 = b.学号
WHERE b.学号 = Null;
4.右联结(right join)
右联结会将右侧表的数据全部查出来,例如:
SELECT a.学号,a.姓名,b.课程号
FROM student a RIGHT JOIN course b
ON a.学号 = b.学号;
结果:
如果想要去掉公共部分的数据,只留下右边表的数据:
SELECT a.学号,a.姓名,b.课程号
FROM student a
sql中union多表合并RIGHT JOIN course b
ON a.学号 = b.学号
WHERE a.学号 = Null;
5.全联结(full join)
它会返回左表和右表中的所有⾏,没有匹配的地⽅⽤空值来填充,但是mysql不⽀持全联结。总之,可以⽤⼀张图来总结所有联结:
三.联结应⽤案例
问题1:查询所有学⽣的学号、姓名、选课数、总成绩
1)翻译成⼤⽩话:
学号、姓名:student 表
选课数:course 表,按学号进⾏分组,对课程号计数count
总成绩:course 表,按学号进⾏分组,对成绩求和sum
2)分析思路
select 查询结果[学号,姓名,选课数,总成绩]
from 从哪张表中查数据[学⽣表student,课程表course 两个表如何联结?按学号⽤哪种联结?左联结] where 查询条件[没有]
group by 分组
[每个学⽣的选课数⽬:按学号分组,对课程号计数count
每个学⽣的总成绩:按学号分组,对成绩求和sum
]
having 对分组结果指定条件[没有]
order by 对查询结果排序[没有]
limit 从查询结果中取出指定⾏[没有]
3)SQL语句
SELECT a.学号,a.姓名, COUNT(b.课程号) AS 选课数, SUM(b.成绩) AS 总成绩
FROM student a LEFT JOIN course b
ON a.学号 = b.学号
GROUP BY a.学号;
结果:
问题2:查询平均成绩⼤于85的所有学⽣的学号、姓名和平均成绩
1)翻译成⼤⽩话:
①查询出所有学⽣的学号、姓名、平均成绩
学号,姓名(在学⽣表student)
平均成绩(每个学⽣的平均成绩:在课程表course, 按学号分组,平均成绩:avg(成绩))②查出平均成绩>85的学⽣
2)分析思路
select 查询结果[学号,姓名,选课数,总成绩]
from 从哪张表中查数据[学⽣表student,课程表course 两个表如何联结?按学号⽤哪种联结?左联结] where 查询条件[没有]
group by 分组 [
每个学⽣的平均成绩:按学号分组,对成绩求平均avg ]
having 对分组结果指定条件[平均成绩⼤于85]
order by 对查询结果排序[没有]
limit 从查询结果中取出指定⾏[没有]
3)sql语句
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论