龙空技术网

SQL多表联合查询

办公达人秀 101

前言:

而今同学们对“五个表联合查询”大体比较关心,咱们都需要剖析一些“五个表联合查询”的相关文章。那么小编在网上收集了一些有关“五个表联合查询””的相关内容,希望小伙伴们能喜欢,各位老铁们快快来了解一下吧!

在前面创建数据表的基础上,接下来我们进行多表关联查询练习

查询1 查询每个学生的总分

USE `数据查询练习`;SELECT *,语文+数学+英语+物理 AS 总分FROM students;

错误写法:

SELECT *,SUM(语文,数学,英语,物理) AS 总分FROM students;

在 SQL 中,你不能直接在 SELECT 语句的 SUM 函数中那样将多个列名作为参数直接相加。SUM 函数通常用于对某一列中的所有值进行求和,而不能用于多列的求和。

另外,我们还可以新增一列总分列(建议用这种方式)

ALTER TABLE students ADD 总分 INT;UPDATE studentsSET 总分=语文+数学+英语+物理;

查询2 查询高三2班的各科成绩

SELECT c.`班级名称`, s.`姓名`,s.`学号`,s.`语文`,s.`数学`,s.`英语`,s.`物理`FROM students sINNER JOIN classes cON c.`班级ID`=s.`班级ID`WHERE c.`班级名称`='高三2班';

查询结果

查询3 查询高三5班的学生人数

SELECT c.`班级名称`, count(s.`姓名`) AS 班级人数FROM students sINNER JOIN classes cON c.`班级ID`=s.`班级ID`WHERE c.`班级名称`='高三5班';

查询结果

查询4 查询高三4班的女生人数

SELECT c.`班级名称`, count(s.`姓名`) AS 班级女生人数FROM students sINNER JOIN classes cON c.`班级ID`=s.`班级ID`WHERE c.`班级名称`='高三4班'GROUP BY s.`性别`HAVING s.`性别`='女';

查询效果

查询5 高三3班的英语老师是谁?

SELECT 英语教师FROM classesWHERE 班级名称='高三3班';

查询6 查询高三1班的各科任老师有谁?

SELECT *FROM classesWHERE 班级名称='高三1班';

查询7 查询张三老师所任教的班级

SELECT 班级ID, 班级名称  FROM classes  WHERE 语文教师 = '张三' OR        数学教师 = '张三' OR        英语教师 = '张三' OR        物理教师 = '张三';

查询8 查询教师ID为tea08的老师,任教的班级

SELECT       c.班级ID,      c.班级名称FROM       classes c  WHERE       (c.语文教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = '语文')) OR      (c.数学教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = '数学')) OR      (c.英语教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = '英语')) OR      (c.物理教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = '物理'));

查询结果

查询9 查询教师ID为tea08的老师,任教的班级及任教的学科

SELECT       DISTINCT c.班级ID,      c.班级名称,      CASE           WHEN t.任教学科 = '语文' AND c.语文教师 = t.姓名 THEN '语文'          WHEN t.任教学科 = '数学' AND c.数学教师 = t.姓名 THEN '数学'          WHEN t.任教学科 = '英语' AND c.英语教师 = t.姓名 THEN '英语'          WHEN t.任教学科 = '物理' AND c.物理教师 = t.姓名 THEN '物理'          ELSE NULL      END AS 任教学科  FROM       classes c  CROSS JOIN       (SELECT 姓名, 任教学科 FROM teachers WHERE 教师ID = 'tea08') t  WHERE       (t.任教学科 = '语文' AND c.语文教师 = t.姓名) OR      (t.任教学科 = '数学' AND c.数学教师 = t.姓名) OR      (t.任教学科 = '英语' AND c.英语教师 = t.姓名) OR      (t.任教学科 = '物理' AND c.物理教师 = t.姓名);

注意:

(1)CROSS JOIN在这里用于生成classes表和teachers表中教师ID为tea08的行的所有可能组合。然后,我们使用WHERE子句来过滤出那些匹配的行。

(2)DISTINCT用于消除可能的重复行,因为CROSS JOIN可能会产生重复。

(3)CASE语句用于根据匹配的教师和任教学科来确定任教学科。

查询结果

查询10 查询教师ID为tea08的老师,任教的班级及任教的学科的平均分

WITH TeacherSubjects AS (      SELECT 任教学科    FROM teachers		WHERE 教师ID='tea08'),  TeacherClasses AS (      SELECT c.班级ID, c.班级名称, ts.任教学科     FROM classes c      JOIN TeacherSubjects ts ON           (c.语文教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = ts.任教学科) OR           c.数学教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = ts.任教学科) OR           c.英语教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = ts.任教学科) OR           c.物理教师 = (SELECT 姓名 FROM teachers WHERE 教师ID = 'tea08' AND 任教学科 = ts.任教学科))  ),  AverageScores AS (      SELECT tc.班级ID, tc.班级名称, tc.任教学科,          AVG(CASE WHEN tc.任教学科 = '语文' THEN s.语文 ELSE NULL END) AS 语文平均分,          AVG(CASE WHEN tc.任教学科 = '数学' THEN s.数学 ELSE NULL END) AS 数学平均分,          AVG(CASE WHEN tc.任教学科 = '英语' THEN s.英语 ELSE NULL END) AS 英语平均分,          AVG(CASE WHEN tc.任教学科 = '物理' THEN s.物理 ELSE NULL END) AS 物理平均分      FROM TeacherClasses tc      JOIN students s ON tc.班级ID = s.班级ID      GROUP BY tc.班级ID, tc.班级名称, tc.任教学科  )  SELECT 班级ID, 班级名称, 任教学科,         CASE 任教学科             WHEN '语文' THEN 语文平均分             WHEN '数学' THEN 数学平均分             WHEN '英语' THEN 英语平均分             WHEN '物理' THEN 物理平均分             ELSE NULL         END AS 平均分  FROM AverageScores;

查询11 查询每个学生的等级,假设总分240以下为“不及格”,总分240以上,少于280分为“及格”;总分在280分以上,低于340分为“良好”;340分以上的为优秀。

SELECT *,CASE 	WHEN 总分<240 THEN	'不及格'	WHEN 总分>=240 AND 总分<280 THEN '及格'	WHEN 总分>=280 AND 总分<340 THEN '良好'	WHEN 总分>=340 THEN '优秀'	ELSE NULLEND AS 等级FROM students;

查询12 查询每个等级的人数

SELECT      CASE           WHEN 总分 < 240 THEN '不及格'          WHEN 总分 >= 240 AND 总分 < 280 THEN '及格'          WHEN 总分 >= 280 AND 总分 < 340 THEN '良好'          WHEN 总分 >= 340 THEN '优秀'      END AS 等级,      COUNT(*) AS 学生数量  FROM      students  GROUP BY      CASE           WHEN 总分 < 240 THEN '不及格'          WHEN 总分 >= 240 AND 总分 < 280 THEN '及格'          WHEN 总分 >= 280 AND 总分 < 340 THEN '良好'          WHEN 总分 >= 340 THEN '优秀'      END;

查询结果

标签: #五个表联合查询