当前位置:Gxlcms > 数据库问题 > MYSQL 练习

MYSQL 练习

时间:2021-07-01 10:21:17 帮助过:4人阅读

Navicat MySQL Data Transfer Source Server : abc Source Server Version : 50713 Source Host : localhost:3306 Source Database : lx Target Server Type : MYSQL Target Server Version : 50713 File Encoding : 65001 Date: 2016-10-24 18:07:25 */ 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(20) DEFAULT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of class -- ---------------------------- INSERT INTO `class` VALUES (1, 三年二班); INSERT INTO `class` VALUES (2, 一年三班); INSERT INTO `class` VALUES (3, 三年一班); INSERT INTO `class` VALUES (4, python 二期); -- ---------------------------- -- Table structure for `course` -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `cname` varchar(20) DEFAULT NULL, `teache_id` int(11) DEFAULT NULL, PRIMARY KEY (`cid`), KEY `fk_c_t` (`teache_id`), CONSTRAINT `fk_c_t` FOREIGN KEY (`teache_id`) REFERENCES `teacher` (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES (1, 生物, 1); INSERT INTO `course` VALUES (2, 体育, 1); INSERT INTO `course` VALUES (3, 物理, 2); -- ---------------------------- -- Table structure for `score` -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) DEFAULT NULL, `corse_id` int(11) DEFAULT NULL, `number` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_s_st` (`student_id`), KEY `fk_s_co` (`corse_id`), CONSTRAINT `fk_s_co` FOREIGN KEY (`corse_id`) REFERENCES `course` (`cid`), CONSTRAINT `fk_s_st` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES (1, 1, 1, 60); INSERT INTO `score` VALUES (2, 1, 2, 59); INSERT INTO `score` VALUES (3, 2, 2, 100); INSERT INTO `score` VALUES (4, 1, 3, 76); INSERT INTO `score` VALUES (5, 2, 1, 99); INSERT INTO `score` VALUES (6, 2, 3, 88); INSERT INTO `score` VALUES (7, 3, 1, 66); INSERT INTO `score` VALUES (8, 3, 2, 77); INSERT INTO `score` VALUES (9, 3, 3, 88); INSERT INTO `score` VALUES (10, 4, 1, 76); INSERT INTO `score` VALUES (11, 4, 2, 99); INSERT INTO `score` VALUES (12, 4, 3, 88); INSERT INTO `score` VALUES (13, 5, 1, 66); INSERT INTO `score` VALUES (14, 5, 2, 77); INSERT INTO `score` VALUES (15, 5, 3, 88); INSERT INTO `score` VALUES (16, 6, 1, 58); INSERT INTO `score` VALUES (17, 6, 2, 68); INSERT INTO `score` VALUES (18, 6, 3, 78); INSERT INTO `score` VALUES (19, 7, 1, 87); INSERT INTO `score` VALUES (20, 7, 2, 76); INSERT INTO `score` VALUES (21, 7, 3, 65); INSERT INTO `score` VALUES (22, 8, 1, 90); INSERT INTO `score` VALUES (23, 8, 2, 81); INSERT INTO `score` VALUES (24, 8, 3, 77); INSERT INTO `score` VALUES (25, 9, 1, 86); INSERT INTO `score` VALUES (26, 9, 2, 78); INSERT INTO `score` VALUES (27, 9, 3, 97); -- ---------------------------- -- Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(20) DEFAULT NULL, `gender` varchar(12) DEFAULT NULL, `class_id` int(11) DEFAULT NULL, PRIMARY KEY (`sid`), KEY `fk_s_c` (`class_id`), CONSTRAINT `fk_s_c` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, 钢蛋, , 1); INSERT INTO `student` VALUES (2, 铁锤, , 1); INSERT INTO `student` VALUES (3, 山炮, , 2); INSERT INTO `student` VALUES (4, 张三, , 3); INSERT INTO `student` VALUES (5, 李四, , 2); INSERT INTO `student` VALUES (6, 王五, , 3); INSERT INTO `student` VALUES (7, 马六, , 1); INSERT INTO `student` VALUES (8, 霍七, , 2); INSERT INTO `student` VALUES (9, 贺八, , 3); -- ---------------------------- -- Table structure for `teacher` -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL AUTO_INCREMENT, `tname` varchar(20) DEFAULT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES (1, 波多); INSERT INTO `teacher` VALUES (2, 苍空); INSERT INTO `teacher` VALUES (3, 饭岛); 创建表(结构)

2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;

思路:     获取所有有生物课程的人(学号,成绩) - 临时表     获取所有有物理课程的人(学号,成绩) - 临时表     根据【学号】连接两个临时表:         学号 物理成绩 生物成绩       然后再进行筛选
select A.student_id,生物,物理 from
 
        (select student_id,number as 生物 from score left join course on score.corse_id = course.cid where course.cname = 生物) as A
 
        left join
 
        (select student_id,number  as 物理 from score left join course on score.corse_id = course.cid where course.cname = 物理) as B
 
        on A.student_id = B.student_id where 物理 >  生物 ;       
  3、查询平均成绩大于60分的同学的学号和平均成绩;     思路:         根据学生分组,使用avg获取平均值,通过havingavg进行筛选      
select student_id,avg(number) from score GROUP BY student_id having avg(number)>60;
  4、查询所有同学的学号、姓名、选课数、总成绩;
SELECT
    score.student_id,
    COUNT(score.corse_id),
    SUM(score.number),
    student.sname
FROM
    score
LEFT JOIN student ON student.sid = score.student_id
GROUP BY
    student_id
  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 student_id from score WHERE score.corse_id in(
select cid from course 
LEFT JOIN teacher on teacher.tid = course.teache_id where teacher.tname = "波多"
)
)
7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;     思路:         先查到既选择001又选择002课程的所有同学         根据学生进行分组,如果学生数量等于2表示,两门均已选择
 select student_id,sname from
 
    (select student_id,corse_id from score where corse_id = 1 or corse_id = 2) as B
      
    left join student on B.student_id = student.sid group by student_id HAVING count(student_id) = 2
8、查询学过“叶平”老师所教的所有课的同学的学号、姓名; 
select * from student where sid  in(
select student_id from score WHERE score.corse_id in(
select cid from course 
LEFT JOIN teacher on teacher.tid = course.teache_id where teacher.tname = "波多"
)
)
9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;     
select c.student_id,student.sname from
(select A.student_id,a,b from
 
        (select student_id,number as a from score left join course on score.corse_id = course.cid where course.cid = 1) as A
 
        left join
 
        (select student_id,number  as b from score left join course on score.corse_id = course.cid where course.cid = 2) as B
        on A.student_id = B.student_id where b >  a ) as c
         LEFT JOIN
       student on c.student_id = student.sid;
10、查询有课程成绩小于60分的同学的学号、姓名;  
select sid,sname from student where sid in (
        select distinct student_id from score where number < 60
    )

select sid,sname from student where sid in (
        select  student_id from score where number < 60 GROUP BY student_id
    )
11、查询没有学全所有课的同学的学号、姓名;     思路:         在分数表中根据学生进行分组,获取每一个学生选课数量         如果数量 == 总课程数量,表示已经选择了所有课程      
 select student_id,sname from score left join student on score.student_id = student.sid
        group by student_id HAVING count(corse_id) = (select count(cid) from course)
 
12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;     思路:         获取 001 同学选择的所有课程         获取课程在其中的所有人以及所有课程         根据学生筛选,获取所有学生信息         再与学生表连接,获取姓名
select student_id,sname, count(corse_id)
        from score left join student on score.student_id = student.sid
        where student_id != 1 and corse_id in (select corse_id from score where student_id = 1) group by student_id
13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;         先找到和001的学过的所有人         然后个数 = 001所有学科     ==》 其他人可能选择的更多  
 select student_id,sname, count(corse_id)
        from score left join student on score.student_id = student.sid
        where student_id != 1 and corse_id in (select corse_id from score where student_id = 1) 
group by student_id
14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;                   个数相同         002学过的也学过  
select student_id,sname from score left join student on score.student_id = student.sid where student_id in (
            select student_id from score  where student_id != 1 group by student_id HAVING count(corse_id) = (select count(1) from score where student_id = 1)
        ) and corse_id in (select corse_id from score where student_id = 1) group by student_id HAVING count(corse_id) = (select count(1) from score where student_id = 1)
15、删除学习“叶平”老师课的score表记录;  
delete from score where corse_id in (
        select cid from course left join teacher on course.teache_id = teacher.tid where teacher.tname = 饭岛
    )
16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;   
insert into score(student_id, corse_id, number) select sid,2,(select avg(number) from score where corse_id = 2)
    from student where sid not in (
        select student_id from score where corse_id = 2
    )
     
17、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;    
 select sc.student_id,
        (select number from score left join course on score.corse_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
        (select number from

                  

	 	
                    
                    
                    
                    
                    
                

人气教程排行