數據定義
自行創建數據庫,添加如下四張數據表:
----------------------- 學生表 ------------------------
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經典練習題》