一、表關係
二、操作表
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 '黎%'
8、查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名
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、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT
c.`cname` AS '科目',
SUBSTRING_INDEX (GROUP_CONCAT (s.`sname` ORDER BY sc.`number` DESC),',',3) AS '前三名'
FROM
`score` sc
LEFT JOIN `course` c
ON sc.`course_id` = c.`cid`
LEFT JOIN `student` s
ON sc.`student_id` = s.`sid`
GROUP BY sc.`course_id`
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