• 练习




    /*
    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 ;
    完整sql
    
    
    
    
    #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)
  • 相关阅读:
    2020/10/25助教一周小结(第八周)
    2020/10/18助教一周小结(第七周)
    2020/10/11助教一周小结(第六周)
    2020/10/05助教一周小结(第五周)
    2020/09/27助教一周小结(第四周)
    第三次作业总结
    第二次作业总结
    2020-11-08 助教一周小结(第十周)
    2020-11-01 助教一周小结(第九周)
    2020-10-25 助教一周小结(第八周)
  • 原文地址:https://www.cnblogs.com/caimengzhi/p/8602498.html
Copyright © 2020-2023  润新知