/* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50621 Source Host : localhost:3306 Source Database : cmz Target Server Type : MYSQL Target Server Version : 50621 File Encoding : 65001 Date: 2018-03-17 21:20:45 */ 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` char(10) NOT NULL, `grade_id` int(11) NOT NULL, PRIMARY KEY (`cid`), KEY `grade_id` (`grade_id`), CONSTRAINT `class_ibfk_1` FOREIGN KEY (`grade_id`) REFERENCES `class_grade` (`gid`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of class -- ---------------------------- INSERT INTO `class` VALUES (‘1‘, ‘一年一班‘, ‘1‘); INSERT INTO `class` VALUES (‘2‘, ‘一年二班‘, ‘1‘); INSERT INTO `class` VALUES (‘3‘, ‘一年三班‘, ‘1‘); INSERT INTO `class` VALUES (‘4‘, ‘一年四班‘, ‘1‘); INSERT INTO `class` VALUES (‘5‘, ‘一年五班‘, ‘1‘); INSERT INTO `class` VALUES (‘6‘, ‘二年一班‘, ‘2‘); INSERT INTO `class` VALUES (‘7‘, ‘二年二班‘, ‘2‘); INSERT INTO `class` VALUES (‘8‘, ‘二年三班‘, ‘2‘); INSERT INTO `class` VALUES (‘9‘, ‘二年四班‘, ‘2‘); INSERT INTO `class` VALUES (‘10‘, ‘三年一班‘, ‘3‘); INSERT INTO `class` VALUES (‘11‘, ‘三年二班‘, ‘3‘); -- ---------------------------- -- Table structure for `class_grade` -- ---------------------------- DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int(11) NOT NULL AUTO_INCREMENT, `gname` char(10) NOT NULL, PRIMARY KEY (`gid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of class_grade -- ---------------------------- INSERT INTO `class_grade` VALUES (‘1‘, ‘一年级‘); INSERT INTO `class_grade` VALUES (‘2‘, ‘二年级‘); INSERT INTO `class_grade` VALUES (‘3‘, ‘三年级‘); -- ---------------------------- -- Table structure for `course` -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `cname` char(10) NOT NULL, `teacher_id` int(11) NOT NULL, PRIMARY KEY (`cid`), KEY `teacher_id` (`teacher_id`), CONSTRAINT `course_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES (‘1‘, ‘生物‘, ‘1‘); INSERT INTO `course` VALUES (‘2‘, ‘体育‘, ‘1‘); INSERT INTO `course` VALUES (‘3‘, ‘物理‘, ‘2‘); INSERT INTO `course` VALUES (‘4‘, ‘数学‘, ‘1‘); INSERT INTO `course` VALUES (‘5‘, ‘美术‘, ‘3‘); -- ---------------------------- -- 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, `score` int(10) unsigned NOT NULL, PRIMARY KEY (`sid`), UNIQUE KEY `sid` (`sid`), KEY `student_id` (`student_id`), KEY `course_id` (`course_id`), CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`), CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES (‘5‘, ‘1‘, ‘3‘, ‘80‘); INSERT INTO `score` VALUES (‘8‘, ‘4‘, ‘3‘, ‘70‘); INSERT INTO `score` VALUES (‘9‘, ‘5‘, ‘3‘, ‘50‘); -- ---------------------------- -- Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` char(10) NOT NULL, `gender` enum(‘男‘,‘女‘) DEFAULT NULL, `class_id` int(11) NOT NULL, PRIMARY KEY (`sid`), KEY `class_id` (`class_id`), CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (‘1‘, ‘乔丹‘, ‘女‘, ‘1‘); INSERT INTO `student` VALUES (‘2‘, ‘艾森‘, ‘女‘, ‘2‘); INSERT INTO `student` VALUES (‘3‘, ‘科比‘, ‘男‘, ‘3‘); INSERT INTO `student` VALUES (‘4‘, ‘黄家‘, ‘女‘, ‘1‘); INSERT INTO `student` VALUES (‘5‘, ‘胡启‘, ‘男‘, ‘1‘); INSERT INTO `student` VALUES (‘6‘, ‘吴宇‘, ‘男‘, ‘2‘); INSERT INTO `student` VALUES (‘7‘, ‘唐明‘, ‘女‘, ‘3‘); INSERT INTO `student` VALUES (‘8‘, ‘叶葱‘, ‘男‘, ‘2‘); INSERT INTO `student` VALUES (‘9‘, ‘张淳‘, ‘女‘, ‘2‘); INSERT INTO `student` VALUES (‘10‘, ‘映月‘, ‘男‘, ‘1‘); INSERT INTO `student` VALUES (‘11‘, ‘胡启‘, ‘男‘, ‘1‘); INSERT INTO `student` VALUES (‘12‘, ‘天宇‘, ‘女‘, ‘2‘); INSERT INTO `student` VALUES (‘13‘, ‘孙兰‘, ‘男‘, ‘3‘); INSERT INTO `student` VALUES (‘14‘, ‘张笑‘, ‘男‘, ‘3‘); INSERT INTO `student` VALUES (‘15‘, ‘张兰‘, ‘女‘, ‘1‘); INSERT INTO `student` VALUES (‘16‘, ‘张兰‘, ‘女‘, ‘2‘); INSERT INTO `student` VALUES (‘17‘, ‘张兰‘, ‘女‘, ‘3‘); -- ---------------------------- -- Table structure for `teacher` -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL AUTO_INCREMENT, `tname` char(10) NOT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES (‘1‘, ‘张三‘); INSERT INTO `teacher` VALUES (‘2‘, ‘李四‘); INSERT INTO `teacher` VALUES (‘3‘, ‘王五‘); INSERT INTO `teacher` VALUES (‘4‘, ‘李坤‘); -- ---------------------------- -- Table structure for `teacher2cls` -- ---------------------------- DROP TABLE IF EXISTS `teacher2cls`; CREATE TABLE `teacher2cls` ( `tcid` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL, `cid` int(11) NOT NULL, PRIMARY KEY (`tcid`), UNIQUE KEY `tcid` (`tcid`), KEY `tid` (`tid`), KEY `cid` (`cid`), CONSTRAINT `teacher2cls_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `teacher` (`tid`), CONSTRAINT `teacher2cls_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `course` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher2cls -- ---------------------------- INSERT INTO `teacher2cls` VALUES (‘1‘, ‘1‘, ‘1‘); INSERT INTO `teacher2cls` VALUES (‘2‘, ‘1‘, ‘2‘); INSERT INTO `teacher2cls` VALUES (‘3‘, ‘2‘, ‘1‘); INSERT INTO `teacher2cls` VALUES (‘4‘, ‘3‘, ‘2‘); -- ---------------------------- -- Procedure structure for `p1` -- ---------------------------- DROP PROCEDURE IF EXISTS `p1`; DELIMITER ;; CREATE DEFINER=`cmz`@`localhost` PROCEDURE `p1`() BEGIN select * from score; END ;; DELIMITER ; -- ---------------------------- -- Procedure structure for `p2` -- ---------------------------- DROP PROCEDURE IF EXISTS `p2`; DELIMITER ;; CREATE DEFINER=`cmz`@`localhost` PROCEDURE `p2`(in n1 int,in n2 int,out res int) BEGIN select * from score where course_id=n1 and score >n2 ; set res = 1; END ;; DELIMITER ;
#1.------------------------- create database ------------------------- #1. create database and change this database create database cmz charset utf8; use cmz; #2.------------------------- create table ------------------------- #2. create table #1. teacher table create table teacher( tid int not null primary key auto_increment, tname char(10) not null )charset utf8 engine=innodb; #2. class_grade table create table class_grade( gid int not null primary key auto_increment, gname char(10) not null )charset utf8 engine=innodb; #3. course table create table course( cid int not null primary key auto_increment, cname char(10) not null, teacher_id int not null, foreign key(teacher_id) references teacher(tid) )charset utf8 engine=innodb; #4. class table create table class( cid int not null primary key auto_increment, caption char(10) not null, grade_id int not null, foreign key(grade_id) references class_grade(gid) )charset utf8 engine=innodb; #5. student table create table student( sid int not null primary key auto_increment, sname char(10) not null, gender enum(‘男‘,‘女‘), class_id int not null, foreign key(class_id) references class(cid) )charset utf8 engine=innodb; #6. score table create table score( sid int not null unique auto_increment, student_id int not null, course_id int not null, score int unsigned not null, foreign key(student_id) references student(sid), foreign key(course_id) references course(cid), primary key(sid) )charset utf8 engine=innodb; #7. teacher2cls table create table teacher2cls( tcid int not null unique auto_increment, tid int not null, cid int not null, foreign key(tid) references teacher(tid), foreign key(cid) references course(cid), primary key(tcid) )charset utf8 engine=innodb; #3. ------------------------- insert into table ------------------------- # insert every table data #1. teacher table insert into teacher(tname) values ("张三"), ("李四"), ("王五"); #2. class_grade table data insert into class_grade(gname) values ("一年级"), ("二年级"), ("三年级"); #3. course table data insert into course(cname,teacher_id) values ("生物",1), ("体育",1), ("数学",1), ("物理",2); #4. class table data insert into class(caption,grade_id) values ("一年一班",1), ("一年二班",1), ("一年三班",1), ("一年四班",1), ("一年五班",1), ("二年一班",2), ("二年二班",2), ("二年三班",2), ("二年四班",2), ("三年一班",3), ("三年二班",3); #5. student table data insert into student(sname,gender,class_id) values ("乔丹","女",1), ("艾森","女",2), ("科比","男",3), ("黄家","女",1), ("胡启","男",1), ("吴宇","男",2), ("唐明","女",3), ("叶葱","男",2), ("张淳","女",2), ("映月","男",1), ("胡启","男",1), ("天宇","女",2), ("孙兰","男",3); #6. score table data insert into score(student_id,course_id,score) values (1,1,60), (1,2,59), (2,2,59); #7. teacher2cls table data insert into teacher2cls(tid,cid) values (1,1), (1,2), (2,1), (3,2); # sql for operation mysql #1. 创建测试数据 #2. 查询学生总人数 select COUNT(sid) from student; 运行过程 mysql> select COUNT(sid) from student; +------------+ | COUNT(sid) | +------------+ | 17 | +------------+ 1 row in set (0.00 sec) #3. 查询“生物”课程和“物理”课程都及格的学生id和姓名 select s1.sid,s1.sname from student s1 where s1.sid in ( select distinct(s.student_id) from score s left join course c on c.cid=s.course_id where s.score >= 60 and (c.cname=‘生物‘ or c.cname=‘物理‘)); 运行过程 mysql> select s1.sid,s1.sname from student s1 -> where s1.sid in ( -> select distinct(s.student_id) from score s left join course c on c.cid=s.course_id -> where s.score >= 60 and (c.cname=‘生物‘ or c.cname=‘物理‘)); +-----+-------+ | sid | sname | +-----+-------+ | 1 | 乔丹 | | 4 | 黄家 | +-----+-------+ 2 rows in set (0.00 sec) #4. 查询每个年级的班级数,取出班级数最多的前三个年级 select grade_id from class_grade LEFT JOIN class on class_grade.gid = class.grade_id GROUP BY grade_id ORDER BY count(grade_id) asc LIMIT 3; 运行过程 mysql> select grade_id from class_grade LEFT JOIN class on class_grade.gid = class.grade_id -> GROUP BY grade_id ORDER BY count(grade_id) asc LIMIT 3; +----------+ | grade_id | +----------+ | 3 | | 2 | | 1 | +----------+ 3 rows in set (0.00 sec) #5. 查询 平均成绩最高和最低的学生的id和姓名以及平均成绩 SELECT student.sid,student.sname,avg(score) from student RIGHT JOIN score on student.sid = score.student_id GROUP BY score ORDER BY avg(score) desc LIMIT 1; SELECT student.sid,student.sname,avg(score) from student RIGHT JOIN score on student.sid = score.student_id GROUP BY score ORDER BY avg(score) asc LIMIT 1; 运行过程 mysql> SELECT student.sid,student.sname,avg(score) from student RIGHT JOIN score on student.sid = sc ore.student_id -> GROUP BY score ORDER BY avg(score) desc LIMIT 1; +------+-------+------------+ | sid | sname | avg(score) | +------+-------+------------+ | 1 | 乔丹 | 80.0000 | +------+-------+------------+ 1 row in set (0.00 sec) mysql> mysql> SELECT student.sid,student.sname,avg(score) from student RIGHT JOIN score on student.sid = sc ore.student_id -> GROUP BY score ORDER BY avg(score) asc LIMIT 1; +------+-------+------------+ | sid | sname | avg(score) | +------+-------+------------+ | 5 | 胡启 | 50.0000 | +------+-------+------------+ 1 row in set (0.00 sec) #6. 查询每个年级的学生人数 select count(*) from class group by grade_id; 运行过程 mysql> select count(*) from class group by grade_id; +----------+ | count(*) | +----------+ | 5 | | 4 | | 2 | +----------+ 3 rows in set (0.00 sec) #7. 查询每个学生的学号,姓名,选课数,平均成绩 SELECT s.sid,s.sname,count(course_id),avg(score) from student s RIGHT JOIN score sc on s.sid = sc.sid GROUP BY student_id; 运行过程 mysql> SELECT s.sid,s.sname,count(course_id),avg(score) from student s RIGHT JOIN score sc on s.sid= sc.sid -> GROUP BY student_id; +------+-------+------------------+------------+ | sid | sname | count(course_id) | avg(score) | +------+-------+------------------+------------+ | 5 | 胡启 | 1 | 80.0000 | | 8 | 叶葱 | 1 | 70.0000 | | 9 | 张淳 | 1 | 50.0000 | +------+-------+------------------+------------+ 3 rows in set (0.00 sec) #8. 查询学生编号为2的学生的姓名,该学生的成绩最高的课程名,成绩最低的课程名以及分数 SELECT course.cname,score.score from score LEFT JOIN course on score.course_id = course.cid where score.student_id = 2 ORDER BY score.score desc LIMIT 1; SELECT course.cname,score.score from score LEFT JOIN course on score.course_id = course.cid where score.student_id = 2 ORDER BY score.score asc LIMIT 1; 运行过程 mysql> SELECT course.cname,score.score from score LEFT JOIN course on score.course_id = course.cid -> where score.student_id = 2 ORDER BY score.score desc LIMIT 1; Empty set (0.00 sec) mysql> SELECT course.cname,score.score from score LEFT JOIN course on score.course_id = course.cid -> where score.student_id = 2 ORDER BY score.score asc LIMIT 1; Empty set (0.00 sec) #9. 查询姓“李”的老师的个数和所带班级数 select (select tea.tid from teacher tea where tea.tname like ‘张%‘) as 姓李的人数 , count(tea2.tid) as 课程 from teacher2cls tea2 where tea2.tid in (select tea.tid from teacher tea where tea.tname like ‘张%‘ ) group by tea2.tid; 运行过程 mysql> select (select tea.tid from teacher tea where tea.tname like ‘张%‘) as 姓李的人数 , -> count(tea2.tid) as 课程 from teacher2cls tea2 -> where tea2.tid in (select tea.tid from teacher tea where tea.tname like ‘张%‘ ) group by tea2.tid; +------------+------+ | 姓李的人数 | 课程 | +------------+------+ | 1 | 2 | +------------+------+ 1 row in set (0.00 sec) #10.查询班级数小于5的年级id和年级名 select gid,gname from class_grade where gid in (select grade_id from class GROUP BY grade_id HAVING count(class.grade_id)<5); 运行过程 mysql> select gid,gname from class_grade -> where gid in -> (select grade_id from class GROUP BY grade_id HAVING count(class.grade_id)<5); +-----+--------+ | gid | gname | +-----+--------+ | 2 | 二年级 | | 3 | 三年级 | +-----+--------+ 2 rows in set (0.00 sec) #11.查询班级信息,包括班级id,班级名称,年级,年级级别(12为低年级,34为中年级,56为高年级) 示例如下: ----------------------------------------------- | 班级id | 班级名称 | 年级 | 年级级别 | ----------------------------------------------- | 1 | 一年一班 | 一年级 | 低 | ----------------------------------------------- 年级判断没做。暂时不会。 SELECT cid "班级id", caption "班级名称", gname "年级" FROM class LEFT JOIN class_grade ON class.grade_id = class_grade.gid; 运行过程 mysql> SELECT -> cid "班级id", -> caption "班级名称", -> gname "年级" -> FROM -> class -> LEFT JOIN class_grade ON class.grade_id = class_grade.gid; +--------+----------+--------+ | 班级id | 班级名称 | 年级 | +--------+----------+--------+ | 1 | 一年一班 | 一年级 | | 2 | 一年二班 | 一年级 | | 3 | 一年三班 | 一年级 | | 4 | 一年四班 | 一年级 | | 5 | 一年五班 | 一年级 | | 6 | 二年一班 | 二年级 | | 7 | 二年二班 | 二年级 | | 8 | 二年三班 | 二年级 | | 9 | 二年四班 | 二年级 | | 10 | 三年一班 | 三年级 | | 11 | 三年二班 | 三年级 | +--------+----------+--------+ 11 rows in set (0.00 sec) #12.查询学过张三老师1门课以上的同学的学号,姓名 SELECT sc.student_id, su.sname, COUNT(sc.course_id) AS class_sum FROM score sc LEFT JOIN student su ON sc.student_id = su.sid WHERE sc.course_id IN ( SELECT co.cid AS cid FROM teacher tc LEFT JOIN course co ON tc.tid = co.teacher_id WHERE tc.tname = "张三" ) GROUP BY sc.student_id HAVING class_sum > 1; 运行过程 mysql> SELECT -> sc.student_id, -> su.sname, -> COUNT(sc.course_id) AS class_sum -> FROM -> score sc -> LEFT JOIN student su ON sc.student_id = su.sid -> WHERE -> sc.course_id IN ( -> SELECT -> co.cid AS cid -> FROM -> teacher tc -> LEFT JOIN course co ON tc.tid = co.teacher_id -> WHERE -> tc.tname = "张三" -> ) -> GROUP BY -> sc.student_id -> HAVING -> class_sum > 1; +------------+-------+-----------+ | student_id | sname | class_sum | +------------+-------+-----------+ | 10 | 映月 | 2 | +------------+-------+-----------+ 1 row in set (0.00 sec) #13.查询教授课程超过2门的老师的id和姓名 select * from teacher where tid in( select tid from teacher2cls GROUP BY tid HAVING count(cid)>=2); 运行过程 mysql> select * from teacher where tid in( -> select tid from teacher2cls GROUP BY tid HAVING count(cid)>=2); +-----+-------+ | tid | tname | +-----+-------+ | 1 | 张三 | +-----+-------+ 1 row in set (0.00 sec) #14.查询学过编号“1“课程和编号”2“课程的同学的学号,姓名 SELECT sid, sname FROM student WHERE sid IN ( SELECT a.sid FROM ( SELECT st.*, sr.cname FROM student st LEFT JOIN score sc ON st.sid = sc.student_id LEFT JOIN course sr ON sr.cid = sc.course_id WHERE sr.cid = 1 ) AS a LEFT JOIN ( SELECT st.*, sr.cid FROM student st LEFT JOIN score sc ON st.sid = sc.student_id LEFT JOIN course sr ON sr.cid = sc.course_id WHERE sr.cid = 4 ) AS b ON a.sid = b.sid WHERE b.cid = 4 ); 运行过程 mysql> SELECT -> sid, -> sname -> FROM -> student -> WHERE -> sid IN ( -> SELECT -> a.sid -> FROM -> ( -> SELECT -> st.*, sr.cname -> FROM -> student st -> LEFT JOIN score sc ON st.sid = sc.student_id -> LEFT JOIN course sr ON sr.cid = sc.course_id -> WHERE -> sr.cid = 1 -> ) AS a -> LEFT JOIN ( -> SELECT -> st.*, sr.cid -> FROM -> student st -> LEFT JOIN score sc ON st.sid = sc.student_id -> LEFT JOIN course sr ON sr.cid = sc.course_id -> WHERE -> sr.cid = 4 -> ) AS b ON a.sid = b.sid -> WHERE -> b.cid = 4 -> ); +-----+-------+ | sid | sname | +-----+-------+ | 10 | 映月 | +-----+-------+ 1 row in set (0.01 sec) #15.查询没有带过高年级的老师的id和姓名 #16.查询学过张三老师所教的所有课的同学学号,姓名 select sid,sname from student where sid in ( select student_id from score where course_id in ( select cid from course LEFT JOIN teacher on course.teacher_id = teacher.tid where teacher.tname = "张三")); 运行过程 mysql> select sid,sname from student where sid in ( -> select student_id from score where course_id in ( -> select cid from course LEFT JOIN teacher on course.teacher_id = teacher.tid where -> teacher.tname = "张三")); Empty set (0.00 sec) #17.查询带过超过2个班级的老师的id和姓名 SELECT DISTINCT tc.tid, tc.tname FROM teacher tc LEFT JOIN course co ON tc.tid = co.teacher_id LEFT JOIN teacher2cls t2c ON t2c.cid = co.cid GROUP BY t2c.cid HAVING COUNT(tc.tid) > 2; 运行过程mysql> SELECT DISTINCT -> tc.tid, -> tc.tname -> FROM -> teacher tc -> LEFT JOIN course co ON tc.tid = co.teacher_id -> LEFT JOIN teacher2cls t2c ON t2c.cid = co.cid -> GROUP BY -> t2c.cid -> HAVING -> COUNT(tc.tid) > 2; +-----+-------+ | tid | tname | +-----+-------+ | 1 | 张三 | +-----+-------+ 1 row in set (0.04 sec) #18.查询 课程编号“2”的成绩比课程编号“1“课程低的所有同学的学号,姓名 select sid,sname from student where sid in ( select a.sid from (select * from score s where s.course_id = 1) a, (select * from score s where s.course_id = 2) b where a.student_id = b.student_id and a.score > b.score); 运行过程 mysql> select sid,sname from student where sid in ( -> select a.sid -> from (select * from score s where s.course_id = 1) a, -> (select * from score s where s.course_id = 2) b -> where a.student_id = b.student_id -> and a.score > b.score); Empty set (0.00 sec) #19.查询所带班级数最多的老师的id和姓名 SELECT tc.tname, tc.tid FROM teacher tc LEFT JOIN teacher2cls t2c ON tc.tid = t2c.tid GROUP BY t2c.tid ORDER BY COUNT(cid) DESC LIMIT 1; 运行过程 mysql> SELECT -> tc.tname, -> tc.tid -> FROM -> teacher tc -> LEFT JOIN teacher2cls t2c ON tc.tid = t2c.tid -> GROUP BY -> t2c.tid -> ORDER BY -> COUNT(cid) DESC -> LIMIT 1; +-------+-----+ | tname | tid | +-------+-----+ | 张三 | 1 | +-------+-----+ 1 row in set (0.00 sec) #20.查询所有课程成绩小于60分的同学的学号,姓名 select student.sid,student.sname from student LEFT JOIN score on student.sid = score.student_id where score.score<60; 运行过程 mysql> select student.sid,student.sname from student LEFT JOIN score -> on -> student.sid = score.student_id -> where score.score<60; +-----+-------+ | sid | sname | +-----+-------+ | 5 | 胡启 | +-----+-------+ 1 row in set (0.00 sec) #21.查询没有学全所有课程的同学的学号,姓名 Select sid,sname From student st where (Select Count(*) From score sc Where st.sid=sc.student_id)< (Select Count(*) From course); 运行过程 mysql> Select sid,sname From student st -> where (Select Count(*) From score sc Where st.sid=sc.student_id)< -> (Select Count(*) From course); +-----+-------+ | sid | sname | +-----+-------+ | 1 | 乔丹 | | 2 | 艾森 | | 3 | 科比 | | 4 | 黄家 | | 5 | 胡启 | | 6 | 吴宇 | | 7 | 唐明 | | 8 | 叶葱 | | 9 | 张淳 | | 10 | 映月 | | 11 | 胡启 | | 12 | 天宇 | | 13 | 孙兰 | | 14 | 张笑 | | 15 | 张兰 | | 16 | 张兰 | | 17 | 张兰 | +-----+-------+ 17 rows in set (0.00 sec) #22.查询至少一门课与学号为“1“的同学所学相同的同学的学号和姓名 Select DistInct st.sid,st.sname From student st Inner Join score sc ON st.sid=sc.student_id Where sc.course_id IN (Select course_id From score Where student_id=‘1‘); 运行过程 mysql> Select DistInct st.sid,st.sname From student st -> Inner Join score sc ON st.sid=sc.student_id -> Where sc.course_id IN (Select course_id From score Where student_id=‘1‘); +-----+-------+ | sid | sname | +-----+-------+ | 1 | 乔丹 | | 4 | 黄家 | | 5 | 胡启 | +-----+-------+ 3 rows in set (0.00 sec) #23.查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名 Select DistInct st.sid,st.sname From student st Inner Join score sc ON st.sid=sc.student_id Where st.sid <>1 and sc.course_id IN (Select course_id From score Where student_id=‘1‘); 运行过程 mysql> Select DistInct st.sid,st.sname From student st -> Inner Join score sc ON st.sid=sc.student_id -> Where st.sid <>1 and -> sc.course_id IN -> (Select course_id From score Where student_id=‘1‘); +-----+-------+ | sid | sname | +-----+-------+ | 4 | 黄家 | | 5 | 胡启 | +-----+-------+ 2 rows in set (0.00 sec) #24.查询和"2"号同学学习的课程完全相同的其他同学的学号和姓名 #25.删除学习张三老师课的score表记录 DELETE from score where course_id in (select cid from course LEFT JOIN teacher on course.teacher_id = teacher.tid where teacher.tname = ‘张三‘); 运行过程 mysql> DELETE from score where course_id in -> (select cid from course LEFT JOIN teacher -> on course.teacher_id = teacher.tid -> where teacher.tname = ‘张三‘); Query OK, 7 rows affected (0.01 sec) #26.向score表中插入一些记录,这些记录要求符合以下条件 1. 没有上过编号“2”课程同学学号 2. 插入“2”号课程的平均成绩 #27.按平均成绩从低到高显示所有学生的“语文”,“数学”,‘英语’三门的的课程成绩,按照如下形式显示 学生ID,语文,数学,英语,有效课程数,有效平均分 select concat("学生ID: ",st.sid," ", "课程ID: ",sc.course_id," ","平均成绩: ",avg(sc.score)) from student as st RIGHT JOIN score as sc on st.sid = sc.student_id GROUP BY student_id; 运行过程 mysql> select concat("学生ID: ",st.sid," ", "课程ID: ",sc.course_id," ","平均成绩: ",avg(sc.score )) from student as st RIGHT JOIN score as sc on st.sid = sc.student_id -> GROUP BY student_id; +------------------------------------------------------------------------------------------+ | concat("学生ID: ",st.sid," ", "课程ID: ",sc.course_id," ","平均成绩: ",avg(sc.score)) | +------------------------------------------------------------------------------------------+ | 学生ID: 1 课程ID: 3 平均成绩: 80.0000 | | 学生ID: 4 课程ID: 3 平均成绩: 70.0000 | | 学生ID: 5 课程ID: 3 平均成绩: 50.0000 | +------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec) #28.查询各科成绩最高和最低的分,如下显示:课程ID,最高分,最低分 select CONCAT("课程ID",course_id,",","最高分 ",score,",","最低分") from score GROUP BY course_id ORDER BY score desc LIMIT 1; 运行过程 mysql> select CONCAT("课程ID",course_id,",","最高分 ",score,",","最低分") -> from score GROUP BY course_id -> ORDER BY score desc -> LIMIT 1; +-------------------------------------------------------------+ | CONCAT("课程ID",course_id,",","最高分 ",score,",","最低分") | +-------------------------------------------------------------+ | 课程ID4,最高分 100,最低分 | +-------------------------------------------------------------+ 1 row in set (0.00 sec) #29.按各科平均成绩从低到高和及格率的百分数从高到低排序 # 及格率-------暂时不会 select * from score GROUP BY course_id ORDER BY avg(score) desc; 运行过程 mysql> select * from score GROUP BY course_id ORDER BY avg(score) desc; +-----+------------+-----------+-------+ | sid | student_id | course_id | score | +-----+------------+-----------+-------+ | 6 | 1 | 4 | 100 | | 1 | 1 | 1 | 60 | | 2 | 1 | 2 | 59 | | 5 | 1 | 3 | 80 | +-----+------------+-----------+-------+ 4 rows in set (0.00 sec) #30.课程平均分从高到低显示(显示任课老师) select tname,cname,score from teacher RIGHT JOIN ( select cname,score,teacher_id from score LEFT JOIN course on score.course_id = course.cid GROUP BY course_id ORDER BY avg(score) desc ) as tmp on tmp.teacher_id = teacher.tid; 运行过程 mysql> select tname,cname,score from teacher RIGHT JOIN ( -> select cname,score,teacher_id from score LEFT JOIN course on score.course_id = course.cid -> GROUP BY course_id ORDER BY avg(score) desc ) as tmp on tmp.teacher_id = teacher.tid; +-------+-------+-------+ | tname | cname | score | +-------+-------+-------+ | 张三 | 数学 | 100 | | 张三 | 生物 | 60 | | 张三 | 体育 | 59 | | 李四 | 物理 | 80 | +-------+-------+-------+ 4 rows in set (0.00 sec) #31.查询各科成绩前三名的记录(不考虑成绩并列情况) SELECT * from student RIGHT JOIN score on student.sid = score.student_id GROUP BY course_id ORDER BY score desc LIMIT 3; 运行过程 mysql> SELECT * from student RIGHT JOIN score on student.sid = score.student_id -> GROUP BY course_id ORDER BY score desc LIMIT 3; +------+-------+--------+----------+-----+------------+-----------+-------+ | sid | sname | gender | class_id | sid | student_id | course_id | score | +------+-------+--------+----------+-----+------------+-----------+-------+ | 1 | 乔丹 | 女 | 1 | 6 | 1 | 4 | 100 | | 1 | 乔丹 | 女 | 1 | 5 | 1 | 3 | 80 | | 1 | 乔丹 | 女 | 1 | 1 | 1 | 1 | 60 | +------+-------+--------+----------+-----+------------+-----------+-------+ 3 rows in set (0.00 sec) #32.查询每门课程被选修的学生数 select cname "课程",count(student_id) "选修学生总数" from score LEFT JOIN course on score.course_id = course.cid GROUP BY course_id; 运行过程 mysql> select cname "课程",count(student_id) "选修学生总数" from score LEFT JOIN -> course on score.course_id = course.cid GROUP BY course_id; +------+--------------+ | 课程 | 选修学生总数 | +------+--------------+ | 生物 | 3 | | 体育 | 3 | | 物理 | 3 | | 数学 | 1 | +------+--------------+ 4 rows in set (0.00 sec) #33.查询选修了2门以上的课程的全部学生的学号和姓名 select sid,sname from student where sid in ( select sid from score group by course_id HAVING count(course_id) > 2 ); 运行过程 mysql> SELECT gender "性别", count(sid) "总人数" FROM student GROUP BY gender ORDER BY count(sid) DESC; +------+--------+ | 性别 | 总人数 | +------+--------+ | 女 | 9 | | 男 | 8 | +------+--------+ 2 rows in set (0.00 sec) #34.查询男生,女生的人数,按照倒序排列 SELECT gender "性别", count(sid) "总人数" FROM student GROUP BY gender ORDER BY count(sid) DESC; #35.查询姓张的学生名单 select * from student where sname regexp "^张"; 运行过程 mysql> select * from student where sname regexp "^张"; +-----+-------+--------+----------+ | sid | sname | gender | class_id | +-----+-------+--------+----------+ | 9 | 张淳 | 女 | 2 | | 14 | 张笑 | 男 | 3 | | 15 | 张兰 | 女 | 1 | | 16 | 张兰 | 女 | 2 | | 17 | 张兰 | 女 | 3 | +-----+-------+--------+----------+ 5 rows in set (0.00 sec) #36.查询同名同姓学生名单,并统计同名人数 select sname "姓名",count(sid) "总人数" from student group by sname HAVING count(sid)>1 ; 运行过程 mysql> select sname "姓名",count(sid) "总人数" from student group by sname HAVING count(sid)>1 ; +------+--------+ | 姓名 | 总人数 | +------+--------+ | 张兰 | 3 | | 胡启 | 2 | +------+--------+ 2 rows in set (0.00 sec) #37.查询每门课程的平均成绩,结果按照平均成绩升序排列,平均成绩相同,按照课程号降序排列 select course_id,avg(score) from score GROUP BY course_id ORDER BY score asc; # 1 #38.查询课程名称为数学,且分数低于60分的学生名和分数 select sname,score from student INNER JOIN score on score.sid = student.sid where score.score < 60; 运行过程 mysql> select sname,score from student -> INNER JOIN score -> on -> score.sid = student.sid -> where score.score < 60; +-------+-------+ | sname | score | +-------+-------+ | 艾森 | 59 | | 科比 | 59 | | 张淳 | 50 | +-------+-------+ 3 rows in set (0.00 sec) #39.查询课程编号为3且课程成绩在60分以上的学号和姓名 select sid,sname from student where sid in (select student_id from score where score.course_id = 2 and score.score > 60); 运行过程 mysql> select sid,sname from student where sid in -> (select student_id from score where score.course_id = 2 and score.score > 60); +-----+-------+ | sid | sname | +-----+-------+ | 3 | 科比 | | 2 | 艾森 | +-----+-------+ 2 rows in set (0.00 sec) #40.求选修了课程的学生人数 select count(student_id) from score; 运行过程 mysql> select count(student_id) from score; +-------------------+ | count(student_id) | +-------------------+ | 10 | +-------------------+ 1 row in set (0.00 sec) #41.查询选修王五老师所授课程的学生中,成绩最高和最低的学生姓名及成绩 select sname,score from score RIGHT JOIN student on score.student_id = student.sid where course_id in ( select cid from course as c LEFT JOIN teacher as t on c.teacher_id = t.tid where t.tname = "李四") GROUP BY score desc LIMIT 1; select sname,score from score RIGHT JOIN student on score.student_id = student.sid where course_id in ( select cid from course as c LEFT JOIN teacher as t on c.teacher_id = t.tid where t.tname = "李四") GROUP BY score asc LIMIT 1; 运行过程 mysql> select sname,score from score RIGHT JOIN student on score.student_id = student.sid where cou rse_id in ( -> select cid from course as c LEFT JOIN teacher as t on c.teacher_id = t.tid where t.tname = "李四") -> GROUP BY score desc LIMIT 1; +-------+-------+ | sname | score | +-------+-------+ | 乔丹 | 80 | +-------+-------+ 1 row in set (0.00 sec) mysql> select sname,score from score RIGHT JOIN student on score.student_id = student.sid where cou rse_id in ( -> select cid from course as c LEFT JOIN teacher as t on c.teacher_id = t.tid where t.tname = "李四") -> GROUP BY score asc LIMIT 1; +-------+-------+ | sname | score | +-------+-------+ | 胡启 | 50 | +-------+-------+ 1 row in set (0.00 sec) #42.查询各个课程及相对应的选修人数 select cname,count(sid) from course LEFT JOIN score on course.cid = score.course_id GROUP BY course_id; 运行过程 mysql> select cname,count(sid) from course LEFT JOIN score on course.cid = score.course_id -> GROUP BY course_id; +-------+------------+ | cname | count(sid) | +-------+------------+ | 美术 | 0 | | 生物 | 3 | | 体育 | 3 | | 物理 | 3 | | 数学 | 1 | +-------+------------+ 5 rows in set (0.00 sec) #43.查询不同课程但成绩相同的学生的学号,课程号,学生成绩 select sid,sname from student where sid in ( select a.student_id from score a LEFT join score b on a.course_id <> b.course_id where a.score = b.score ); 运行过程 mysql> select sid,sname from student where sid in ( -> select a.student_id from score a -> LEFT join score b on a.course_id <> b.course_id -> where a.score = b.score -> ); +-----+-------+ | sid | sname | +-----+-------+ | 2 | 艾森 | | 1 | 乔丹 | | 3 | 科比 | +-----+-------+ 3 rows in set (0.00 sec) #44.查询每门课程成绩最好的前两名学id和姓名 #45.检索至少选择两门课程的学生学号 select sid "学生序号" from score group by course_id having count(*)>=2; 运行过程 mysql> select sid "学生序号" from score -> group by course_id having count(*)>=2; +----------+ | 学生序号 | +----------+ | 1 | | 2 | | 5 | +----------+ 3 rows in set (0.00 sec) #46.查询没有学生选修的课程的课程号和报名表 select cid, cname from course Where cid not in (select course_id from score); 运行过程 mysql> select cid, cname from course -> where -> cid not in (select course_id from score); +-----+-------+ | cid | cname | +-----+-------+ | 5 | 美术 | +-----+-------+ 1 row in set (0.00 sec) #47.查询没带过任何班级的老师id和姓名 select * from teacher where tid not in (select tid from teacher2cls); 运行过程 mysql> select * from teacher where tid not in -> (select tid from teacher2cls); +-----+-------+ | tid | tname | +-----+-------+ | 4 | 李坤 | +-----+-------+ 1 row in set (0.00 sec) #48.查询两门以上的课程超过80分的学生id和平均成绩 select student_id "学生id",avg(score) "平均成绩" from score where score>60 group by course_id having count(*)>=2; 运行过程 mysql> select student_id "学生id",avg(score) "平均成绩" from score where score>60 -> group by course_id having count(*)>=2; +--------+----------+ | 学生id | 平均成绩 | +--------+----------+ | 3 | 80.0000 | | 1 | 75.0000 | +--------+----------+ 2 rows in set (0.00 sec) #49.检索“3”课程分数小于60分,按分数降序排列的同学学号 select sid from student where sid in ( select student_id from score where score<80 and course_id=2 ORDER BY score desc); 运行过程 mysql> select sid from student where sid in ( -> select student_id from score where score<80 and course_id=2 ORDER BY score desc -> ); +-----+ | sid | +-----+ | 1 | +-----+ 1 row in set (0.00 sec) #50.删除编号为“2”的同学的“1”课程的成绩 DELETE from score where course_id = 1 and student_id = 2; #51.查询同时选修了物理课程和生物课的学的id和姓名 select sid,sname from student where sid in( select a.sid from ( select st.*,sr.cname from student AS st left join score AS sc on st.sid = sc.student_id left join course AS sr on sc.course_id = sr.cid where sr.cname = ‘生物‘ ) AS a left join ( select st.sid,sr.cname from student AS st left join score AS sc on st.sid = sc.student_id left join course AS sr on sc.course_id = sr.cid where sr.cname = ‘数学‘ ) AS b on a.sid = b.sid where b.cname = ‘数学‘ ); 运行过程 mysql> select sid,sname from student where sid in( -> select a.sid from ( -> select st.*,sr.cname from student AS st -> left join score AS sc on st.sid = sc.student_id -> left join course AS sr on sc.course_id = sr.cid -> where sr.cname = ‘生物‘ -> ) AS a -> left join ( -> select st.sid,sr.cname from student AS st -> left join score AS sc on st.sid = sc.student_id -> left join course AS sr on sc.course_id = sr.cid -> where sr.cname = ‘数学‘ -> ) AS b on a.sid = b.sid where b.cname = ‘数学‘ -> ); +-----+-------+ | sid | sname | +-----+-------+ | 10 | 映月 | +-----+-------+ 1 row in set (0.00 sec)