lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询

1、表的加法

加法:UNION

语句:

SELECT <字段>,<字段>

FROM <表名>

UNION ALL(ALL保留重复行)

SELECT <字段>,<字段>

FROM<表名>

练习:

SELECT *
FROM course
UNION ALL
SELECT *
FROM course1

结果:

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第1张图片

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 将左表与右表的数据全部返回

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第2张图片

SQL运行顺序:

1、先运行子查询

2、每个查询语句里的运行顺序

先运行蓝框子句——SELECT子句——红框子句

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第3张图片

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.学号;

-------结果

edce15e63979523c8585c19a6c07c0f0.png

练习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';

结果:

d04dbbc428b217e19b1af7578e84660f.png
没有平均成绩大于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.课程号;
-----结果

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第4张图片

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.课程名称;

结果:

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第5张图片

练习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.课程名称;

结果:

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询_第6张图片

你可能感兴趣的:(子查询返回多个字段)