1、表的加法
加法:UNION
语句:
SELECT <字段>,<字段>
FROM <表名>
UNION ALL(ALL保留重复行)
SELECT <字段>,<字段>
FROM<表名>
练习:
SELECT *
FROM course
UNION ALL
SELECT *
FROM course1
结果:
2、表的联结
交叉联结(笛卡尔积) CROSS JOIN ——交叉联结的结果有六种数据
内联结 INNER JOIN 只能返回两张表同时存在的行数据——可以加入多个INNER JOIN子句进行多个表的联结
练习(内联结):
SELECT teacher.name,dept.name
FROM teacher AS a INNER JOIN dept AS b ON (a.dept=b.id)
-----外联结、左联结、右联结改变子句即可,需要理解不同联结的含义
外联结 OUTER JOIN即使只有一张表有值,也可以返回
右联结 RIGHT JOIN 返回右表中都存在值的行
左联结 LEFT JOIN 返回左表中都存在值的行
练习(左联结并去掉公共部分的数据):
SELECT a.学号,a.姓名,b.课程号
FROM student AS a LEFT JOIN score AS b
ON a.学号=b.学号
WHERE b.学号=NULL
全联结 FULL JOIN 将左表与右表的数据全部返回
SQL运行顺序:
1、先运行子查询
2、每个查询语句里的运行顺序
先运行蓝框子句——SELECT子句——红框子句
3、分析思路—联结应用示例
练习1:查询所有学生的学号、姓名、选课数、总成绩
-----分析思路
SELECT 查询结果[学号,姓名,选课数,总成绩]
FROM 从哪张表中查找数据[学生表student,成绩表course 两张表如何联结?通过学号 用哪种联结?左联结]
WHERE 查询条件[没有]
GROUP BY 分组[每个学生的选课数目:按学号分组,对课程号计数COUNT
每个学生的总成绩:按学号分组,对成绩求和SUM]
HAVING 对分组结果指定条件[没有]
ORDER BY 对查询结果排序[没有]
LIMIT 从查询结果中取出指定行[没有];
-------程序
SELECT a.学号,a.姓名,COUNT(课程号) 选课数,SUM(成绩) 总成绩
FROM student a LEFT JOIN course b ON a.学号=b.学号
GROUP BY a.学号;
-------结果
练习2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
-----分析思路
SELECT 查询结果[学号,姓名,平均成绩]
FROM 从哪张表中查找数据[学生表student,成绩表score 两张表如何联结?通过学号 用哪种联结?左联结]
WHERE 查询条件[没有]
GROUP BY 分组[每个学生的选课数目:按学号分组,对课程成绩进行平均AVG]
HAVING 对分组结果指定条件[平均成绩大于85 AVG]
ORDER BY 对查询结果排序[没有]
LIMIT 从查询结果中取出指定行[没有];
------程序
SELECT a.学号,a.姓名,AVG(成绩) 平均成绩
FROM student a LEFT JOIN score b ON a.学号=b.学号
GROUP BY a.学号
HAVING AVG(成绩)>'85';
结果:
练习3:查询学生的选课情况:学号,姓名,课程号,课程名称
注意多个表进行联结时,之后的JOIN前需要省去掉前面出现过的表
即直接写开头JOIN子句即可
-----分析思路
SELECT 查询结果[学号,姓名,课程号,课程名称]
FROM 从哪张表中查找数据[学生表student,成绩表score,课程course, 三张表如何联结?
student与score通过学号 用哪种联结?左联结
score与course通过课程号 用哪种联结?左联结]
WHERE 查询条件[没有]
GROUP BY 分组[没有]
HAVING 对分组结果指定条件[没有]
ORDER BY 对查询结果排序[没有]
LIMIT 从查询结果中取出指定行[没有];
-----程序
SELECT a.学号,a.姓名,course.课程号,c.课程名称
FROM student a LEFT JOIN course ON a.学号=course.学号
JOIN score c ON course.课程号=c.课程号;
-----结果
4、case表达式
CASE 表达式 语句 当需要判断多个条件时
CASE WHEN <判断表达式> THEN <表达式>
WHEN <判断表达式> THEN <表达式>
WHEN <判断表达式> THEN <表达式>
WHEN <判断表达式> THEN <表达式>
...
ELSE <表达式>
END
练习1:查询出每门课程的及格人数和不及格人数
SELECT a.课程号,b.课程名称,
SUM(CASE WHEN 成绩>='60'
THEN 1 ELSE 0 END) AS 及格人数,
SUM(CASE WHEN 成绩<'60'
THEN 1 ELSE 0 END) AS 不及格人数
FROM course a LEFT JOIN score b ON a.`课程号`=b.`课程号`
GROUP BY a.课程号,b.课程名称;
结果:
练习2:使用分段[100-85],[85-75],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
SELECT a.课程号,b.课程名称,
SUM(CASE WHEN 成绩 BETWEEN 85 AND 100
THEN 1 ELSE 0 END) '[85-100]',
SUM(CASE WHEN 成绩 >=75 AND 成绩<85
THEN 1 ELSE 0 END) '[75-85]',
SUM(CASE WHEN 成绩 >=60 AND 成绩<70
THEN 1 ELSE 0 END) '[60-70]',
SUM(CASE WHEN 成绩 < 60
THEN 1 ELSE 0 END) '不及格'
FROM course a RIGHT JOIN score b ON a.课程号=b.课程号
GROUP BY a.课程号,b.课程名称;
结果: