多表查询顾名思义就是数据同时从多张表中获得,查询语句牵涉到多张表,我们主要从以下几个方面介绍。
一、表的加法(union)
表的加法就是将两个表的数据按照行合并在一起。使用到的关键词是union,需要加法的两个表列名有相同的。
select <列名1>,<列名2>,...
from 表名1
union
select <列名1>,<列名2>,...
from 表名2;
注意:union默认是不保留重复行,如果需要保留重复号用union all;
/*保留重复行*/
select <列名1>,<列名2>,...
from 表名1
union all
select <列名1>,<列名2>,...
from 表名2;
练习:
二、表的联结
1、交叉联结(cross join)
交叉联结又称为笛卡尔积,将表中的每一行与另一张表的每一行联结在一起;合并后的行数是两个表行数的乘积。
典型例子:扑克牌的花色和13个数字,得到52张牌。
2、内联结(inner join)
内联结是查找出同时存在于两张表中的数据。内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。用文氏图表示如下:
示例:
select a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号; //联结条件
练习:
3、左联结(left join)
左联结是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL。用文氏图表示左联结:
示例:
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号=b.学号;
如果要去掉公共部分,用文氏图表示如下:
Select a.学号,a.姓名,b.课程号
From student as a left join score as b
On a.学号=b.学号
Where b.学号 is null;
练习:
4、右联结(right join)
右联结是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL。用文氏图表示如下:
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号=b.学号;
如果要去掉公共部分,用文氏图表示如下:
Select a.学号,a.姓名,b.课程号
From student as a right join score as b
On a.学号=b.学号
Where a.学号 is null;
练习:
5、全联结(full join)
全联结:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。用文氏图表示如下:
6、SQL执行顺序
7、练习:联结
1)查询所有学生的学号、姓名、选课数、总成绩
2)查询平均成绩大于85分的所有学生的学号、姓名和平均成绩
3)查询学生的选课情况:学号、姓名、课程号、课程名称
三、case表达式
针对有多种情况需要分段的应用
Case when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
….
else <表达式>
end
练习:
1)查询出每门课程的优秀人数(成绩>=90)、良好人数(80<=成绩<90)和及格人数(60<=成绩<80);
2)使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程号和课程名称