一、練習。導入下面sql執行語句
/*數據導入:
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;
init.sql
導入方法。路徑不支持中文
#準備表、記錄
mysql>create database db1;
mysql>use db1;
mysql> source /root/init.sql
生成如下表
二、練習題部分
1、查詢所有的課程的名稱以及對應的任課老師姓名2、查詢學生表中男女生各有多少人3、查詢物理成績等于100的學生的姓名4、查詢平均成績大于八十分的同學的姓名和平均成績5、查詢所有學生的學號,姓名,選課數,總成績6、 查詢姓李老師的個數7、 查詢沒有報李平老師課的學生姓名8、 查詢物理課程比生物課程高的學生的學號9、 查詢沒有同時選修物理課程和體育課程的學生姓名10、查詢掛科超過兩門(包括兩門)的學生姓名和班級11、查詢選修了所有課程的學生姓名12、查詢李平老師教的課程的所有成績記錄13、查詢全部學生都選修了的課程號和課程名14、查詢每門課程被選修的次數15、查詢之選修了一門課程的學生姓名和學號16、查詢所有學生考出的成績并按從高到低排序(成績去重)17、查詢平均成績大于85的學生姓名和平均成績18、查詢生物成績不及格的學生姓名和對應生物分數19、查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名20、查詢每門課程成績最好的前兩名學生姓名
View Code
三、參考答案。
1、查詢所有的課程的名稱以及對應的任課老師姓名
2、查詢學生表中男女生各有多少人
3、查詢物理成績等于100的學生的姓名
4、查詢平均成績大于八十分的同學的姓名和平均成績。有問題
5、查詢所有學生的學號,姓名,選課數,總成績
6、查詢姓李老師的個數
7、查詢沒有報李平老師課的學生姓名
分析
teacher表,李平老師(tid= 2)
course表,發現李平老師教 物理, cid= 2score表,發現 cid=2的就是物理,尋找有物理分的學生idselect sname from student where sid not in(select student_id from score where course_id = 2);
8、 查詢物理課程比生物課程高的學生的學號
select t1.student_id from(select student_id,num from score where course_id =(select cid from course where cname = "物理")
)ast1
inner join
(select student_id,num from score where course_id =(select cid from course where cname = '生物')
)as t2 on t1.student_id =t2.student_idwhere t1.num > t2.num;
9、查詢沒有同時選修物理課程和體育課程的學生姓名
select student.sname from student where sid in(select student_id from score where course_id in(select cid from course where cname = '物理' or cname = '體育')
group by student_id
having count(course_id)= 1);
10、查詢掛科超過兩門(包括兩門)的學生姓名和班級
select student.sname,class.caption fromstudent
inner join
(select student_id from score where num < 60group by student_id
having count(course_id)>= 2)ast1
inner joinclass on student.sid = t1.student_id and student.class_id = class.cid;
11 、查詢選修了所有課程的學生姓名
select student.sname from student where sid in(select student_id fromscore
group by student_id
having count(course_id)=(select count(cid) fromcourse)
);
12、查詢李平老師教的課程的所有成績記錄
select * from score where course_id in(select cid fromcourse
inner join
teacher on course.teacher_id= teacher.tid where teacher.tname = '李平老師');
13、查詢全部學生都選修了的課程號和課程名
select * fromstudent
left join
(select student_id,group_concat(cname) fromscore
inner join
course on score.course_id=course.cid
group by student_id)ast1
on student.sid= t1.student_id;
14、查詢每門課程被選修的次數
15、查詢之選修了一門課程的學生姓名和學號
select sid,sname from student where sid in(select student_id fromscore
group by student_id
having count(course_id)= 1);
16、查詢所有學生考出的成績并按從高到低排序(成績去重)
17、查詢平均成績大于85的學生姓名和平均成績
select sname,t1.avg_num fromstudent
inner join
(select student_id,avg(num) as avg_num fromscore
group by student_id
having avg(num)> 85)as t1 on student.sid = t1.student_id;
18、查詢生物成績不及格的學生姓名和對應生物分數
select sname 姓名,num 生物成績 fromscore
left join course on score.course_id=course.cid
left join student on score.student_id=student.sidwhere course.cname = '生物'and score.num<60;
19、查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名
select sname from student where sid =(select student_id from score where course_id in(select course.cid fromcourse
inner join
teacher on course.teacher_id=teacher.tidwhere teacher.tname = '李平老師')
group by student_id
order by avg(num) desc
limit1);
20、查詢每門課程成績最好的前兩名學生姓名
第一步:求出每門課程的課程course_id,與最高分數first_num
第二步:去掉最高分,再按照課程分組,取得的最高分,就是第二高的分數second_num
select score.course_id,max(num) second_num fromscore
inner join
(select course_id,max(num) first_num fromscore
group by course_id
)as t on score.course_id =t.course_idwhere score.num
group by course_id;
第三步:將表1和表2聯合到一起,得到一張表t3,包含課程course_id與該們課程的first_num與second_num
select t1.course_id,t1.first_num,t2.second_num from(select course_id,max(num) first_num fromscore
group by course_id
)ast1
inner join
(select score.course_id,max(num) second_num fromscore
inner join
(select course_id,max(num) first_num fromscore
group by course_id)as t on score.course_id =t.course_idwhere score.num
group by course_id
)as t2 on t1.course_id = t2.course_id;
調整
select score.student_id,t3.course_id,t3.first_num,t3.second_num fromscore
inner join
(select t1.course_id,t1.first_num,t2.second_num from(select course_id,max(num) first_num fromscore
group by course_id
)ast1
inner join
(select score.course_id,max(num) second_num fromscore
inner join
(select course_id,max(num) first_num fromscore
group by course_id)as t on score.course_id =t.course_idwhere score.num
group by course_id
)as t2 on t1.course_id =t2.course_id
)as t3 on score.course_id =t3.course_idwhere score.num >=t3.second_num
and score.num<=t3.first_num
order by course_id;
檢驗
21、查詢不同課程但成績相同的學號,課程號,成績