MySQL經典SQL語句練習題分析

數據定義

自行創建數據庫,添加如下四張數據表:

----------------------- 學生表 ------------------------
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經典練習題》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章