前言
推荐
说明
SQL面试50题
50题
测试数据
1、查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点)
2、查询平均成绩大于60分的学生的学号和平均成绩(简单,第二道重点)
3、查询所有学生的学号、姓名、选课数、总成绩(不重要)
4、查询姓“猴”的老师的个数(不重要)
5、查询没学过“张三”老师课的学生的学号、姓名(重点)
6、查询学过“张三”老师所教的所有课的同学的学号、姓名(重点)
7、查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名(重点)
8、查询课程编号为“02”的总成绩(不重点)
9、查询所有课程成绩小于60分的学生的学号、姓名
10、查询没有学全所有课的学生的学号、姓名(重点)
11、查询至少有一门课与学号为“01”的学生所学课程相同的学生的学号和姓名(重点)
12、查询和“01”号同学所学课程完全相同的其他同学的学号(重点)
13、查询没学过"张三"老师讲授的任一门课程的学生姓名 和47题一样(重点,能做出来)
15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩(重点)
16、检索"01"课程分数小于60,按分数降序排列的学生信息(和34题重复,不重点)
17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩(重重点与35一样)
18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
19、按各科成绩进行排序,并显示排名(重点row_number)
20、查询学生的总成绩并进行排名(不重点)
21 、查询不同老师所教不同课程平均分从高到低显示(不重点)
22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(重要 25类似)
23、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称(重点和18题类似)
24、查询学生平均成绩及其名次(同19题,重点)
25、查询各科成绩前三名的记录(不考虑成绩并列情况)(重点 与22题类似)
26、查询每门课程被选修的学生数(不重点)
27、 查询出只有两门课程的全部学生的学号和姓名(不重点)
28、查询男生、女生人数(不重点)
29、查询名字中含有"风"字的学生信息(不重点)
30、题忽略掉
31、查询1990年出生的学生名单(重点year)
32、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩(不重要)
33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列(不重要)
34、查询课程名称为"数学",且分数低于60的学生姓名和分数(不重点)
35、查询所有学生的课程及分数情况(重点)
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数(重点)
37、查询不及格的课程并按课程号从大到小排列(不重点)
38、查询课程编号为03且课程成绩在80分以上的学生的学号和姓名(不重要)
39、求每门课程的学生人数(不重要)
40、查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩(重要top)
41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 (重点)
42、查询每门功成绩最好的前两名(同22和25题)
43、统计每门课程的学生选修人数(超过5人的课程才统计)。
44、检索至少选修两门课程的学生学号(不重要)
45、 查询选修了全部课程的学生信息(重点划红线地方)
47、查询没学过“张三”老师讲授的任一门课程的学生姓名
48、查询两门以上不及格课程的同学的学号及其平均成绩
46、查询各学生的年龄(精确到月份)
47、查询本月过生日的学生(无法使用week、date(now())
另外
总结
最值查询
7种SQL JOINS的实现
最后
前言
当时学mysql的时候是自己看书学的,学的不是很深刻
经过一天的阅读MQL,大概懂了多表查询和子查询
推荐
MySQL笔记:第06章_多表查询
MySQL笔记:第09章_子查询
SQL面试必会50题
说明
练习此篇之前,建议看一看推荐文章,了解MQL:如连接查询和子查询
或者了解一定数据库原理:如关系代数:选择、投影、连接、除运算
SQL经典面试50题
学生表:
Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
课程表:
Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号
教师表:
Teacher(t_id,t_name) –教师编号,教师姓名
成绩表:
Score(s_id,c_id,s_s_score) –学生编号,课程编号,分数
据以上信息按照下面要求写出对应的SQL语句。
ps:这些题考察SQL的编写能力,对于这类型的题目,需要你先把4张表之间的关联关系搞清楚了,最好的办法是自己在草稿纸上画关联图,然后再编写对应的SQL语句就比较容易了。下图是我在草稿纸上画的这4张表的关系图,不好理解,你可以列举一些数据案例来辅助理解:
数据
-- 学生表
CREATE TABLE `Student`(
`s_id` VARCHAR(20),
`s_name` VARCHAR(20) NOT NULL DEFAULT '',
`s_birth` VARCHAR(20) NOT NULL DEFAULT '',
`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY(`s_id`)
);
-- 课程表
CREATE TABLE `Course`(
`c_id` VARCHAR(20),
`c_name` VARCHAR(20) NOT NULL DEFAULT '',
`t_id` VARCHAR(20) NOT NULL,
PRIMARY KEY(`c_id`)
);
-- 教师表
CREATE TABLE `Teacher`(
`t_id` VARCHAR(20),
`t_name` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(`t_id`)
);
CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
);
-- 插入学生表测试数据
INSERT INTO Student VALUES('01' , '赵雷' , '1990-01-01' , '男');
INSERT INTO Student VALUES('02' , '钱电' , '1990-12-21' , '男');
INSERT INTO Student VALUES('03' , '孙风' , '1990-05-20' , '男');
INSERT INTO Student VALUES('04' , '李云' , '1990-08-06' , '男');
INSERT INTO Student VALUES('05' , '周梅' , '1991-12-01' , '女');
INSERT INTO Student VALUES('06' , '吴兰' , '1992-03-01' , '女');
INSERT INTO Student VALUES('07' , '郑竹' , '1989-07-01' , '女');
INSERT INTO Student VALUES('08' , '王菊' , '1990-01-20' , '女');
-- 课程表测试数据
INSERT INTO Course VALUES('01' , '语文' , '02');
INSERT INTO Course VALUES('02' , '数学' , '01');
INSERT INTO Course VALUES('03' , '英语' , '03');
-- 教师表测试数据
INSERT INTO Teacher VALUES('01' , '张三');
INSERT INTO Teacher VALUES('02' , '李四');
INSERT INTO Teacher VALUES('03' , '王五');
-- 成绩表测试数据
INSERT INTO Score VALUES('01' , '01' , 80);
INSERT INTO Score VALUES('01' , '02' , 90);
INSERT INTO Score VALUES('01' , '03' , 99);
INSERT INTO Score VALUES('02' , '01' , 70);
INSERT INTO Score VALUES('02' , '02' , 60);
INSERT INTO Score VALUES('02' , '03' , 80);
INSERT INTO Score VALUES('03' , '01' , 80);
INSERT INTO Score VALUES('03' , '02' , 80);
INSERT INTO Score VALUES('03' , '03' , 80);
INSERT INTO Score VALUES('04' , '01' , 50);
INSERT INTO Score VALUES('04' , '02' , 30);
INSERT INTO Score VALUES('04' , '03' , 20);
INSERT INTO Score VALUES('05' , '01' , 76);
INSERT INTO Score VALUES('05' , '02' , 87);
INSERT INTO Score VALUES('06' , '01' , 31);
INSERT INTO Score VALUES('06' , '03' , 34);
INSERT INTO Score VALUES('07' , '02' , 89);
INSERT INTO Score VALUES('07' , '03' , 98);
查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点)
# 法一
#zx
SELECT a.s_id"s_no" ,c.`s_name`"s_name",a.s_score"s_01",b.s_score"s_02" FROM
(SELECT s_id,c_id,s_score FROM score WHERE c_id='01')
AS a
INNER JOIN
(SELECT s_id,c_id,s_score FROM score WHERE c_id='02')
AS b ON a.s_id=b.s_id
INNER JOIN student AS c ON c.`s_id`=a.s_id
WHERE a.s_score>b.s_score
#1、查询"01""课程比"O2""课程成绩高的学生的信息及课程分数
# 法二
SELECT student.*,score.c_id,score.s_score
FROM student
JOIN score
ON student.s_id=score.s_id
WHERE student.s_id IN(
SELECT a.s_id FROM (SELECT s_id,c_id,s_score FROM score WHERE c_id='01') AS a
LEFT JOIN (SELECT s_id,c_id,s_score FROM score WHERE c_id='02') AS b
ON a.s_id=b.s_id
WHERE a.s_score>b.s_score OR b.s_id IS NULL
)
#me
SELECT s_id
FROM student
WHERE s_id IN(
SELECT a.s_id
FROM (SELECT s_id,c_id,s_score FROM score WHERE c_id='01') AS a
INNER JOIN
(SELECT s_id,c_id,s_score FROM score WHERE c_id='02') AS b
ON a.s_id=b.s_id
WHERE a.s_score>b.s_score
)
查询平均成绩大于60分的学生的学号和平均成绩(简单,第二道重点)
#zx
SELECT
s_id,AVG(s_score)
FROM score
GROUP BY s_id HAVING AVG(s_score)>60
#me
SELECT s_id,AVG(s_score)
FROM score
GROUP BY s_id
HAVING AVG(s_score) > 60
#查询平均成绩大于60分的学生的学号和平均成绩 类似的题目(重点)
#法一:
-- 9、查询所有课程成绩小于60分的学生的学号、姓名
SELECT *
FROM student
WHERE s_id NOT IN
(SELECT s_id FROM score WHERE s_score>=60);
#错误的答案(不包含无成绩的)
SELECT *
FROM student
WHERE s_id IN
(SELECT s_id FROM score WHERE s_score<60);
# 法二
-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)
#IFNULL如果第一个值不为NULL返回第一个值,否则返回第二个值
SELECT student.s_id,student.s_name,AVG(IFNULL(score.s_score,0)) AS AVG
FROM student
LEFT JOIN score
ON student.s_id=score.s_id
GROUP BY student.s_id
HAVING AVG(score.s_score)IS NULL OR AVG(score.s_score)<60
查询所有学生的学号、姓名、选课数、总成绩(不重要)