写在前面的话
本文参考原博《走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1》和《走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 2》进行练习,部分题目在不变化其练习目的的情况下进行了题意改动,并删除部分重复和无表的题目。在此之前已练习完两遍并分别放在WizNote和Github,其中第二遍在Github上针对个人的sql弱项题目进行了更详细的说明(Github:MyTraining/sql),随着越来越熟练,本文作为第三次练习,部分重点题目的详细解析和想法在这里就没有具体描述,或许以后会补上,但是谁知道呢(摊手)。
涉及的表结构和测试数据
使用数据库软件直接导出的SQL(偷懒直接把Part1和Part2的导在一起的,因为表名各不相同所以这里并不影响练习使用),数据库是MySQL。
--> 下载地址戳这里 <--
Part 1 练习题和参考解
(1)查询“001”课程比“002”课程成绩低的所有学生的学号、001学科成绩、002学科成绩
SELECT
s1.StudentNo,
s1.score AS '001',
s2.score AS '002'
FROM
score s1,
(
SELECT
*
FROM
score s
WHERE
s.CourseNo = 2
) s2
WHERE
s1.CourseNo = 1
AND
s1.StudentNo = s2.StudentNo
AND
s1.score < s2.score
ORDER BY s1.StudentNo21
1
SELECT 2
s1.StudentNo,3
s1.score AS '001',4
s2.score AS '002'5
FROM6
score s1,7
(8
SELECT9
*10
FROM11
score s12
WHERE13
s.CourseNo = 214
) s215
WHERE16
s1.CourseNo = 117
AND18
s1.StudentNo = s2.StudentNo19
AND20
s1.score < s2.score21
ORDER BY s1.StudentNoSELECT
s1.StudentNo,
s1.score AS '001',
s2.score AS '002'
FROM
score s1,
score s2
WHERE
s1.CourseNo = 001
AND
s2.CourseNo = 002
AND
s1.StudentNo = s2.StudentNo
AND
s1.score < s2.score
ORDER BY s1.StudentNo16
1
SELECT2
s1.StudentNo,3
s1.score AS '001',4
s2.score AS '002'5
FROM 6
score s1, 7
score s28
WHERE 9
s1.CourseNo = 001 10
AND 11
s2.CourseNo = 002 12
AND 13
s1.StudentNo = s2.StudentNo14
AND15
s1.score < s2.score16
ORDER BY s1.StudentNo(2)查询平均成绩大于60分的同学的学号和平均成绩
SELECT
s1.StudentNo,
AVG(s1.score)
FROM
score s1
GROUP BY s1.StudentNo
HAVING AVG(s1.score)>607
1
SELECT2
s1.StudentNo,3
AVG(s1.score)4
FROM5
score s16
GROUP BY s1.StudentNo7
HAVING AVG(s1.score)>60(3)查询所有同学的学号、姓名、选课数、总成绩
SELECT
s1.StudentNo,
stu1.name,
COUNT(*),
SUM(s1.score)
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
GROUP BY s1.StudentNo11
1
SELECT2
s1.StudentNo,3
stu1.name,4
COUNT(*),5
SUM(s1.score)6
FROM7
score s1,8
student stu19
WHERE10
s1.StudentNo = stu1.StudentNo11
GROUP BY s1.StudentNo(4)查询姓“李”的老师的个数
SELECT
COUNT(*)
FROM
teacher t1
WHERE
t1.name like '李%'6
1
SELECT2
COUNT(*)3
FROM4
teacher t15
WHERE6
t1.name like '李%'(5)查询没学过“叶平”老师课的同学的学号、姓名
SELECT
stu1.StudentNo,
stu1.name
FROM
student stu1
WHERE
stu1.StudentNo NOT IN
(
SELECT DISTINCT
s1.StudentNo
FROM
score s1,
course c1,
teacher t1
WHERE
s1.courseNo = c1.CourseNo
AND
c1.teacherNo = t1.teacherNo
AND
t1.name = '叶平'
)21
1
SELECT2
stu1.StudentNo,3
stu1.name4
FROM5
student stu16
WHERE7
stu1.StudentNo NOT IN8
(9
SELECT DISTINCT10
s1.StudentNo11
FROM12
score s1,13
course c1,14
teacher t115
WHERE16
s1.courseNo = c1.CourseNo17
AND18
c1.teacherNo = t1.teacherNo19
AND20
t1.name = '叶平'21
)(6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
-- 这个算法比普通的要有想法
SELECT
s1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.CourseNo IN (1, 2)
GROUP BY s1.StudentNo
HAVING COUNT(*) = 213
1
-- 这个算法比普通的要有想法2
SELECT3
s1.StudentNo,4
stu1.name5
FROM6
score s1,7
student stu18
WHERE9
s1.StudentNo = stu1.StudentNo10
AND11
s1.CourseNo IN (1, 2)12
GROUP BY s1.StudentNo13
HAVING COUNT(*) = 2SELECT
s1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.CourseNo = 1
AND
s1.StudentNo IN
(
SELECT
s2.StudentNo
FROM
score s2
WHERE
s2.CourseNo = 2
)20
1
SELECT2
s1.StudentNo,3
stu1.name4
FROM5
score s1,6
student stu17
WHERE8
s1.StudentNo = stu1.StudentNo9
AND10
s1.CourseNo = 111
AND12
s1.StudentNo IN13
(14
SELECT15
s2.StudentNo16
FROM17
score s218
WHERE19
s2.CourseNo = 220
)(7)查询学过“叶平”老师所教的所有课的同学的学号、姓名
-- 利用主键值不相同,它们的和一定各不相同,叶平老师的课程的主键值和如果与学生所学的叶平老师的课程的主键值和相等,那么说明学了叶平老师所有课程
SELECT
stu1.StudentNo,
stu1.name
FROM
score s1,
student stu1,
course c1,
teacher t1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.CourseNo = c1.CourseNo
AND
c1.teacherNo = t1.teacherNo
AND
t1.name = '叶平'
GROUP BY s1.StudentNo
HAVING SUM(s1.CourseNo)=
(
SELECT
SUM(c2.CourseNo)
FROM
course c2,
teacher t2
WHERE
c2.teacherNo = t2.teacherNo
AND
t2.name = '叶平'
)30
1
-- 利用主键值不相同,它们的和一定各不相同,叶平老师的课程的主键值和如果与学生所学的叶平老师的课程的主键值和相等,那么说明学了叶平老师所有课程2
SELECT3
stu1.StudentNo,4
stu1.name5
FROM6
score s1,7
student stu1,8
course c1,9
teacher t110
WHERE11
s1.StudentNo = stu1.StudentNo12
AND13
s1.CourseNo = c1.CourseNo14
AND15
c1.teacherNo = t1.teacherNo16
AND17
t1.name = '叶平'18
GROUP BY s1.StudentNo19
HAVING SUM(s1.CourseNo)=20
(21
SELECT22
SUM(c2.CourseNo)23
FROM24
course c2,25
teacher t226
WHERE27
c2.teacherNo = t2.teacherNo28
AND29
t2.name = '叶平'30
)-- 如果学生学习叶平老师的课程数量,与叶平老师所教学课程的数量相同,那么说明该同学学了叶平老师的所有课程
SELECT
stu1.StudentNo,
stu1.name
FROM
score s1,
student stu1,
course c1,
teacher t1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.CourseNo = c1.CourseNo
AND
c1.teacherNo = t1.teacherNo
AND
t1.name = '叶平'
GROUP BY s1.StudentNo
HAVING COUNT(*) =
(
SELECT
COUNT(*)
FROM
course c2,
teacher t2
WHERE
c2.teacherNo = t2.teacherNo
AND
t2.name = '叶平'
)30
1
-- 如果学生学习叶平老师的课程数量,与叶平老师所教学课程的数量相同,那么说明该同学学了叶平老师的所有课程2
SELECT3
stu1.StudentNo,4
stu1.name5
FROM6
score s1,7
student stu1,8
course c1,9
teacher t110
WHERE11
s1.StudentNo = stu1.StudentNo12
AND13
s1.CourseNo = c1.CourseNo14
AND15
c1.teacherNo = t1.teacherNo16
AND17
t1.name = '叶平'18
GROUP BY s1.StudentNo19
HAVING COUNT(*) =20
(21
SELECT22
COUNT(*)23
FROM24
course c2,25
teacher t226
WHERE27
c2.teacherNo = t2.teacherNo28
AND29
t2.name = '叶平' 30
)(8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名
SELECT
stu1.studentNo,
stu1.name
FROM
score s1,
(
SELECT
s2.StudentNo,
s2.score
FROM
score s2
WHERE
s2.CourseNo = 1
) t2,
student stu1
WHERE
s1.CourseNo = 2
AND
s1.StudentNo = t2.StudentNo
AND
s1.score < t2.score
AND
s1.StudentNo = stu1.studentNo23
1
SELECT2
stu1.studentNo,3
stu1.name4
FROM5
score s1,6
(7
SELECT8
s2.StudentNo,9
s2.score10
FROM11
score s212
WHERE13
s2.CourseNo = 114
) t2,15
student stu116
WHERE17
s1.CourseNo = 218
AND 19
s1.StudentNo = t2.StudentNo20
AND 21
s1.score < t2.score22
AND 23
s1.StudentNo = stu1.studentNo(9)查询有课程成绩小于60分的同学的学号、姓名
SELECT DISTINCT
s1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.studentNo
AND
s1.score < 6010
1
SELECT DISTINCT2
s1.StudentNo,3
stu1.name4
FROM5
score s1,6
student stu17
WHERE8
s1.StudentNo = stu1.studentNo9
AND10
s1.score < 60(10)查询没有学全所有课的同学的学号、姓名
SELECT
stu1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
GROUP BY s1.StudentNo
HAVING COUNT(*) <
(
SELECT
COUNT(*)
FROM
course c1
)16
1
SELECT2
stu1.StudentNo,3
stu1.name4
FROM5
score s1,6
student stu17
WHERE8
s1.StudentNo = stu1.StudentNo9
GROUP BY s1.StudentNo10
HAVING COUNT(*) < 11
(12
SELECT13
COUNT(*)14
FROM15
course c116
)(11)查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名
SELECT DISTINCT
stu1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.CourseNo IN
(
SELECT
s2.CourseNo
FROM
score s2
WHERE
s2.StudentNo = 1
)18
1
SELECT DISTINCT2
stu1.StudentNo,3
stu1.name4
FROM5
score s1,6
student stu17
WHERE8
s1.StudentNo = stu1.StudentNo9
AND10
s1.CourseNo IN11
(12
SELECT13
s2.CourseNo14
FROM15
score s216
WHERE17
s2.StudentNo = 118
)(12)查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名(和11题撞脸,排除1号同学就可以了)
SELECT DISTINCT
stu1.StudentNo,
stu1.name
FROM
score s1,
student stu1
WHERE
s1.StudentNo = stu1.StudentNo
AND
s1.StudentNo != 1
AND
s1.CourseNo IN
(
SELECT
s2.CourseNo
FROM
score s2
WHERE
s2.StudentNo = 1
)20
1
SELECT DISTINCT2
stu1.StudentNo,3
stu1.name4
FROM5
score s1,6
student stu17
WHERE8
s1.StudentNo = stu1.StudentNo9
AND10
s1.StudentNo != 111
AND12
s1.CourseNo IN13
(14
SELECT15
s2.CourseNo16
FROM17
score s218
WHERE19
s2.StudentNo = 120
)(13)把“score”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩
-- 涉及将两表联合,将本表某字段的值按条件设置为另个表的某个字段的值 (参考链接:MySQL:把一个表中的数据按键值更新(update)到另一个表)
UPDATE
score s,
(
SELECT
s1.CourseNo as courseNo,
AVG(s1.score) as avgScore
FROM
score s1,
course c1,
teacher t1
WHERE
s1.CourseNo = c1.CourseNo
AND
c1.teacherNo = t1.teacherNo
AND
t1.name = '叶平'
GROUP BY s1.CourseNo
) as t
SET
s.score = t.avgScore
WHERE
s.CourseNo = t.courseNo23
1
-- 涉及将两表联合,将本表某字段的值按条件设置为另个表的某个字段的值 (参考链接:MySQL:把一个表中的数据按键值更新(update)到另一个表)2
UPDATE3
score s,4
(5
SELECT6
s1.CourseNo as courseNo,7
AVG(s1.score) as avgScore 8
FROM9
score s1,10
course c1,11
teacher t112
WHERE13
s1.CourseNo = c1.CourseNo14
AND15
c1.teacherNo = t1.teacherNo16
AND17
t1.name = '叶平'18
GROUP BY s1.CourseNo19
) as t20
SET21
s.score = t.avgScore22
WHERE23
s.CourseNo = t.courseNo(14)查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名
SELECT
stu.studentNo,
stu.name
FROM
score s,
student stu
WHERE
s.StudentNo != 2
AND
s.StudentNo = stu.studentNo
GROUP BY s.StudentNo
HAVING SUM(s.CourseNo)=
(
SELECT
SUM(s1.CourseNo)
FROM
score s1
WHERE
s1.StudentNo = 2
)20
1
SELECT2
stu.studentNo,3
stu.name4
FROM5
score s,6
student stu7
WHERE8
s.StudentNo != 29
AND10
s.StudentNo = stu.studentNo11
GROUP BY s.StudentNo12
HAVING SUM(s.CourseNo)=13
(14
SELECT15
SUM(s1.CourseNo)16
FROM17
score s118
WHERE19
s1.StudentNo = 220
)(15)删除学习“叶平”老师课的SC表记录
DELETE FROM
score s
WHERE
s.CourseNo IN
(
SELECT
c.CourseNo
FROM
course c,
teacher t
WHERE
c.teacherNo = t.teacherNo
AND
t.name = '叶平'
)15
1
DELETE FROM2
score s3
WHERE4
s.CourseNo IN5
(6
SELECT7
c.CourseNo8
FROM9
course c,10
teacher t11
WHERE12
c.teacherNo = t.teacherNo13
AND14
t.name = '叶平'15
)(16)向SC表中插入一些记录,这些记录要求符合以下条件:1、没有上过编号“002”课程的同学学号;2、插入“002”号课程的平均成绩
-- 本题采用插入子查询的方式,三个字段中后两个字段为常量(基本格式:INSERT INTO R(A1, A2 ... ,An) 子查询)
INSERT INTO
score(StudentNo, CourseNo, score)
(
SELECT
stu.studentNo,
2,
(SELECT AVG(s3.score) FROM score s3 WHERE s3.CourseNo = 2)
FROM
student stu
WHERE
stu.studentNo
NOT IN
(
SELECT
s2.StudentNo
FROM
score s2
WHERE
s2.CourseNo = 2
)
)22
1
-- 本题采用插入子查询的方式,三个字段中后两个字段为常量(基本格式:INSERT INTO R(A1, A2 ... ,An) 子查询)2
INSERT INTO3
score(StudentNo, CourseNo, score)4
(5
SELECT 6
stu.studentNo,7
2,8
(SELECT AVG(s3.score) FROM score s3 WHERE s3.CourseNo = 2)9
FROM 10
student stu 11
WHERE 12
stu.studentNo 13
NOT IN 14
(15
SELECT 16
s2.StudentNo 17
FROM 18
score s2 19
WHERE 20
s2.CourseNo = 221
)22
)(17)按学号由低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分
-- 用了个极蠢的办法,虽然很瓜很绕但是也算是温习了下相关子查询、CASE WHEN、EXISTS了,另外对自己也有所启发,就留下了
-- 然后做到这里的时候感慨,随着练习总是越来越熟练的,尽管自己写得很绕,但以往是根本想不到用什么CASE WHEN、EXISTS之类的,也算是成长吧
SELECT
stu.studentNo,
CASE WHEN EXISTS (SELECT * FROM score s1 WHERE s1.CourseNo = 1 AND s1.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 1 AND s.studentNo = stu.studentNo) ELSE NULL END AS "语文",
CASE WHEN EXISTS (SELECT * FROM score s2 WHERE s2.CourseNo = 2 AND s2.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 2 AND s.studentNo = stu.studentNo) ELSE NULL END AS "数学",
CASE WHEN EXISTS (SELECT * FROM score s3 WHERE s3.CourseNo = 3 AND s3.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 3 AND s.studentNo = stu.studentNo) ELSE NULL END AS "英语",
t1.validateCount AS '有效科目数',
t2.validateAVG AS '有效平均分'
FROM
student stu,
(SELECT s.studentNo, COUNT(*) AS validateCount FROM score s WHERE s.CourseNo IN (1, 2, 3) GROUP BY s.StudentNo) as t1,
(SELECT s.studentNo, AVG(s.score) AS validateAVG FROM score s WHERE s.CourseNo IN (1, 2, 3) GROUP BY s.StudentNo) as t2
WHERE
stu.studentNo = t1.studentNo
AND
stu.studentNo = t2.studentNo
ORDER BY stu.StudentNo18
1
-- 用了个极蠢的办法,虽然很瓜很绕但是也算是温习了下相关子查询、CASE WHEN、EXISTS了,另外对自己也有所启发,就留下了2
-- 然后做到这里的时候感慨,随着练习总是越来越熟练的,尽管自己写得很绕,但以往是根本想不到用什么CASE WHEN、EXISTS之类的,也算是成长吧3
SELECT4
stu.studentNo,5
CASE WHEN EXISTS (SELECT * FROM score s1 WHERE s1.CourseNo = 1 AND s1.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 1 AND s.studentNo = stu.studentNo) ELSE NULL END AS "语文",6
CASE WHEN EXISTS (SELECT * FROM score s2 WHERE s2.CourseNo = 2 AND s2.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 2 AND s.studentNo = stu.studentNo) ELSE NULL END AS "数学",7
CASE WHEN EXISTS (SELECT * FROM score s3 WHERE s3.CourseNo = 3 AND s3.studentNo = stu.studentNo) THEN (SELECT s.score FROM score s WHERE s.CourseNo = 3 AND s.studentNo = stu.studentNo) ELSE NULL END AS "英语",8
t1.validateCount AS '有效科目数',9
t2.validateAVG AS '有效平均分'10
FROM11
student stu,12
(SELECT s.studentNo, COUNT(*) AS validateCount FROM score s WHERE s.CourseNo IN (1, 2, 3) GROUP BY s.StudentNo) as t1,13
(SELECT s.studentNo, AVG(s.score) AS validateAVG FROM score s WHERE s.CourseNo IN (1, 2, 3) GROUP BY s.StudentNo) as t214
WHERE15
stu.studentNo = t1.studentNo16
AND17
stu.studentNo = t2.studentNo18
ORDER BY stu.StudentNo-- 另外,参考博客中博主给出的答案如下,比我的就简洁多了,
-- 其次,他在这里的有效课程数和有效平均分是针对学生所有的成绩,而并非此处的仅仅三科
-- 因为题意也不是很清楚,也就作罢,正好算是两种形式吧
SELECT
s.StudentNo,
(SELECT s1.score FROM score s1 WHERE s1.CourseNo=1 AND s1.StudentNo = s.StudentNo) AS "语文",
(SELECT s2.score FROM score s2 WHERE s2.CourseNo=2 AND s2.StudentNo = s.StudentNo) AS "数学",
(SELECT s3.score FROM score s3 WHERE s3.CourseNo=3 AND s3.StudentNo = s.StudentNo) AS "英语",
COUNT(s.CourseNo) AS "有效课程数",
AVG(s.score) AS "有效平均分"
FROM
score s
GROUP BY s.StudentNo
ORDER BY s.StudentNo14
1
-- 另外,参考博客中博主给出的答案如下,比我的就简洁多了,2
-- 其次,他在这里的有效课程数和有效平均分是针对学生所有的成绩,而并非此处的仅仅三科3
-- 因为题意也不是很清楚,也就作罢,正好算是两种形式吧4
SELECT5
s.StudentNo,6
(SELECT s1.score FROM score s1 WHERE s1.CourseNo=1 AND s1.StudentNo = s.StudentNo) AS "语文",7
(SELECT s2.score FROM score s2 WHERE s2.CourseNo=2 AND s2.StudentNo = s.StudentNo) AS "数学",8
(SELECT s3.score FROM score s3 WHERE s3.CourseNo=3 AND s3.StudentNo = s.StudentNo) AS "英语",9
COUNT(s.CourseNo) AS "有效课程数",10
AVG(s.score) AS "有效平均分"11
FROM12
score s13
GROUP BY s.StudentNo14
ORDER BY s.StudentNo(18)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
SELECT
s.CourseNo,
MAX(s.score),
MIN(s.score)
FROM
score s
GROUP BY
s.CourseNo8
1
SELECT2
s.CourseNo,3
MAX(s.score),4
MIN(s.score)5
FROM6
score s7
GROUP BY8
s.CourseNo(19)按各科平均成绩从低到高和及格率的百分数从高到低顺序;
-- 看了下上次在Github上写的,不得不说,practice makes perfect
SELECT
s.CourseNo,
c.name,
AVG(s.score) AS '平均分',
SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END) AS '及格数',
COUNT(*) AS '总数',
SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END)/COUNT(*)*100 AS '及格率'
FROM
score s,
course c
WHERE
s.CourseNo = c.courseNo
GROUP BY s.CourseNo
ORDER BY AVG(s.score), SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END)/COUNT(*) DESC15
1
-- 看了下上次在Github上写的,不得不说,practice makes perfect2
SELECT3
s.CourseNo,4
c.name,5
AVG(s.score) AS '平均分',6
SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END) AS '及格数',7
COUNT(*) AS '总数',8
SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END)/COUNT(*)*100 AS '及格率'9
FROM10
score s,11
course c12
WHERE13
s.CourseNo = c.courseNo14
GROUP BY s.CourseNo15
ORDER BY AVG(s.score), SUM(CASE WHEN s.score > 60 THEN 1 ELSE 0 END)/COUNT(*) DESC还不完全,参考原博主,加isnull
(20)查询不同老师所教不同课程平均分从高到低显示
SELECT
c1.name,
t1.name,
AVG(s1.score)
FROM
score s1,
course c1,
teacher t1
WHERE
s1.CourseNo = c1.courseNo
AND
c1.teacherNo = t1.teacherNo
GROUP BY s1.CourseNo
ORDER BY AVG(s1.score) DESC14
1
SELECT2
c1.name,3
t1.name,4
AVG(s1.score)5
FROM6
score s1,7
course c1,8
teacher t19
WHERE10
s1.CourseNo = c1.courseNo11
AND12
c1.teacherNo = t1.teacherNo13
GROUP BY s1.CourseNo14
ORDER BY AVG(s1.score) DESC(21)统计列印各科成绩,各分数段人数:课程ID,课程名称,(100-85),(85-70,(70-60),( 低于60)
SELECT
c.courseNo AS '课程ID',
c.name AS '课程名称',
SUM(CASE WHEN s.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '(100-85)',
SUM(CASE WHEN s.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS '(85-70)',
SUM(CASE WHEN s.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS '(70-60)',
SUM(CASE WHEN s.score < 60 THEN 1 ELSE 0 END) AS '(低于60)'
FROM
course c,
score s
WHERE
c.courseNo = s.CourseNo
GROUP BY c.courseNo13
1
SELECT2
c.courseNo AS '课程ID',3
c.name AS '课程名称',4
SUM(CASE WHEN s.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '(100-85)',5
SUM(CASE WHEN s.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS '(85-70)',6
SUM(CASE WHEN s.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS '(70-60)',7
SUM(CASE WHEN s.score < 60 THEN 1 ELSE 0 END) AS '(低于60)'8
FROM9
course c,10
score s11
WHERE12
c.courseNo = s.CourseNo13
GROUP BY c.courseNo(22)查询各科成绩前三名的记录(不考虑成绩并列情况)
SELECT
*
FROM
score s
WHERE
(
SELECT
COUNT(*)
FROM
score s1
WHERE
s1.CourseNo = s.CourseNo
AND
s1.score > s.score
) < 3
ORDER BY s.CourseNo16
1
SELECT2
*3
FROM4
score s5
WHERE6
(7
SELECT8
COUNT(*)9
FROM10
score s111
WHERE12
s1.CourseNo = s.CourseNo13
AND14
s1.score > s.score15
) < 316
ORDER BY s.CourseNo(23)查询每门课程被选修的学生数
SELECT
c.name AS '课程',
COUNT(s.StudentNo) AS '选修学生数'
FROM
course c LEFT JOIN score s ON c.courseNo = s.CourseNo
GROUP BY c.courseNo6
1
SELECT2
c.name AS '课程',3
COUNT(s.StudentNo) AS '选修学生数'4
FROM5
course c LEFT JOIN score s ON c.courseNo = s.CourseNo6
GROUP BY c.courseNo(24)查询出只选修了一门课程的全部学生的学号和姓名
SELECT
stu1.StudentNo AS '学号',
stu1.name AS '姓名'
FROM
(SELECT StudentNo, COUNT(CourseNo) AS amount FROM score GROUP BY StudentNo) t1,
student stu1
WHERE
t1.StudentNo = stu1.studentNo
AND
t1.amount = 110
1
SELECT2
stu1.StudentNo AS '学号',3
stu1.name AS '姓名'4
FROM5
(SELECT StudentNo, COUNT(CourseNo) AS amount FROM score GROUP BY StudentNo) t1,6
student stu17
WHERE8
t1.StudentNo = stu1.studentNo9
AND10
t1.amount = 1SELECT
stu1.studentNo AS '学号',
stu1.name AS '姓名'
FROM
score s,
student stu1
WHERE
s.StudentNo = stu1.studentNo
GROUP BY s.StudentNo
HAVING COUNT(s.CourseNo) = 110
1
SELECT2
stu1.studentNo AS '学号',3
stu1.name AS '姓名'4
FROM5
score s,6
student stu17
WHERE8
s.StudentNo = stu1.studentNo9
GROUP BY s.StudentNo10
HAVING COUNT(s.CourseNo) = 1(25)查询男生、女生的人数
SELECT
s.sex AS '性别',
COUNT(*) AS '人数'
FROM
student s
GROUP BY s.sex6
1
SELECT2
s.sex AS '性别',3
COUNT(*) AS '人数'4
FROM5
student s6
GROUP BY s.sex(26)查询同名同姓学生名单,并统计同名人数
SELECT
s.name AS '姓名',
COUNT(*) AS '学生数'
FROM
student s
GROUP BY s.name6
1
SELECT2
s.name AS '姓名',3
COUNT(*) AS '学生数'4
FROM5
student s6
GROUP BY s.name(27)查询1991年出生的学生名单
SELECT
s.name AS '姓名'
FROM
student s
WHERE
YEAR(CURDATE()) - s.age = 19916
1
SELECT2
s.name AS '姓名'3
FROM4
student s5
WHERE6
YEAR(CURDATE()) - s.age = 1991(28)查询每门课程的平均成绩,结果按平均成绩升序排列
#未考虑到课程无人选修的情况
SELECT
c.name AS '课程名称',
AVG(s.score) AS '平均成绩'
FROM
score s,
course c
WHERE
s.CourseNo = c.courseNo
GROUP BY c.courseNo
ORDER BY AVG(s.score)
#如果某课程无人选修,其平均成绩显示为null
SELECT
c.name AS '课程名称',
AVG(s.score) AS '平均成绩'
FROM
course c LEFT JOIN score s ON c.courseNo = s.CourseNo
GROUP BY c.courseNo
ORDER BY AVG(s.score)22
1
#未考虑到课程无人选修的情况2
SELECT3
c.name AS '课程名称',4
AVG(s.score) AS '平均成绩'5
FROM6
score s,7
course c8
WHERE9
s.CourseNo = c.courseNo10
GROUP BY c.courseNo11
ORDER BY AVG(s.score)12
13
14
15
#如果某课程无人选修,其平均成绩显示为null16
SELECT17
c.name AS '课程名称',18
AVG(s.score) AS '平均成绩'19
FROM20
course c LEFT JOIN score s ON c.courseNo = s.CourseNo21
GROUP BY c.courseNo 22
ORDER BY AVG(s.score)(29)查询平均成绩大于85的所有学生的学号、姓名和平均成绩
SELECT
stu.studentNo AS '学号',
stu.name AS '姓名',
AVG(s.score) AS '平均成绩'
FROM
score s,
student stu
WHERE
s.StudentNo = stu.studentNo
GROUP BY s.StudentNo
HAVING AVG(s.score) > 8511
1
SELECT2
stu.studentNo AS '学号',3
stu.name AS '姓名',4
AVG(s.score) AS '平均成绩'5
FROM6
score s,7
student stu8
WHERE9
s.StudentNo = stu.studentNo10
GROUP BY s.StudentNo11
HAVING AVG(s.score) > 85(30)查询课程名称为“数学”,且分数低于60的学生姓名和分数
SELECT
stu.name AS '姓名',
s.score AS '数学成绩'
FROM
score s,
course c,
student stu
WHERE
s.CourseNo = c.courseNo
AND
s.StudentNo = stu.studentNo
AND
c.name = '数学'
AND
s.score < 6015
1
SELECT2
stu.name AS '姓名',3
s.score AS '数学成绩'4
FROM5
score s,6
course c,7
student stu8
WHERE9
s.CourseNo = c.courseNo10
AND11
s.StudentNo = stu.studentNo12
AND13
c.name = '数学'14
AND15
s.score < 60(31)查询所有学生的选课情况
SELECT
stu.name AS '姓名',
c.name AS '选课'
FROM
score s,
course c,
student stu
WHERE
s.CourseNo = c.courseNo
AND
s.StudentNo = stu.studentNo
ORDER BY stu.name12
1
SELECT2
stu.name AS '姓名',3
c.name AS '选课'4
FROM5
score s,6
course c,7
student stu8
WHERE9
s.CourseNo = c.courseNo10
AND11
s.StudentNo = stu.studentNo12
ORDER BY stu.name(32)查询任何一门课程成绩在70分以上的姓名、课程名称和分数
SELECT
stu.name AS '姓名',
c.name AS '课程名称',
s.score AS '分数'
FROM
score s,
student stu,
course c
WHERE
s.StudentNo = stu.studentNo
AND
s.CourseNo = c.courseNo
AND
s.score > 7014
1
SELECT2
stu.name AS '姓名',3
c.name AS '课程名称',4
s.score AS '分数'5
FROM6
score s,7
student stu,8
course c9
WHERE10
s.StudentNo = stu.studentNo11
AND12
s.CourseNo = c.courseNo13
AND14
s.score > 70(33)查询不及格的课程,并按课程号从大到小排列
#包含不及格记录的课程
SELECT DISTINCT
c.courseNo AS '课程号',
c.name AS '课程名称'
FROM
score s,
course c
WHERE
s.CourseNo = c.courseNo
AND
s.score < 60
#不及格的课程的选修记录
SELECT
stu.name AS '姓名',
c.name AS '课程名称',
s.score AS '分数'
FROM
score s,
student stu,
course c
WHERE
s.StudentNo = stu.studentNo
AND
s.CourseNo = c.courseNo
AND
s.score < 60
ORDER BY c.courseNo DESC28
1
#包含不及格记录的课程2
SELECT DISTINCT3
c.courseNo AS '课程号',4
c.name AS '课程名称' 5
FROM6
score s,7
course c8
WHERE9
s.CourseNo = c.courseNo10
AND11
s.score < 6012
13
#不及格的课程的选修记录14
SELECT15
stu.name AS '姓名',16
c.name AS '课程名称',17
s.score AS '分数'18
FROM19
score s,20
student stu,21
course c22
WHERE23
s.StudentNo = stu.studentNo24
AND25
s.CourseNo = c.courseNo26
AND27
s.score < 6028
ORDER BY c.courseNo DESC(34)查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
SELECT
stu.studentNo AS '学号',
stu.name AS '姓名'
FROM
score s,
student stu
WHERE
s.StudentNo = stu.studentNo
AND
s.CourseNo = 3
AND
s.score > 8012
1
SELECT2
stu.studentNo AS '学号',3
stu.name AS '姓名'4
FROM5
score s,6
student stu7
WHERE8
s.StudentNo = stu.studentNo9
AND10
s.CourseNo = 311
AND12
s.score > 80(35)求选了课程的学生人数
#method-1
SELECT
COUNT(DISTINCT s.StudentNo) AS '选了课程的学生人数'
FROM
score s
#method-2
SELECT
COUNT(*) AS '选了课程的学生人数'
FROM
(SELECT * FROM score s GROUP BY s.StudentNo) t11
1
#method-12
SELECT3
COUNT(DISTINCT s.StudentNo) AS '选了课程的学生人数'4
FROM5
score s6
7
#method-28
SELECT9
COUNT(*) AS '选了课程的学生人数'10
FROM11
(SELECT * FROM score s GROUP BY s.StudentNo) t(36)查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩
SELECT
stu.name AS '学生姓名',
s.score AS '成绩'
FROM
score s,
student stu,
course c,
teacher t
WHERE
s.StudentNo = stu.studentNo
AND
s.CourseNo = c.courseNo
AND
c.teacherNo = t.teacherNo
AND
t.name = '杨艳'
ORDER BY s.score DESC
LIMIT 0, 118
1
SELECT2
stu.name AS '学生姓名',3
s.score AS '成绩'4
FROM5
score s,6
student stu,7
course c,8
teacher t9
WHERE10
s.StudentNo = stu.studentNo11
AND12
s.CourseNo = c.courseNo13
AND14
c.teacherNo = t.teacherNo15
AND16
t.name = '杨艳'17
ORDER BY s.score DESC18
LIMIT 0, 1(37)查询各个课程及相应的选修人数
SELECT
c.name AS '课程名称',
COUNT(*) AS '选修人数'
FROM
score s,
course c
WHERE
s.CourseNo = c.courseNo
GROUP BY s.CourseNo9
1
SELECT2
c.name AS '课程名称',3
COUNT(*) AS '选修人数'4
FROM5
score s,6
course c7
WHERE8
s.CourseNo = c.courseNo9
GROUP BY s.CourseNo(38)查询不同课程但成绩相同的学生的学号、课程号、学生成绩
#method-1
SELECT
s.StudentNo AS '学号',
s.CourseNo AS '课程号',
s.score AS '成绩'
FROM
score s
WHERE
(SELECT COUNT(*) FROM score s1 WHERE s1.score = s.score AND s1.CourseNo <> s.COurseNo) > 0
ORDER BY s.score DESC, s.StudentNo, s.CourseNo
#method-2
SELECT DISTINCT
s1.StudentNo AS '学号',
s1.CourseNo AS '课程号',
s1.score AS '成绩'
FROM
score s1,
score s2
WHERE
s1.score = s2.score
AND
s1.CourseNo <> s2.CourseNo
ORDER BY s1.score DESC, s1.StudentNo, s1.CourseNox
1
#method-12
SELECT3
s.StudentNo AS '学号',4
s.CourseNo AS '课程号',5
s.score AS '成绩'6
FROM7
score s8
WHERE9
(SELECT COUNT(*) FROM score s1 WHERE s1.score = s.score AND s1.CourseNo <> s.COurseNo) > 010
ORDER BY s.score DESC, s.StudentNo, s.CourseNo11
12
#method-213
SELECT DISTINCT14
s1.StudentNo AS '学号',15
s1.CourseNo AS '课程号',16
s1.score AS '成绩'17
FROM18
score s1,19
score s220
WHERE21
s1.score = s2.score 22
AND23
s1.CourseNo <> s2.CourseNo24
ORDER BY s1.score DESC, s1.StudentNo, s1.CourseNo(39)查询每门课程成绩最好的前两名
SELECT
s.CourseNo AS '课程号',
s.StudentNo AS '学号',
s.score AS '分数'
FROM
score s
WHERE
(SELECT COUNT(*) FROM score s1 WHERE s1.CourseNo = s.CourseNo AND s1.score > s.score) < 2
ORDER BY s.CourseNo1
SELECT2
s.CourseNo AS '课程号',3
s.StudentNo AS '学号',4
s.score AS '分数'5
FROM6
score s7
WHERE8
(SELECT COUNT(*) FROM score s1 WHERE s1.CourseNo = s.CourseNo AND s1.score > s.score) < 29
ORDER BY s.CourseNo持续更新:
2017-06-28