简介:所用到的四个表格
粗略读过一遍《SQL基础教程》后,利用周末刷了一组经典的MySQL面试题,来和大家分享。主要是一些有关SQL查询的题目,也有几道涉及表的更新。有很多地方也许有更简单写法,请大神们指教~
题目中共有四个表格:
- student表
储存学生信息的表格,含有4个字段,分别是:Sid,Sname,Sage,Ssex;代表了学生的学号,姓名,年龄,性别
- sc表
储存学生成绩的表格,含有3个字段,分别是:Sid,Cid,score;代表了学生的学号,科目的代号,学生该科目的成绩
- course表
储存科目信息的表格,含有3个字段,分别是:Cid,Cname,Tid;代表了科目的代号,科目的名字,教授该科目的老师代号
**- teacher表**
储存老师信息的表格,含有2个字段,分别是:Tid,Tname;代表了老师的代号,老师的名字
50道题目及答案
有关查询的题目
(因为是练习题目,所以尽可能写了多种写法)
- 各科的报考人数
SELECT sc.Cid AS 科目代号, course.Cname AS 科目, COUNT(*) AS 报考人数 from sc
INNER JOIN course ON course.Cid = sc.Cid
GROUP BY sc.Cid;
-- 也可以使用子查询去写
SELECT DISTINCT A.Cid AS 科目代号,
(SELECT B.Cname FROM course B WHERE B.Cid = A.Cid) AS 科目,
(SELECT COUNT(*) FROM sc C WHERE C.Cid = A.Cid) AS 报考人数
from sc A;
- 每个学生的参与课程号
SELECT student.Sid, student.Sname, course.Cname FROM student
INNER JOIN sc ON sc.Sid = student.Sid
INNER JOIN course ON course.Cid = sc.Cid
ORDER BY student.Sid ASC;
- 各课程老师的名字
SELECT course.Cname AS 课程, teacher.Tname AS 授课老师 FROM course
INNER JOIN teacher ON teacher.Tid = course.Tid;
-- 也可以使用子查询去写
SELECT Cname AS 课程,
(SELECT Tname FROM teacher WHERE teacher.Tid = course.Tid) AS 授课老师
FROM course;
- 每个老师所教的课程名
-- 与第3题相同,只是改变两列的顺序
SELECT teacher.Tname AS 授课老师, course.Cname AS 课程 FROM teacher
INNER JOIN course ON course.Tid = teacher.Tid;
-- 也可以使用子查询去写
SELECT teacher.Tname AS 授课老师,
(SELECT Cname FROM course WHERE course.Tid = teacher.Tid) AS 课程
FROM teacher;
- 每个学生的最高分
SELECT A.Sid AS 学号, A.Sname AS 学生姓名,
(SELECT MAX(sc.score) FROM sc WHERE sc.Sid = A.Sid) AS 最高分数,
(SELECT course.Cname FROM course
INNER JOIN sc B ON B.Cid = course.Cid
WHERE B.Sid = A.Sid AND B.score = 最高分数) AS 最高成绩科目
FROM student A;
- 每科中的最高分是谁
SELECT Cname AS 科目,
(SELECT MAX(score) FROM sc WHERE sc.Cid = course.Cid) AS 最高分,
(SELECT Sname FROM student
INNER JOIN sc ON sc.Sid = student.Sid
WHERE sc.score = 最高分) AS 最高分同学
FROM course;
-- 不想要最高分列的话,可以将可以查询到每科`最高分`的代码写在`最高分同学`的子查询中
SELECT Cname AS 科目,
(SELECT Sname FROM student
INNER JOIN sc ON sc.Sid = student.Sid
WHERE sc.score = (SELECT MAX(score) FROM sc WHERE sc.Cid = course.Cid)) AS 最高分同学
FROM course;
- 每科中的最高分是谁
-- 将题目理解为每位同学所选修的所有科目中哪个科目成绩最高
SELECT Sid AS 学号, Sname AS 学生姓名,
(SELECT MAX(score) FROM sc WHERE Sid = student.Sid) AS 该学生最高分,
(SELECT Cname FROM course
LEFT JOIN sc on sc.Cid = course.Cid
WHERE Sid = student.Sid AND score = 该学生最高分) AS 最高分数科目
FROM student;
-- 不想要最高分列的话,可以将可以查询到每科`最高分`的代码写在`最高分同学`的子查询中
SELECT Sid AS 学号, Sname AS 学生姓名,
(SELECT Cname FROM course
LEFT JOIN sc SC1 on SC1.Cid = course.Cid
WHERE SC1.Sid = student.Sid
AND
SC1.score = (SELECT MAX(SC2.score) FROM sc SC2 WHERE SC2.Sid = student.Sid))
AS 最高分数科目
FROM student;
- 同时学了数学,语文的学生
SELECT student.Sid AS 学号, student.Sname AS 学生姓名 FROM student
WHERE student.Sid IN (SELECT sc.Sid FROM sc
LEFT JOIN course
ON course.Cid = sc.Cid
WHERE course.Cname = "数学")
AND
student.Sid IN (SELECT sc.Sid FROM sc
LEFT JOIN course
ON course.Cid = sc.Cid
WHERE course.Cname = "语文");
- 每个课程的报考人数
SELECT Cid AS 科目代号, Cname AS 科目,
(SELECT COUNT(sc.Sid)
FROM sc
WHERE sc.Cid = course.Cid) AS 报考人数
FROM course;
- 所有课程都及格的学生
-- 理解题目:所有课程都及格,也就是该学生的最低分大于等于60
SELECT Sid, Sname FROM student