sql练习题
时间:2021-07-01 10:21:17
帮助过:35人阅读
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50624
Source Host : localhost
Source Database : sqlexam
Target Server Type : MySQL
Target Server Version : 50624
File Encoding : utf-8
Date: 10/21/2016 06:46:46 AM
*/
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;
表结构和数据
表结构和数据
答案
2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
思路:
获取所有有生物课程的人(学号,成绩) - 临时表
获取所有有物理课程的人(学号,成绩) - 临时表
根据【学号】连接两个临时表:
学号 物理成绩 生物成绩
然后再进行筛选
select A.student_id,sw,ty from
(select student_id,num as sw from score left join course on score.course_id = course.cid where course.cname = ‘生物‘) as A
left join
(select student_id,num as ty from score left join course on score.course_id = course.cid where course.cname = ‘物理‘) as B
on A.student_id = B.student_id where sw > if(isnull(ty),0,ty);
注释:if(isnull(ty),0,ty); 相当于三元运算
3、查询平均成绩大于60分的同学的学号和平均成绩;
思路:
根据学生分组,使用avg获取平均值,通过having对avg进行筛选
select student_id,avg(num) from score group by student_id having avg(num) > 60
4、查询所有同学的学号、姓名、选课数、总成绩;
思路:先从score表中对学号分组,作为一个临时表 A :【学号】,【选课数】,【总成绩】,
然后将A表与学生表进行连接,查出结果集。
select
sname,
student_id,
course_count,
total
from
(SELECT
student_id,
count(course_id) as course_count,
SUM( num ) as total
FROM
score
GROUP BY
student_id)
AS A left JOIN student on A.student_id = student.sid
5、查询姓“李”的老师的个数;
select count(tid) from teacher where tname like ‘李%‘
select count(1) from (select tid from teacher where tname like ‘李%‘) as B
6、查询没学过“李平”老师课的同学的学号、姓名;
思路:
先查到“李平老师”老师教的所有课ID
获取选过课的所有学生ID
学生表中筛选
select * from student where sid not in (
select DISTINCT student_id from score where score.course_id in (
select cid from course left join teacher on course.teacher_id = teacher.tid where tname = ‘李平老师‘
)
)
7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
思路:
先查到既选择001又选择002课程的所有同学
根据学生进行分组,如果学生数量等于2表示,两门均已选择
select student_id,sname from
(select student_id,course_id from score where course_id = 1 or course_id = 2) as B
left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1
8、查询学过“李平”老师所教的所有课的同学的学号、姓名;
同上,只不过将001和002变成 in (叶平老师的所有课)
9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
同第1题
10、查询有课程成绩小于60分的同学的学号、姓名;
select sid,sname from student where sid in (
select distinct student_id from score where num < 60
)
11、查询没有学全所有课的同学的学号、姓名;
思路:
在分数表中根据学生进行分组,获取每一个学生选课数量
如果数量 == 总课程数量,表示已经选择了所有课程
select student_id,sname
from score left join student on score.student_id = student.sid
group by student_id HAVING count(course_id) = (select count(1) from course)
12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
思路:
获取 001 同学选择的所有课程
获取课程在其中的所有人以及所有课程
根据学生筛选,获取所有学生信息
再与学生表连接,获取姓名
select student_id,sname, count(course_id)
from score left join student on score.student_id = student.sid
where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id
13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
先找到和001的学过的所有人
然后个数 = 001所有学科 ==》 其他人可能选择的更多
select student_id,sname, count(course_id)
from score left join student on score.student_id = student.sid
where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id having count(course_id) = (select count(course_id) from score where student_id = 1)
14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
个数相同
002学过的也学过
select student_id,sname from score left join student on score.student_id = student.sid where student_id in (