一、表關係
二、操作表
1、創建表結構
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS class; CREATE TABLE class ( cid TINYINT (4) NOT NULL AUTO_INCREMENT, caption VARCHAR (32) NOT NULL, PRIMARY KEY (cid) ) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; DROP TABLE IF EXISTS student; CREATE TABLE `student` ( `sid` TINYINT (4) NOT NULL AUTO_INCREMENT, `sname` VARCHAR (32) COLLATE utf8_unicode_ci NOT NULL, `gender` ENUM ('男', '女') COLLATE utf8_unicode_ci NOT NULL, `class_id` TINYINT (4) NOT NULL, PRIMARY KEY (`sid`), KEY `fk_class_id` (`class_id`), CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; DROP TABLE IF EXISTS teacher; CREATE TABLE teacher ( tid TINYINT (4) AUTO_INCREMENT PRIMARY KEY, tname VARCHAR (32) ) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; DROP TABLE IF EXISTS course; CREATE TABLE course ( cid TINYINT (4) AUTO_INCREMENT PRIMARY KEY, cname VARCHAR (32), teach_id TINYINT (4), FOREIGN KEY (teach_id) REFERENCES teacher (tid) ) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; DROP TABLE IF EXISTS score; CREATE TABLE score ( sid TINYINT (4) AUTO_INCREMENT PRIMARY KEY, number TINYINT (4), student_id TINYINT (4), course_id TINYINT (4), FOREIGN KEY (student_id) REFERENCES student (sid), FOREIGN KEY (course_id) REFERENCES course (cid) ) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; SET FOREIGN_KEY_CHECKS = 1;
2、插入測試數
insert into class(caption) values('三年級二班'),('二年級一班'),('一年級五班'),('二年級四班'); insert into student(sname,gender,class_id) values('張三','男',2),('李四','女',1),('Esther','男',2),('Esther','女',4); insert into teacher(tname) values('馬克'),('黎明'),('梵高'),('馬克思'); insert into course(cname,teach_id) values('音樂',2),('美術',3),('體育',1),('政治',4); insert into score(number,student_id,course_id) values(100,1,1),(99,1,3),(98,1,2),(97,2,1),(96,2,2),(95,2,3),(94,3,2),(93,3,3),(92,4,3),(100,3,4);
三、測試題
1、查詢“音樂”課程比“美術”課程成績高的所有學生的學號
SELECT a.student_id FROM (SELECT s.student_id, s.number FROM score s JOIN course c ON s.course_id = c.cid WHERE c.cname = '音樂') a INNER JOIN (SELECT s.student_id, s.number FROM score s JOIN course c ON s.course_id = c.cid WHERE c.cname = '美術') b ON a.student_id = b.student_id WHERE a.number > b.number;
2、查詢平均成績大於95分的同學的學號和平均成績
SELECT student_id, AVG(number) avg_score FROM score GROUP BY student_id HAVING avg_score > 95;
3、查詢所有同學的學號、姓名、選課數、總成績
SELECT student_id, sname, COUNT(course_id) AS '課數', SUM(number) AS '總分' FROM score JOIN student ON score.student_id = student.sid GROUP BY student_id;
4、查詢姓“馬”的老師的人數;
SELECT COUNT(*) AS '馬老師人數' FROM teacher WHERE tname LIKE '馬%'
5、查詢沒學過“黎”老師課的同學的學號、姓名
SELECT sid, sname FROM student WHERE sid NOT IN (SELECT s.`student_id` FROM `score` s JOIN `course` c ON s.`course_id` = c.`cid` JOIN `teacher` t ON c.`teach_id` = t.`tid` WHERE t.`tname` LIKE '黎%')
6、查詢學過編號“1”並且也學過編號“2”課程的同學的學號、姓名
SELECT `sid`, `sname` FROM (SELECT s1.`student_id` FROM (SELECT `student_id` FROM `score` WHERE `course_id` = 1) s1, (SELECT `student_id` FROM `score` WHERE `course_id` = 2) s2 WHERE s1.`student_id` = s2.`student_id`) s3, `student` WHERE s3.`student_id` = `student`.`sid`
7、查詢學過“馬”老師的所有課的同學的學號、姓名
SELECT s1.`sid`, s1.`sname` FROM `student` s1 JOIN `score` s2 ON s1.`sid` = s2.`student_id` JOIN `course` c ON s2.`course_id` = c.`cid` JOIN `teacher` t ON t.`tid` = c.`teach_id` WHERE t.`tname` LIKE '黎%'
SELECT sid, sname FROM student WHERE sid IN (SELECT s2.`student_id` FROM `score` s2 WHERE s2.`course_id` = (SELECT c.`cid` FROM `course` c WHERE c.`teach_id` = (SELECT t.`tid` FROM `teacher` t WHERE t.`tname` LIKE '黎%')))
8、查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名
SELECT `sid`, `sname` FROM `student` WHERE `sid` = (SELECT s2.`student_id` FROM (SELECT * FROM `score` WHERE `course_id` = 2) s2, (SELECT * FROM `score` WHERE `course_id` = 3) s3 WHERE s2.`student_id` = s3.`student_id` AND s2.`number` < s3.`number`)
SELECT s.`sid`, s.`sname` FROM `student` s JOIN (SELECT s2.`student_id` FROM (SELECT * FROM `score` WHERE `course_id` = 2) s2 JOIN (SELECT * FROM `score` WHERE `course_id` = 3) s3 ON s2.`student_id` = s3.`student_id` AND s2.`number` < s3.`number`) s4 ON s.`sid` = s4.`student_id`
9、查詢有課程成績小於95分的同學的學號、姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN `score` sc ON st.`sid` = sc.`student_id` WHERE sc.`number` < 95 GROUP BY st.`sid`
10、查詢沒有學全所有課的同學的學號、姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN `score` sc ON st.`sid` = sc.`student_id` GROUP BY st.`sid` HAVING COUNT(sc.`course_id`) < (SELECT COUNT(`cname`) FROM `course`)
11、查詢至少有一門課與學號爲“1”的同學所學相同的同學的學號和姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN (SELECT sc.`student_id` FROM `score` sc WHERE sc.`course_id` IN (SELECT sc.`course_id` FROM `score` sc WHERE sc.`student_id` = 1) GROUP BY sc.`student_id`) s ON st.`sid` = s.`student_id`
12、查詢至少學過學號爲“1”同學所選課程中任意一門課的其他同學學號和姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN (SELECT sc.`student_id` FROM `score` sc WHERE sc.`course_id` IN (SELECT sc.`course_id` FROM `score` sc WHERE sc.`student_id` = 1) GROUP BY sc.`student_id`) s ON st.`sid` = s.`student_id` WHERE st.`sid` != 1
13、查詢和“2”號的同學學習的課程完全相同的其他同學學號和姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN (SELECT s1.`student_id` FROM (SELECT sc.`student_id`, ( GROUP_CONCAT( sc.`course_id` ORDER BY sc.`course_id` DESC SEPARATOR ',' ) ) gc FROM `score` sc GROUP BY sc.`student_id`) s1 WHERE s1.`gc` = (SELECT GROUP_CONCAT( sc.`course_id` ORDER BY sc.`course_id` DESC SEPARATOR ',' ) FROM `score` sc WHERE sc.`student_id` = 2)) sc ON st.`sid` = sc.`student_id` WHERE st.`sid` != 2
14、刪除學習“梵高”老師課的SC表記錄
DELETE sc.* FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` JOIN `teacher` t ON co.`teach_id` = t.`tid` WHERE t.`tname` = '梵高'
15、向SC表中插入一些記錄,這些記錄要求符合以下條件
①沒有上過編號“2”課程的同學學號
②插入“2”號課程的平均成績
insert into `score` ( `number`, `student_id`, `course_id` ) values ( (SELECT AVG(sc.`number`) FROM `score` sc WHERE sc.`course_id` = 2), (SELECT sc.`student_id` FROM `score` sc WHERE sc.`course_id` NOT IN (SELECT sc.`course_id` FROM `score` sc WHERE sc.`student_id` = 2)), 2 )
16、按平均成績從低到高顯示所有學生的“音樂”、“美術”、“體育”三門的課程成績,要求如下
① 按如下形式顯示: 學生姓名,音樂,美術,體育,課程數,平均分
② 只顯示音樂、美術、體育,但其他課程要算到課程數和平均分裏
SELECT st.`sname`, s1.`number` AS '音樂', s2.`number` AS '美術', s3.`number` AS '體育', s.`cnt` AS '課程數', s.`av` AS '平均分' FROM (SELECT sc.`student_id`, COUNT(sc.`course_id`) cnt, AVG(sc.`number`) av FROM `score` sc GROUP BY sc.`student_id`) s LEFT JOIN (SELECT sc.`student_id`, sc.`number` FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` WHERE co.`cname` = '音樂') s1 ON s.`student_id` = s1.`student_id` LEFT JOIN (SELECT sc.`student_id`, sc.`number` FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` WHERE co.`cname` = '美術') s2 ON s.`student_id` = s2.`student_id` LEFT JOIN (SELECT sc.`student_id`, sc.`number` FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` WHERE co.`cname` = '體育') s3 ON s.`student_id` = s3.`student_id` JOIN `student` st ON st.`sid` = s.`student_id` ORDER BY s.`av` ASC
17、查詢各科成績最高和最低的分:以如下形式顯示:課程名稱,最高分,最低分
SELECT co.`cname`, MAX(sc.`number`) AS '最高分', MIN(sc.`number`) AS '最低分' FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` GROUP BY sc.`course_id`
18、按各科平均成績從低到高和及格率的百分數從高到低順序(95分及格)
select co.`cname`, avg(sc.`number`) as '平均成績' from `score` sc join `course` co on sc.`course_id` = co.`cid` group by sc.`course_id` order by AVG(sc.`number`) asc
SELECT co.`cname`, CONCAT( FORMAT((s2.`cnt` / s1.`cnt`) * 100, 0), '%' ) AS '及格率' FROM (SELECT `course_id`, COUNT(student_id) cnt FROM `score` GROUP BY `course_id`) s1 JOIN (SELECT `course_id`, COUNT(student_id) cnt FROM `score` WHERE `number` >= 95 GROUP BY `course_id`) s2 ON s1.`course_id` = s2.`course_id` JOIN `course` co ON s1.`course_id` = co.`cid` ORDER BY (s2.`cnt` / s1.`cnt`) DESC
19、課程平均分從高到低顯示(現實任課老師)
SELECT t.`tname`, FORMAT(AVG(sc.`number`), 2) AS '課程平均分' FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` JOIN `teacher` t ON co.`teach_id` = t.`tid` GROUP BY sc.`course_id` ORDER BY AVG(sc.`number`) DESC
20、查詢每門課程被選修的學生數
SELECT co.`cname`, COUNT(sc.`student_id`) AS '被選修的學生數' FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` GROUP BY sc.`course_id`
21、查詢各科成績前三名的記錄:(不考慮成績並列情況)
22、查詢出只選修了一門課程的全部學生的學號和姓名
SELECT st.`sid`, st.`sname` FROM (SELECT sc.`student_id`, COUNT(sc.`course_id`) cnt FROM `score` sc GROUP BY sc.`student_id`) s JOIN `student` st ON s.`student_id` = st.`sid` WHERE s.`cnt` = 1
23、查詢男生、女生的人數
SELECT s1.*, s2.* FROM (SELECT COUNT(*) AS '男生人數' FROM `student` st WHERE st.`gender` = '男') s1, (SELECT COUNT(*) AS '女生人數' FROM `student` st WHERE st.`gender` = '女') s2
24、查詢姓“馬”的老師名單
SELECT t.* FROM `teacher` t WHERE t.`tname` LIKE '馬%'
25、查詢同名同姓學生名單,並統計同名人數
SELECT st.`sname`, COUNT(*) cnt FROM `student` st GROUP BY st.`sname` HAVING cnt > 1
26、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
SELECT
co.`cname`,
AVG(sc.`number`) avg_sc
FROM
`course` co
JOIN `score` sc
ON co.`cid` = sc.`course_id`
GROUP BY sc.`course_id`
ORDER BY avg_sc ASC,
sc.`course_id` DESC
27、查詢平均成績大於95的所有學生的學號、姓名和平均成績
SELECT st.`sid`, st.`sname`, AVG(sc.`number`) AS '平均分' FROM `student` st JOIN `score` sc ON st.`sid` = sc.`student_id` GROUP BY sc.`student_id`
28、查詢課程名稱爲“體育”,且分數在95以下包括95的學生姓名和分數
select st.`sname`, sc.`number` from `student` st join `score` sc on st.`sid` = sc.`student_id` join `course` co on sc.`course_id` = co.`cid` where co.`cname` = '體育' and sc.`number` <= 95
29、查詢課程編號爲3且課程成績在90分以上的學生的學號和姓名
select st.`sid`, st.`sname` from `student` st join `score` sc on st.`sid` = sc.`student_id` where sc.`course_id` = 3 and sc.`number` > 95
30、選了“政治”課的學生人數
SELECT COUNT(sc.`course_id`) AS '選政治課學生人數' FROM `course` co JOIN `score` sc ON co.`cid` = sc.`course_id` WHERE co.`cname` = '政治'
31、查詢選修“梵高”老師所授課程的學生中,成績最高的學生姓名及其成績
SELECT st.`sname`, sc.`number` FROM `student` st JOIN `score` sc ON st.`sid` = sc.`student_id` JOIN `course` co ON co.`cid` = sc.`course_id` JOIN `teacher` t ON t.`tid` = co.`teach_id` WHERE t.`tname` = '梵高' ORDER BY sc.`number` DESC LIMIT 1
32、查詢各個課程及相應的選修人數
SELECT co.`cname`, COUNT(sc.`student_id`) FROM `course` co JOIN `score` sc ON co.`cid` = sc.`course_id` GROUP BY sc.`course_id`
33、查詢不同課程但成績相同的學生的學號、課程號、學生成績
SELECT sc1.`student_id`, sc1.`course_id`, sc1.`number` FROM (SELECT sc.`student_id`, sc.`course_id`, sc.`number` FROM `score` sc) sc1, (SELECT sc.`student_id`, sc.`course_id`, sc.`number` FROM `score` sc) sc2 WHERE sc1.`number` = sc2.`number` AND sc1.`course_id` != sc2.`course_id`
34、檢索至少選修兩門課程的學生學號及姓名
SELECT st.`sid`, st.`sname` FROM `student` st JOIN `score` sc ON st.`sid` = sc.`student_id` GROUP BY sc.`student_id` HAVING COUNT(sc.`course_id`) >= 2
35、檢索“2”課程分數小於95,按分數降序排列的同學學號
SELECT sc.`student_id` FROM `score` sc WHERE sc.`course_id` = 2 AND sc.`number` < 95 ORDER BY sc.`number` DESC
36、查詢沒學過“馬克”老師講授的任一門課程的學生姓名
SELECT st.`sname` FROM `student` st JOIN (SELECT sc1.`student_id` FROM (SELECT sc.`student_id`, GROUP_CONCAT(sc.`course_id` SEPARATOR '|') gc FROM `score` sc GROUP BY sc.`student_id`) sc1, (SELECT GROUP_CONCAT(co.`cid` SEPARATOR '|') gc FROM `course` co JOIN `teacher` t ON co.`teach_id` = t.`tid` WHERE t.`tname` = '馬克') sc2 WHERE sc1.`gc` REGEXP sc2.`gc`) sc3 ON st.`sid` = sc3.`student_id`
37、查詢全部學生都選修的課程的課程號和課程名
SELECT co.`cid`, co.`cname` FROM `score` sc JOIN `course` co ON sc.`course_id` = co.`cid` GROUP BY co.`cid`, co.`cname` HAVING COUNT(sc.`student_id`) = (SELECT COUNT(`sid`) FROM `student`)
38、查詢兩門以上不及格課程的同學的學號,姓名及其平均成績(95分及格)
SELECT st.`sid`, st.`sname`, AVG(sc.`number`) FROM `score` sc JOIN `student` st ON sc.`student_id` = st.`sid` WHERE sc.`number` < 95 GROUP BY sc.`student_id` HAVING COUNT(sc.`course_id`) >= 2