• Mysql学习---SQL测试题之表结构


    创建表结果和数据准备[直接执行即可]

      1 /*
      2 Navicat MySQL Data Transfer
      3 
      4 Source Server         : ftl1012
      5 Source Server Version : 50617
      6 Source Host           : localhost:3306
      7 Source Database       : test_python
      8 
      9 Target Server Type    : MYSQL
     10 Target Server Version : 50617
     11 File Encoding         : 65001
     12 
     13 Date: 2017-12-30 13:12:57
     14 */
     15 
     16 SET FOREIGN_KEY_CHECKS=0;
     17 
     18 -- ----------------------------
     19 -- Table structure for class
     20 -- ----------------------------
     21 DROP TABLE IF EXISTS `class`;
     22 CREATE TABLE `class` (
     23   `cid` int(11) NOT NULL AUTO_INCREMENT,
     24   `caption` varchar(32) NOT NULL,
     25   PRIMARY KEY (`cid`)
     26 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
     27 
     28 -- ----------------------------
     29 -- Records of class
     30 -- ----------------------------
     31 INSERT INTO `class` VALUES ('1', '三年二班');
     32 INSERT INTO `class` VALUES ('2', '三年三班');
     33 INSERT INTO `class` VALUES ('3', '一年二班');
     34 INSERT INTO `class` VALUES ('4', '二年九班');
     35 
     36 -- ----------------------------
     37 -- Table structure for course
     38 -- ----------------------------
     39 DROP TABLE IF EXISTS `course`;
     40 CREATE TABLE `course` (
     41   `cid` int(11) NOT NULL AUTO_INCREMENT,
     42   `cname` varchar(32) NOT NULL,
     43   `teacher_id` int(11) NOT NULL,
     44   PRIMARY KEY (`cid`),
     45   KEY `fk_course_teacher` (`teacher_id`),
     46   CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
     47 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
     48 
     49 -- ----------------------------
     50 -- Records of course
     51 -- ----------------------------
     52 INSERT INTO `course` VALUES ('1', '生物', '1');
     53 INSERT INTO `course` VALUES ('2', '物理', '2');
     54 INSERT INTO `course` VALUES ('3', '体育', '3');
     55 INSERT INTO `course` VALUES ('4', '美术', '2');
     56 
     57 -- ----------------------------
     58 -- Table structure for score
     59 -- ----------------------------
     60 DROP TABLE IF EXISTS `score`;
     61 CREATE TABLE `score` (
     62   `sid` int(11) NOT NULL AUTO_INCREMENT,
     63   `student_id` int(11) NOT NULL,
     64   `course_id` int(11) NOT NULL,
     65   `num` int(11) NOT NULL,
     66   PRIMARY KEY (`sid`),
     67   KEY `fk_score_student` (`student_id`),
     68   KEY `fk_score_course` (`course_id`),
     69   CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
     70   CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
     71 ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
     72 
     73 -- ----------------------------
     74 -- Records of score
     75 -- ----------------------------
     76 INSERT INTO `score` VALUES ('1', '1', '1', '10');
     77 INSERT INTO `score` VALUES ('2', '1', '2', '9');
     78 INSERT INTO `score` VALUES ('5', '1', '4', '66');
     79 INSERT INTO `score` VALUES ('6', '2', '1', '8');
     80 INSERT INTO `score` VALUES ('8', '2', '3', '68');
     81 INSERT INTO `score` VALUES ('9', '2', '4', '99');
     82 INSERT INTO `score` VALUES ('10', '3', '1', '77');
     83 INSERT INTO `score` VALUES ('11', '3', '2', '66');
     84 INSERT INTO `score` VALUES ('12', '3', '3', '87');
     85 INSERT INTO `score` VALUES ('13', '3', '4', '99');
     86 INSERT INTO `score` VALUES ('14', '4', '1', '79');
     87 INSERT INTO `score` VALUES ('15', '4', '2', '11');
     88 INSERT INTO `score` VALUES ('16', '4', '3', '67');
     89 INSERT INTO `score` VALUES ('17', '4', '4', '100');
     90 INSERT INTO `score` VALUES ('18', '5', '1', '79');
     91 INSERT INTO `score` VALUES ('19', '5', '2', '11');
     92 INSERT INTO `score` VALUES ('20', '5', '3', '67');
     93 INSERT INTO `score` VALUES ('21', '5', '4', '100');
     94 INSERT INTO `score` VALUES ('22', '6', '1', '9');
     95 INSERT INTO `score` VALUES ('23', '6', '2', '100');
     96 INSERT INTO `score` VALUES ('24', '6', '3', '67');
     97 INSERT INTO `score` VALUES ('25', '6', '4', '100');
     98 INSERT INTO `score` VALUES ('26', '7', '1', '9');
     99 INSERT INTO `score` VALUES ('27', '7', '2', '100');
    100 INSERT INTO `score` VALUES ('28', '7', '3', '67');
    101 INSERT INTO `score` VALUES ('29', '7', '4', '88');
    102 INSERT INTO `score` VALUES ('30', '8', '1', '9');
    103 INSERT INTO `score` VALUES ('31', '8', '2', '100');
    104 INSERT INTO `score` VALUES ('32', '8', '3', '67');
    105 INSERT INTO `score` VALUES ('33', '8', '4', '88');
    106 INSERT INTO `score` VALUES ('34', '9', '1', '91');
    107 INSERT INTO `score` VALUES ('35', '9', '2', '88');
    108 INSERT INTO `score` VALUES ('36', '9', '3', '67');
    109 INSERT INTO `score` VALUES ('37', '9', '4', '22');
    110 INSERT INTO `score` VALUES ('38', '10', '1', '90');
    111 INSERT INTO `score` VALUES ('39', '10', '2', '77');
    112 INSERT INTO `score` VALUES ('40', '10', '3', '43');
    113 INSERT INTO `score` VALUES ('41', '10', '4', '87');
    114 INSERT INTO `score` VALUES ('42', '11', '1', '90');
    115 INSERT INTO `score` VALUES ('43', '11', '2', '77');
    116 INSERT INTO `score` VALUES ('44', '11', '3', '43');
    117 INSERT INTO `score` VALUES ('45', '11', '4', '87');
    118 INSERT INTO `score` VALUES ('46', '12', '1', '90');
    119 INSERT INTO `score` VALUES ('47', '12', '2', '77');
    120 INSERT INTO `score` VALUES ('48', '12', '3', '43');
    121 INSERT INTO `score` VALUES ('49', '12', '4', '87');
    122 INSERT INTO `score` VALUES ('52', '13', '3', '87');
    123 
    124 -- ----------------------------
    125 -- Table structure for student
    126 -- ----------------------------
    127 DROP TABLE IF EXISTS `student`;
    128 CREATE TABLE `student` (
    129   `sid` int(11) NOT NULL AUTO_INCREMENT,
    130   `gender` char(1) NOT NULL,
    131   `class_id` int(11) NOT NULL,
    132   `sname` varchar(32) NOT NULL,
    133   PRIMARY KEY (`sid`),
    134   KEY `fk_class` (`class_id`),
    135   CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
    136 ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    137 
    138 -- ----------------------------
    139 -- Records of student
    140 -- ----------------------------
    141 INSERT INTO `student` VALUES ('1', '', '1', '理解');
    142 INSERT INTO `student` VALUES ('2', '', '1', '钢蛋');
    143 INSERT INTO `student` VALUES ('3', '', '1', '张三');
    144 INSERT INTO `student` VALUES ('4', '', '1', '张一');
    145 INSERT INTO `student` VALUES ('5', '', '1', '张二');
    146 INSERT INTO `student` VALUES ('6', '', '1', '张四');
    147 INSERT INTO `student` VALUES ('7', '', '2', '铁锤');
    148 INSERT INTO `student` VALUES ('8', '', '2', '李三');
    149 INSERT INTO `student` VALUES ('9', '', '2', '李一');
    150 INSERT INTO `student` VALUES ('10', '', '2', '李二');
    151 INSERT INTO `student` VALUES ('11', '', '2', '李四');
    152 INSERT INTO `student` VALUES ('12', '', '3', '如花');
    153 INSERT INTO `student` VALUES ('13', '', '3', '刘三');
    154 INSERT INTO `student` VALUES ('14', '', '3', '刘一');
    155 INSERT INTO `student` VALUES ('15', '', '3', '刘二');
    156 INSERT INTO `student` VALUES ('16', '', '3', '刘四');
    157 
    158 -- ----------------------------
    159 -- Table structure for teacher
    160 -- ----------------------------
    161 DROP TABLE IF EXISTS `teacher`;
    162 CREATE TABLE `teacher` (
    163   `tid` int(11) NOT NULL AUTO_INCREMENT,
    164   `tname` varchar(32) NOT NULL,
    165   PRIMARY KEY (`tid`)
    166 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    167 
    168 -- ----------------------------
    169 -- Records of teacher
    170 -- ----------------------------
    171 INSERT INTO `teacher` VALUES ('1', '张磊老师');
    172 INSERT INTO `teacher` VALUES ('2', '李平老师');
    173 INSERT INTO `teacher` VALUES ('3', '刘海燕老师');
    174 INSERT INTO `teacher` VALUES ('4', '朱云海老师');
    175 INSERT INTO `teacher` VALUES ('5', '李杰老师');
    View Code

    image

    经验: join, 临时表的学习[in 的使用,右边只能输出一个]

    -- 查询平均成绩大于60分的同学的学号和平均成绩,按照平均成绩降序排序 操作score张表关联student查姓名

    方案一[FTL]:
    select * from (select student_id, avg(num) from score group by student_id having avg(num) > 60) as T left join student on student.sid = T.student_id;
    方案二:
    select score.student_id, student.sname, avg(num),max(num),min(num) from score LEFT JOIN student on student.sid = score.student_id
    GROUP BY score.student_id having avg(num) > 60 order by avg(num) desc;

    image

    -- 查询所有同学的学号、姓名、选课数、总成绩;

    SELECT  a.sid, a.sname, 
    SUM(s.num) as zongchengji, count(s.course_id) as xuankeshu from score s 
    LEFT JOIN student a on a.sid = s.student_id  GROUP BY s.student_id

    image

    -- 查询姓“李”的老师的个数;

    方案一[FTL]:select count(tname) from teacher where tname like '李%';
    方案二:select count(1) from teacher where tname like '李%';

    image

    -- 查询没学过“李平”老师课的同学的学号、姓名;

    方案一[FTL]:局限性:不能查其他表中的内容
       -- 没学过  ==> not int ==> sid not in 成绩表
       -- 利用成绩表查找课程信息 ==>关联老师的信息
       -- 李平老师  ==> where tname like '李平'
    select student.sid, student.sname from student where sid not in 
    (
       select student_id from score LEFT JOIN
        course on score.course_id = course.cid  
       LEFT JOIN teacher on teacher.tid = course.teacher_id 
      where tname like '李平%'
    );
    
    方案二:
    思路:
        先查到“李平老师”老师教的所有课ID
        获取选过课的所有学生ID
        学生表中筛选
    select * from student where sid not in (
        select DISTINCT student_id from score where score.course_id in (
            select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老师'
        )
    )

    image

    -- 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

    方案一[FTL]:
       -- 选出课程为1或者2的课 ==> 关联student表查询
    SELECT sid,sname from student where sid in 
    (select DISTINCT student_id from score where score.course_id in 
    (select cid from course where cid in (1,2)))
    
    方案二:
    SELECT sid, sname from 
    (SELECT student_id, count(student_id) FROM
    (SELECT student_id, course_id FROM score WHERE course_id = 1 OR course_id = 2) AS B
    GROUP BY student_id HAVING count(student_id) > 1
    ) as C LEFT JOIN student on student.sid = C.student_id;
    
    方案三:
    select student_id,sname from
     (select student_id,course_id from score where course_id = 1 or course_id = 2) as B left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1;

    image

    -- 查询没有学全所有课的同学的学号、姓名;

    -- 查询没有学全所有课的同学的学号、姓名;
       -- 所有课  ==> count(1) from course
       -- 同学的学号、姓名 ==> sid, sname from student 
       -- 没有学全所有课   ==> count(course_id)
    方案二:
    SELECT student.sid, sname from student LEFT JOIN score on score.student_id = student.sid 
    group by student_id HAVING count(course_id) = (select count(1) from course)

    image

    -- 查询学过“李平老师“所教的所有课的同学的学号、姓名;

    -- 查询学过“李平老师“所教的所有课的同学的学号、姓名;
    -- 找到李平老师教过的课程ID
    方案一[FTL]:
    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 teacher_id = tid WHERE teacher.tname LIKE '%李平%' ))
    
    方案二:
    select sid, sname from (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='李平老师') group by student_id)
    as B left JOIN student on student.sid = B.student_id

    image

    -- 查询所有课程成绩小于60分的同学的学号、姓名;

    -- 查询所有课程成绩小于60分的同学的学号、姓名;
    方案一[FTL]:
    select * from (
    select student_id, num from score LEFT JOIN student on student.sid = score.student_id  where num < 60 ORDER BY num asc ) as B LEFT JOIN student on B.student_id = student.sid

    image

    -- 查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名

    -- 查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名
    方案一[FTL_有错误,未解决]
    select student.sid, sname from 
    (SELECT * from score where course_id in (
    	select course_id from score where student_id = 1
    )) as B LEFT JOIN student on B.sid = student.sid
    方案二:
       思路:
            获取 001 同学选择的所有课程
            获取课程在其中的所有人以及所有课程
            根据学生筛选,获取所有学生信息
            再与学生表连接,获取姓名
    select student_id, sname, count(course_id) from score 
    LEFT JOIN student on student.sid = score.student_id where student_id != 1 and course_id in (
    select course_id from score where course_id = 1) GROUP BY student_id

    image

    -- 查询至少学过学号为“001”同学所有课数目相同的其他同学学号和姓名

    -- 查询至少学过学号为“001”同学所有课数目相同的其他同学学号和姓名
      -- 001 所学习的课程
      -- 其他人的课 >= 001里面的课
    方案一[FTL]:
    select sid, sname from 
    (select student_id, course_id from score where course_id in 
    (select course_id from score where student_id = 1) group by student_id
    HAVING count(1) = (select count(1) from score WHERE student_id = 1) ) as B
    LEFT JOIN student on student.sid = B.student_id GROUP BY student_id

    image

    -- 查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;【高难度】

    -- 查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;【高难度】
       -- 002号学习的课程
       -- count(1) == 002的课程count(1)
       -- left JOIN student 拼接姓名和学号
    -- 数量相同学生ID
    select student_id, course_id, count(1) from score GROUP BY student_id having count(1) = 
    (select count(1) from score where student_id = 2 ) 
    -- 课程相同
    select student_id, course_id from score where course_id in 
    (select DISTINCT course_id from score where student_id = 2) GROUP BY student_id
    -- 综合完成
     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(course_id) = (select count(1) from score where student_id = 1)) and course_id in (select course_id from score where student_id = 1) group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1)

    image

    -- 删除学习“叶平”老师课的score表记录;

    delete from score where course_id in (
    select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.name = '叶平') 

    [更多参考] http://www.cnblogs.com/wupeiqi/articles/5729934.html  

    [更多参考] http://www.cnblogs.com/wupeiqi/articles/5748496.html  

  • 相关阅读:
    Android中Bitmap对象和字节流之间的相互转换
    Android 6.0以后的版本报错:open failed: EACCES (Permission denied)
    C#—ASP.NET:集成极光推送(Push API v3)
    极光推送(C#)
    模仿今日头条导航栏滑动显示更多
    使用VMWare虚拟mac系统,设置网络的正确姿势
    vmware panic(CPU 0 caller 0x)launchd exited
    VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
    Flutter Dart List.map() 获取下标
    Flutter利用GridView实现网格的商品布局
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9385161.html
Copyright © 2020-2023  润新知