本章主要讲解如果使用SQL进行多表查询,内容包括以下:
一.表的加法
二.表的联接
三.联结应用案例
四.case表达式
一.表的加法,加法用union,会把重复的数据删除,重复的数据只保留一个
2.表的加法如果用union all, 则会保留所有重复的行
二.表的联结
联结有以下5种联结方式
交叉联结 cross join
内联结 inner join
左联结 left join
右联结 right join
全联结 full join
1.交叉连接 cross join:是将表中的每一行都与另一个表种的每一行合并在一起
交叉表种的行数是两张表种的乘积
如下:
2.内联结 inner join
内联结就是查询同时存在两张表种的数据
3.左联结 left join
左联结会将左侧表中的所有数据取出来
增加SQL语句: WHERE b.学号 is NULL; 则把score1表中学号为空的行取出来
3.右联结 right join
右联结会将右侧表中的所有数据取出来
增加SQL语句: WHERE a.学号 = NULL; 则把student1表中学号为空的行取出来
4.全联结 full join
sql不支持全联结
三.联结应用案例
如何使用SQL解决业务问题
1.翻译成大白话
2.写出分析思路
3.写出对应的sql子句
课堂练习:查询所有学生的学号,姓名,选课数,总成绩
思路:
1)学号,姓名(学生表student)
2) 选课数(每个学生的选课数目:成绩表score)
按学号分组,对课程号计算用count
3) 总成绩(每个学生的总成绩:成绩表score,
按学号分组,对成绩求和用sum)
翻译成大白话后如下:
select 查询结果(学号,姓名,选课书,总成绩)
from 从哪张表中查找数据[学生表student,成绩表score,两个表如何连接,通过学号,用哪种连接]
where 查询条件[没有]
group by 分组[按照学号分组]
having 对分组结果指定条件[没有]
order by 对查询结果排序[无]
limit 从查询结果中取出指定行[无]
课堂练习:查询平均成绩大于85的所有学生的学号,姓名和平均成绩
1)查询出所有学生的学号,姓名,平均成绩
学号,姓名[在student表]
平均成绩[在score成绩表]:avg(成绩)
按照学号分组
2)平均成绩>85
翻译成大白话后如下:
select 查询结果(学号,姓名,平均成绩)
from 从哪张表中查找数据[学生表student,成绩表score,两个表如何连接,通过学号,用哪种连接]
where 查询条件[没有]
group by 分组[按照学号分组]
having 对分组结果指定条件[ 平均成绩>85]
order by 对查询结果排序[无]
limit 从查询结果中取出指定行[无]
课堂练习:查询学生的选课情况和课程名称
四.case表达式
case when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
...
else<表达式>
end
课堂练习:查询出 每门课程 的 及格人数 和 不及格人数
单需要对条件判断的时候需要用case表达式
课堂练习: 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:
各分数段人数,课程号,课程名称
练习题 sqlzoo
章节: select in select quiz
练习网址
The JOIN operationsqlzoo.net