您的位置:首页 > 数据库 > MySQL

MySQL经典SQL语句练习题分析

2019-05-25 20:42 537 查看
版权声明:本文为博主整理文章,未经博主允许不得转载。 https://blog.csdn.net/ZYZMZM_/article/details/90524765

文章目录

数据定义

自行创建数据库,添加如下四张数据表:

----------------------- 学生表 ------------------------
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`)
);

TEST EXAMPLE:

----------------------- 学生表测试数据 ---------------------------
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);

题目描述

-- 1.	查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
-- 2.	查询“01”课程比“02”课程成绩高的学生的信息以及课程分数
-- 3.	查询每门课程被选修的学生数
-- 4.	查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
-- 		按课程编号升序排列
-- 5.	查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
-- 6.	查询课程名称为"数学",且分数低于60的学生姓名和分数
-- 7.	查询“01”课程学生考试成绩的最高分、最低分以及平均考试成绩
-- 8.	查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
-- 9.	查询"李"姓老师的数量
-- 10.	查询没学过"张三"老师授课的同学的信息
-- 11.	查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
-- 12.	查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
-- 13.	查询没有学全所有课程的同学的信息
-- 14.	检索"01"课程分数小于60,按分数降序排列的学生信息
-- 15.	按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
-- 16.	查询不同老师所教不同课程平均分从高到低显示

题目解答

1、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

SELECT a.s_id,
a.s_name,
ROUND(AVG(s_score),1) AS Score
FROM student a
JOIN score b
ON  a.s_id=b.s_id
GROUP BY b.s_id
HAVING AVG(s_score) >=60;

2、 查询“01”课程比“02”课程成绩高的学生的信息以及课程分数

SELECT a.*,
b.s_score AS "01 Score",
c.s_score AS "02 Score"
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id` AND b.`c_id`=01
JOIN score c
ON a.`s_id`=c.`s_id` AND c.`c_id`=02
WHERE b.`s_score`>c.`s_score`;

3、查询每门课程被选修的学生数

SELECT a.c_name AS "课程名称",
COUNT(*) AS "选修学生数"
FROM course a
JOIN score b
ON a.`c_id`=b.`c_id`
GROUP BY b.`c_id`;

4、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

SELECT a.`c_name` AS "course",
ROUND(AVG(b.`s_score`),2) AS avg_Score
FROM course a
JOIN score b
ON a.`c_id`=b.`c_id`
GROUP BY b.`c_id`
ORDER BY avg_Score DESC,b.`c_id` ASC;

5、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

SELECT a.`s_id` AS id,
a.`s_name` AS NAME,
ROUND(AVG(b.`s_score`),2) AS Avg_Score
FROM student a
JOIN score b
ON a.`s_id` = b.`s_id`
GROUP BY b.`s_id`
HAVING Avg_Score >= 85;

6、查询课程名称为"数学",且分数低于60的学生姓名和分数

SELECT a.`s_name` AS NAME,
c.`c_name` AS course,
b.`s_score` AS score
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id`
JOIN course c
ON b.`c_id`=c.`c_id`
WHERE c.`c_name`="数学" AND b.`s_score` < 60;

7、查询“01”课程学生考试成绩的最高分、最低分以及平均考试成绩

SELECT b.`c_name` AS course,
MAX(a.`s_score`) AS max_score,
MIN(a.`s_score`) AS min_score,
ROUND(AVG(a.`s_score`),2) AS avg_score
FROM score a
JOIN course b
ON a.`c_id`=b.`c_id`
WHERE a.`c_id`=01;

8、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECT a.`s_id` AS id,
a.`s_name` AS NAME,
COUNT(*) AS course_num,
ROUND(AVG(b.`s_score`),2) AS avg_score
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id`
GROUP BY b.`s_id`;

9、查询"李"姓老师的数量

SELECT COUNT(*) AS name_li_num
FROM teacher
WHERE t_name LIKE "李%";

10、查询没学过"张三"老师授课的同学的信息

SELECT * FROM student WHERE s_id
NOT IN(
SELECT a.s_id
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id`
JOIN course c
ON b.`c_id`=c.`c_id`
WHERE c.`c_id` =(
SELECT `t_id`
FROM teacher
WHERE t_name="张三"));

11、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

SELECT a.*
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id` AND b.`c_id` = 01
JOIN score c
ON a.`s_id`=c.`s_id` AND c.`c_id` = 02
WHERE b.`s_id`=c.`s_id`;

12、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

SELECT a.*
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id` AND b.`c_id`=01
WHERE b.`s_id` NOT IN (
SELECT c.`s_id`
FROM score c
WHERE c.`c_id`=02);

13、查询没有学全所有课程的同学的信息

SELECT *
FROM student stu
WHERE stu.`s_id` NOT IN(
SELECT s.`s_id`
FROM score s
GROUP BY s.`s_id`
HAVING COUNT(s.`s_id`)=(
SELECT COUNT(*)
FROM course));

14、检索"01"课程分数小于60,按分数降序排列的学生信息

SELECT a.`s_id` AS id,
a.`s_name` AS NAME,
b.`s_score` AS score
FROM student a
JOIN score b
ON a.`s_id`=b.`s_id`
WHERE b.`c_id`=01 AND b.`s_score` < 60
ORDER BY b.`s_score` DESC;

15、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT
b.`s_id` AS stu_id,
b.`s_name` AS stu_name,
AVG(a.`s_score`) AS avg_acore,
(SELECT s_score FROM score
WHERE s_id=a.`s_id` AND c_id='01') AS "语文",
(SELECT s_score FROM score
WHERE s_id=a.`s_id` AND c_id='02') AS "数学",
(SELECT s_score FROM score
WHERE s_id=a.`s_id` AND c_id='03') AS "英语"
FROM score a
RIGHT JOIN student b
ON b.`s_id`=a.`s_id`
GROUP BY a.`s_id`
ORDER BY avg_acore DESC;

16、查询不同老师所教不同课程平均分从高到低显示

SELECT c.`t_name` AS Teacher_name,
b.`c_name` AS course,
ROUND(AVG(a.`s_score`),2) AS avg_score
FROM score a
JOIN course b
ON a.`c_id`=b.`c_id`
JOIN teacher c
ON b.`t_id`=c.`t_id`
GROUP BY a.`c_id`
ORDER BY avg_score DESC;

其他题目参考:
《MySQL经典练习题》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: