1. 程式人生 > >sql語句練習題及答案

sql語句練習題及答案

統計 not 分數 where ren records else 升序 ble

表結構

技術分享

技術分享

技術分享

技術分享

技術分享


創建表數據
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`caption` varchar(32) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES (‘1‘, ‘三年二班‘), (‘2‘, ‘三年三班‘), (‘3‘, ‘一年二班‘), (‘4‘, ‘二年九班‘);
COMMIT;

-- ----------------------------
-- Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(32) NOT NULL,
`teacher_id` int(11) NOT NULL,
PRIMARY KEY (`cid`),
KEY `fk_course_teacher` (`teacher_id`),
CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (‘1‘, ‘生物‘, ‘1‘), (‘2‘, ‘物理‘, ‘2‘), (‘3‘, ‘體育‘, ‘3‘), (‘4‘, ‘美術‘, ‘2‘);
COMMIT;

-- ----------------------------
-- Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
`num` int(11) NOT NULL,
PRIMARY KEY (`sid`),
KEY `fk_score_student` (`student_id`),
KEY `fk_score_course` (`course_id`),
CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES (‘1‘, ‘1‘, ‘1‘, ‘10‘), (‘2‘, ‘1‘, ‘2‘, ‘9‘), (‘5‘, ‘1‘, ‘4‘, ‘66‘), (‘6‘, ‘2‘, ‘1‘, ‘8‘), (‘8‘, ‘2‘, ‘3‘, ‘68‘), (‘9‘, ‘2‘, ‘4‘, ‘99‘), (‘10‘, ‘3‘, ‘1‘, ‘77‘), (‘11‘, ‘3‘, ‘2‘, ‘66‘), (‘12‘, ‘3‘, ‘3‘, ‘87‘), (‘13‘, ‘3‘, ‘4‘, ‘99‘), (‘14‘, ‘4‘, ‘1‘, ‘79‘), (‘15‘, ‘4‘, ‘2‘, ‘11‘), (‘16‘, ‘4‘, ‘3‘, ‘67‘), (‘17‘, ‘4‘, ‘4‘, ‘100‘), (‘18‘, ‘5‘, ‘1‘, ‘79‘), (‘19‘, ‘5‘, ‘2‘, ‘11‘), (‘20‘, ‘5‘, ‘3‘, ‘67‘), (‘21‘, ‘5‘, ‘4‘, ‘100‘), (‘22‘, ‘6‘, ‘1‘, ‘9‘), (‘23‘, ‘6‘, ‘2‘, ‘100‘), (‘24‘, ‘6‘, ‘3‘, ‘67‘), (‘25‘, ‘6‘, ‘4‘, ‘100‘), (‘26‘, ‘7‘, ‘1‘, ‘9‘), (‘27‘, ‘7‘, ‘2‘, ‘100‘), (‘28‘, ‘7‘, ‘3‘, ‘67‘), (‘29‘, ‘7‘, ‘4‘, ‘88‘), (‘30‘, ‘8‘, ‘1‘, ‘9‘), (‘31‘, ‘8‘, ‘2‘, ‘100‘), (‘32‘, ‘8‘, ‘3‘, ‘67‘), (‘33‘, ‘8‘, ‘4‘, ‘88‘), (‘34‘, ‘9‘, ‘1‘, ‘91‘), (‘35‘, ‘9‘, ‘2‘, ‘88‘), (‘36‘, ‘9‘, ‘3‘, ‘67‘), (‘37‘, ‘9‘, ‘4‘, ‘22‘), (‘38‘, ‘10‘, ‘1‘, ‘90‘), (‘39‘, ‘10‘, ‘2‘, ‘77‘), (‘40‘, ‘10‘, ‘3‘, ‘43‘), (‘41‘, ‘10‘, ‘4‘, ‘87‘), (‘42‘, ‘11‘, ‘1‘, ‘90‘), (‘43‘, ‘11‘, ‘2‘, ‘77‘), (‘44‘, ‘11‘, ‘3‘, ‘43‘), (‘45‘, ‘11‘, ‘4‘, ‘87‘), (‘46‘, ‘12‘, ‘1‘, ‘90‘), (‘47‘, ‘12‘, ‘2‘, ‘77‘), (‘48‘, ‘12‘, ‘3‘, ‘43‘), (‘49‘, ‘12‘, ‘4‘, ‘87‘), (‘52‘, ‘13‘, ‘3‘, ‘87‘);
COMMIT;

-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`gender` char(1) NOT NULL,
`class_id` int(11) NOT NULL,
`sname` varchar(32) NOT NULL,
PRIMARY KEY (`sid`),
KEY `fk_class` (`class_id`),
CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (‘1‘, ‘男‘, ‘1‘, ‘理解‘), (‘2‘, ‘女‘, ‘1‘, ‘鋼蛋‘), (‘3‘, ‘男‘, ‘1‘, ‘張三‘), (‘4‘, ‘男‘, ‘1‘, ‘張一‘), (‘5‘, ‘女‘, ‘1‘, ‘張二‘), (‘6‘, ‘男‘, ‘1‘, ‘張四‘), (‘7‘, ‘女‘, ‘2‘, ‘鐵錘‘), (‘8‘, ‘男‘, ‘2‘, ‘李三‘), (‘9‘, ‘男‘, ‘2‘, ‘李一‘), (‘10‘, ‘女‘, ‘2‘, ‘李二‘), (‘11‘, ‘男‘, ‘2‘, ‘李四‘), (‘12‘, ‘女‘, ‘3‘, ‘如花‘), (‘13‘, ‘男‘, ‘3‘, ‘劉三‘), (‘14‘, ‘男‘, ‘3‘, ‘劉一‘), (‘15‘, ‘女‘, ‘3‘, ‘劉二‘), (‘16‘, ‘男‘, ‘3‘, ‘劉四‘);
COMMIT;

-- ----------------------------
-- Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`tname` varchar(32) NOT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES (‘1‘, ‘張磊老師‘), (‘2‘, ‘李平老師‘), (‘3‘, ‘劉海燕老師‘), (‘4‘, ‘朱雲海老師‘), (‘5‘, ‘李傑老師‘);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;


臨時表,鏈表查詢
-- 查詢“生物”課程比“物理”課程成績高的所有學生的學號;
SELECT A.student_id from (
(SELECT student_id,num from score
LEFT JOIN course on score.course_id=course.cid
where cname=‘生物‘) as A
LEFT JOIN
(SELECT student_id,num from score LEFT JOIN course on score.course_id=course.cid
where cname=‘物理‘)as B on A.student_id=B.student_id)
WHERE A.num>B.num;

-- 查詢所有同學的學號、姓名、選課數、總成績
SELECT A.student_id,student.sname,A.choice_num,A.sum_score from (
SELECT student_id,COUNT(1) as choice_num ,SUM(num) as sum_score from score GROUP BY student_id) as A
LEFT JOIN
student on A.student_id=student.sid

-- 查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名
SELECT student.sid,student.sname from student where student.sid in (
SELECT A.student_id from (
(SELECT student_id,num from score LEFT JOIN course on score.course_id=course.cid where cid=‘2‘)A
LEFT JOIN
(SELECT student_id,num from score LEFT JOIN course on score.course_id=course.cid where cid=‘1‘)B
on A.student_id=B.student_id) WHERE A.num>B.num);

-- 查詢和“2”號的同學學習的課程完全相同的其他同學學號和姓名

SELECT student_id from (
SELECT * from score where student_id=(
SELECT student_id from score GROUP BY student_id HAVING count(1)=(
SELECT count(1) as count_course from score GROUP BY student_id HAVING student_id=2 )and student_id!=2 ) and course_id in
(select course_id from score WHERE student_id=2)) as A GROUP BY student_id HAVING count(*)=
(SELECT count(1) as count_course from score GROUP BY student_id HAVING student_id=2)

-- 查詢平均成績大於85的所有學生的學號、姓名和平均成績;
SELECT student_id,avg(num) as avgnum,student.sname from score LEFT JOIN student on score.student_id=student.sid
GROUP BY student_id HAVING avgnum > 85

-- 查詢課程名稱為“物理”,且分數低於60的學生姓名和分數;
SELECT student.sname,score.num from course LEFT JOIN score on score.course_id=course.cid LEFT JOIN student on score.student_id=student.sid
WHERE course.cname=‘物理‘ and score.num < 60

-- 查詢課程編號為3且課程成績在80分以上的學生的學號和姓名;
SELECT student_id,student.sname from course LEFT JOIN score on score.course_id=course.cid LEFT JOIN student on score.student_id=student.sid
WHERE cid=3 and score.num>80

-- 查詢選修“李平老師‘所授課程的學生中,成績最高的學生姓名及其成績;
SELECT A.num,A.sname,A.cname from (
SELECT score.num,student.sname,course.cname from teacher LEFT JOIN course on course.teacher_id=teacher.tid LEFT JOIN score on course.cid=score.course_id
LEFT JOIN student on score.student_id=student.sid
WHERE teacher.tname=‘李平老師‘ ORDER BY num desc ) as A GROUP BY cname

-- 求選了課程的學生人數
SELECT count(*) as person from (
SELECT student.sid from student LEFT JOIN score as score1 on score1.student_id=student.sid WHERE student.sid in (SELECT student_id from score GROUP BY student_id)
GROUP BY student.sid ) as A

-- 查詢沒學過“李平老師”講授的任一門課程的學生姓名;
SELECT student_id,sname from score LEFT JOIN student
on score.student_id=student.sid
WHERE score.student_id not in (
SELECT DISTINCT s1.student_id from teacher LEFT JOIN course on course.teacher_id=teacher.tid
LEFT JOIN score as s1 on course.cid=s1.course_id
WHERE tname=‘李平老師‘ )



條件查詢語句
-- 查詢沒學過“李平老師“課的同學的學號、姓名
SELECT student.sid,student.sname from student where student.sid not in (
SELECT student_id from
(SELECT cid from course LEFT JOIN teacher on course.teacher_id=teacher.tid
where tname=‘李平老師‘ )as A LEFT JOIN score on score.course_id=A.cid GROUP BY student_id)

-- 查詢學過“李平老師”所教的所有課的同學的學號、姓名
SELECT student.sid,student.sname from student where student.sid in (
SELECT student_id from
(SELECT cid from course LEFT JOIN teacher on course.teacher_id=teacher.tid
where tname=‘李平老師‘ )as A LEFT JOIN score on score.course_id=A.cid GROUP BY student_id)

-- 查詢至少有一門課與學號為“1”的同學所學相同的同學的學號和姓名
SELECT student.sid,student.sname from student where sid in (
SELECT student_id from score where course_id in (
SELECT course_id from score where student_id = ‘1‘) GROUP BY student_id HAVING count(course_id)>1);

-- 查詢不同課程但成績相同的學生的學號、課程號、學生成績
SELECT s1.student_id,s1.course_id,s1.num from score as s1,score as s2 WHERE s1.num=s2.num and s1.student_id=s2.student_id and s1.course_id!=s2.course_id

分組查詢
-- 查詢平均成績大於60分的同學的學號和平均成績
SELECT student_id,AVG(num) as number from score GROUP BY student_id HAVING number > 60;

-- 查詢學過“1”並且也學過編號“2”課程的同學的學號、姓名;
SELECT student_id,count(1) as count_course from score where course_id in (1,2) GROUP BY student_id HAVING count_course>1;

-- 查詢有課程成績小於60分的同學的學號、姓名
SELECT sid,sname from student where sid in (
SELECT student_id from score WHERE num < 60 GROUP BY student_id)

-- 查詢沒有學全所有課的同學的學號、姓名
SELECT student.sid,student.sname from student where student.sid in (
SELECT student_id from score GROUP BY student_id HAVING count(course_id) < (
SELECT count(1) from course));

