暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql练习-多表关联查询

坚果测试笔记 2021-06-29
1018
单表执行顺序
    select distinct 字段1,...,字段n from 库.表
    where 条件
    group by 分组字段
    having 过滤
    order by 排序字段
    limit n;
    执行顺序:from->where->group by->having->select->distinct->order by->limit



    多表关联逻辑
    交叉连接:无任何匹配条件,生成笛卡尔积
            示例:select * from student,class;
    内连接:只取共同部分
            示例:select * from student st inner JOIN class cl on st.class_id=cl.cid;
    左连接:在内连接的基础上保留左表的记录
            示例:select * from student st LEFT JOIN class cl on st.class_id=cl.cid;
    右连接:在内连接的基础上保留右表的记录
            示例:select * from student st RIGHT JOIN class cl on st.class_id=cl.cid;
    全外连接:在内连接的基础上保留左右两表没有对应关系的记录
            示例:select * from student st RIGHT JOIN class cl on st.class_id=cl.cid UNION select * from student st left JOIN class cl on st.class_id=cl.cid;


    表结构


    准备
    建库
      create database test;
      取消外键约束
        SET FOREIGN_KEY_CHECKS=0;
        建表-class
          DROP TABLE IF EXISTS `class`;
          CREATE TABLE `class` (
          `cid` int(11) NOT NULL AUTO_INCREMENT,
          `caption` varchar(255) NOT NULL,
          `grade_id` int(11) NOT NULL,
          PRIMARY KEY (`cid`)
          ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
          插数据
            INSERT INTO `class` VALUES ('1', '一年一班', '1');
            INSERT INTO `class` VALUES ('2', '二年一班', '2');
            INSERT INTO `class` VALUES ('3', '三年二班', '3');
            INSERT INTO `class` VALUES ('4', '一年二班', '1');
            INSERT INTO `class` VALUES ('5', '一年三班', '1');
            INSERT INTO `class` VALUES ('6', '一年四班', '1');
            INSERT INTO `class` VALUES ('7', '二年二班', '2');
            INSERT INTO `class` VALUES ('8', '二年三班', '2');
            INSERT INTO `class` VALUES ('9', '三年一班', '3');
            INSERT INTO `class` VALUES ('10', '四年一班', '4');
            INSERT INTO `class` VALUES ('11', '五年一班', '5');
            INSERT INTO `class` VALUES ('12', '五年二班', '5');
            INSERT INTO `class` VALUES ('13', '五年三班', '5');
            INSERT INTO `class` VALUES ('14', '五年四班', '5');
            INSERT INTO `class` VALUES ('15', '五年五班', '5');
            建表-class_grade
              DROP TABLE IF EXISTS `class_grade`;
              CREATE TABLE `class_grade` (
              `gid` int(11) NOT NULL AUTO_INCREMENT,
              `gname` varchar(255) NOT NULL,
              PRIMARY KEY (`gid`)
              ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
              INSERT INTO `class_grade` VALUES ('1', '一年级');
              INSERT INTO `class_grade` VALUES ('2', '二年级');
              INSERT INTO `class_grade` VALUES ('3', '三年级');
              INSERT INTO `class_grade` VALUES ('4', '四年级');
              INSERT INTO `class_grade` VALUES ('5', '五年级');
              INSERT INTO `class_grade` VALUES ('6', '六年级');
              表-course
                DROP TABLE IF EXISTS `course`;
                CREATE TABLE `course` (
                `cid` int(11) NOT NULL,
                `cname` varchar(255) NOT NULL,
                `teacher_id` int(11) NOT NULL,
                PRIMARY KEY (`cid`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
                INSERT INTO `course` VALUES ('1', '生物', '1');
                INSERT INTO `course` VALUES ('2', '体育', '1');
                INSERT INTO `course` VALUES ('3', '物理', '2');
                INSERT INTO `course` VALUES ('4', '地理', '1');
                建表-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` varchar(255) DEFAULT NULL,
                  PRIMARY KEY (`sid`)
                  ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;
                  INSERT INTO `score` VALUES ('1', '1', '1', '60');
                  INSERT INTO `score` VALUES ('2', '1', '2', '59');
                  INSERT INTO `score` VALUES ('3', '2', '2', '99');
                  INSERT INTO `score` VALUES ('4', '3', '1', '10');
                  INSERT INTO `score` VALUES ('5', '3', '2', '88');
                  INSERT INTO `score` VALUES ('6', '4', '2', '89');
                  INSERT INTO `score` VALUES ('7', '5', '1', '56');
                  INSERT INTO `score` VALUES ('8', '5', '2', '12');
                  INSERT INTO `score` VALUES ('9', '6', '1', '23');
                  INSERT INTO `score` VALUES ('10', '7', '2', '43');
                  INSERT INTO `score` VALUES ('11', '8', '1', '65');
                  INSERT INTO `score` VALUES ('12', '8', '2', '76');
                  INSERT INTO `score` VALUES ('13', '9', '1', '98');
                  INSERT INTO `score` VALUES ('14', '10', '2', '57');
                  INSERT INTO `score` VALUES ('15', '11', '1', '76');
                  INSERT INTO `score` VALUES ('16', '11', '2', '65');
                  INSERT INTO `score` VALUES ('17', '12', '2', '55');
                  INSERT INTO `score` VALUES ('18', '2', '1', '30');
                  INSERT INTO `score` VALUES ('19', '1', '4', '59');
                  建表-student
                    DROP TABLE IF EXISTS `student`;
                    CREATE TABLE `student` (
                    `sid` int(11) NOT NULL AUTO_INCREMENT,
                    `sname` varchar(255) NOT NULL,
                    `gender` enum('女','男') NOT NULL DEFAULT '男',
                    `class_id` int(11) NOT NULL,
                    PRIMARY KEY (`sid`)
                    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;


                    INSERT INTO `student` VALUES ('1', 'lucy', '女', '1');
                    INSERT INTO `student` VALUES ('16', '学生名07', '男', '3');
                    INSERT INTO `student` VALUES ('2', 'alicy', '女', '1');
                    INSERT INTO `student` VALUES ('3', 'laowang', '男', '2');
                    INSERT INTO `student` VALUES ('4', 'tom', '男', '2');
                    INSERT INTO `student` VALUES ('5', 'jack', '男', '2');
                    INSERT INTO `student` VALUES ('6', '学生名01', '男', '1');
                    INSERT INTO `student` VALUES ('7', '学生名02', '女', '1');
                    INSERT INTO `student` VALUES ('8', '学生名03', '男', '2');
                    INSERT INTO `student` VALUES ('9', '学生名04', '男', '1');
                    INSERT INTO `student` VALUES ('10', '学生名05', '男', '2');
                    INSERT INTO `student` VALUES ('11', '学生名06', '男', '1');
                    INSERT INTO `student` VALUES ('12', '学生名07', '男', '2');
                    建表-teacher
                      DROP TABLE IF EXISTS `teacher`;
                      CREATE TABLE `teacher` (
                      `tid` int(11) NOT NULL,
                      `tname` varchar(255) DEFAULT NULL,
                      PRIMARY KEY (`tid`)
                      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


                      INSERT INTO `teacher` VALUES ('0', '赵老师');
                      INSERT INTO `teacher` VALUES ('1', '张老师');
                      INSERT INTO `teacher` VALUES ('2', '李老师');
                      INSERT INTO `teacher` VALUES ('3', '王老师');
                      INSERT INTO `teacher` VALUES ('4', '谢老师');
                      建表-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`)
                        ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;


                        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');
                        INSERT INTO `teacher2cls` VALUES ('5', '3', '5');
                        INSERT INTO `teacher2cls` VALUES ('6', '4', '11');
                        INSERT INTO `teacher2cls` VALUES ('7', '3', '12');


                        练习题
                        01、查询同时选修了体育课和生物课的学生id和姓名
                        02、查询“2”课程分数小于60,按分数降序排列的同学学号
                        03、查询有两门及以上课程超过60分的学生id及其平均成绩
                        04、查询没有带过任何班级的老师id和姓名
                        05、查询没有学生选修的课程的课程号和课程名
                        06、查询至少选修两门课程的学生学号
                        07、查询各个课程及相应的选修人数
                        08、查询课程编号为“2”且课程成绩在80分以上的学生的学号和姓名
                        09、查询课程名称为“生物”,且分数低于60的学生姓名和分数
                        10、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
                        11、查询同名同姓学生名单,并统计同名人数
                        12、查询男生、女生的人数,按倒序排列;
                        13、查询选修了2门以上课程的全部学生的学号和姓名
                        14、查询每门课程被选修的学生数
                        15、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名
                        16、查询没有学全所有课的同学的学号、姓名
                        17、查询有课程成绩小于60分的同学的学号、姓名
                        18、查询所带班级数最多的老师id和姓名
                        19、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名
                        20、查询带过超过2个班级的老师的id和姓名
                        21、查询没有带过高年级的老师id和姓名(12为低年级,34为中年级,56位高年级)
                        22、查询学过编号‘1’课程和编号‘2’课程的同学的学号、姓名
                        23、查询教授课程超过2门的老师的id和姓名
                        24、查询学过‘张老师’老师2门课以上的同学的学号、姓名
                        25、查询班级信息,包括班级id、班级名称、年级、年级级别
                        26、查询班级数小于5的年级id和年级名
                        27、查询每位学生的学号,姓名,选课数,平均成绩
                        28、查询每个年级的学生人数
                        29、查询每个年级的班级数,取出班级数最多的前三个年级
                        30、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名

                        答案将在后续文章中发出
                        文章转载自坚果测试笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论