-- 查詢至少有一門課與學號為“1”的同學所學相同的同學的學號和姓名
SELECT student.sid,student.sname from student where sid in (
SELECT student_id from score where course_id in (
SELECT course_id from score where student_id = ‘1‘) GROUP BY student_id HAVING count(course_id)>1) and sid !=1;

-- 查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;
select course_id,max(num) as 最高分,min(num) as 最低分 from score GROUP BY course_id;

-- 查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;
select course_id,max(num) as 最高分,min(num) as 最低分 from score GROUP BY course_id;

-- 課程平均分從高到低顯示(現實任課老師)
SELECT course_id,teacher_id,AVG(num) as avgnum from course LEFT JOIN score
on score.course_id=course.cid
GROUP BY course_id ORDER BY avgnum desc

-- 查詢每門課程被選修的學生數
SELECT course_id,count(*) as person from score GROUP BY course_id

-- 查詢出只選修了一門課程的全部學生的學號和姓名
SELECT * from (
SELECT student_id,course_id,count(*) as course_count from score GROUP BY student_id ) as A
LEFT JOIN student on student.sid=A.student_id WHERE A.course_count=1

-- 查詢男生、女生的人數;
select gender,count(*) as person from student GROUP BY gender

-- 查詢同名同姓學生名單,並統計同名人數
SELECT sname,count(*) as person from student GROUP BY student.sname HAVING person>1

-- 檢索至少選修兩門課程的學生學號;
SELECT student_id,count(*) as count_course from score GROUP BY student_id HAVING count_course >= 2

-- 查詢全部學生都選修的課程的課程號和課程名;
select course_id,count(*) as person from score GROUP BY course_id HAVING person=(SELECT count(1) from student)

-- 查詢學的課程最少的學生學號和課程號
SELECT s1.student_id,s1.course_id from score as s1
GROUP BY s1.student_id ORDER BY count(1) limit 1

-- 查詢兩門以上不及格課程的同學的學號及其平均成績;
SELECT student_id,course_id,avg(num) from score where num < 60 GROUP BY student_id HAVING count(1) >= 2

-- 檢索“4”課程分數小於60,按分數降序排列的同學學號;
select student_id from score where course_id=4 and num < 60 ORDER BY num desc


模糊匹配
-- 查詢姓“李”的老師的個數
select * from teacher where tname like ‘李%‘

-- 查詢姓“張”的學生名單;
SELECT * from student WHERE sname like ‘張%‘;


排序
-- 按各科平均成績從低到高和及格率的百分數從高到低順序
select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc;

-- 查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT score1.sid,score1.course_id,res.first_num,res.second_num,res.third_num from score as score1 LEFT JOIN (
SELECT sid,
(SELECT num from score as score2 WHERE score2.course_id=score3.course_id ORDER BY num desc LIMIT 0,1) as first_num,
(SELECT num from score as score2 WHERE score2.course_id=score3.course_id ORDER BY num desc LIMIT 3,1) as second_num,
(SELECT num from score as score2 WHERE score2.course_id=score3.course_id ORDER BY num desc LIMIT 4,1) as third_num
from score as score3
) as res
on score1.sid=res.sid GROUP BY score1.course_id;

-- 查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;
SELECT * from (
SELECT course_id,avg(num) as avgnum from score GROUP BY course_id ) as A ORDER BY A.avgnum asc,A.course_id DESC

-- 查詢每門課程成績最好的前兩名;
select score1.course_id ,res.first_num,res.second_num from score as score1 LEFT JOIN
( select sid,
(select num from score as score2 WHERE score3.course_id=score2.course_id ORDER BY score2.num desc LIMIT 0,1) as first_num,
(select num from score as score2 WHERE score3.course_id=score2.course_id ORDER BY score2.num desc LIMIT 3,1) as second_num
from score as score3
) as res
on res.sid=score1.sid
GROUP BY score1.course_id



case when then else end
-- 按各科平均成績從低到高和及格率的百分數從高到低順序
select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc;

delete
-- 刪除“2”同學的“1”課程的成績;
delete from score where student_id=2 and course_id=1

sql語句練習題及答案