zoukankan      html  css  js  c++  java
  • MYSQL 练习

    导出现有数据库数据:

    • mysqldump -u用户名 -p密码 数据库名称 >导出文件路径           # 结构+数据
    • mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径       # 结构 

    导入现有数据库数据:

    • mysqldump -uroot -p密码  数据库名称 < 文件路径  

    一、表关系

    请创建如下表,并创建相关约束

    二、操作表

    1、自行创建测试数据

    /*
    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 score left join course on score.corse_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
            (select number from score left join course on score.corse_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
            count(sc.corse_id),
            avg(sc.number)
        from score as sc
        group by student_id desc  
    
    
     select student_id,
            (select number from score as a WHERE a.student_id=b.student_id and  corse_id=1)as sw,
            (select number from score as a WHERE a.student_id=b.student_id and corse_id=2) as ty,
             (select number from score as a WHERE a.student_id=b.student_id  and corse_id=3) as wl,
            count(corse_id),avg(number)from score as b group by student_id ORDER BY avg(number) desc 
    18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;   
     select corse_id, max(number) as max_num, min(number) as min_num from score group by corse_id;
    19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
        思路:case when .. then   (类似三目(元)运算)   
    select corse_id, avg(number) ,sum(case when score.number > 60 then 1 else 0 END)/count(1)*100 as percent 
    from score group by corse_id order by avg(number) asc,percent desc;
    20、课程平均分从高到低显示(现实任课老师); 
    select avg(if(isnull(score.number),0,score.number)),teacher.tname from course
        left join score on course.cid = score.corse_id
        left join teacher on course.teache_id = teacher.tid
     
        group by score.corse_id
     
    
    select avg(score.number),teacher.tname from course
        left join score on course.cid = score.corse_id
        left join teacher on course.teache_id = teacher.tid
     
        group by score.corse_id
    21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
     select score.sid,score.corse_id,score.number,T.first_num,T.second_num from score left join
        (
        select sid,
            (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 0,1) as first_num,
            (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 2,1) as second_num
        from
            score as s1
        ) as T
        on score.sid =T.sid
        where score.number <= T.first_num and score.number >= T.second_num
    22、查询每门课程被选修的学生数;  
    select corse_id, count(1) from score group by corse_id
    23、查询出只选修了一门课程的全部学生的学号和姓名;
        
    select student.sid, student.sname, count(1) from score
     
        left join student on score.student_id  = student.sid
     
         group by corse_id having count(1) = 1
    24、查询男生、女生的人数;
        
    select * from
        (select count(1) as man from student where gender='')as A ,
        (select count(1) as feman from student where gender='') as B
    25、查询姓“张”的学生名单;  
    select sname from student where sname like '张%';
    26、查询同名同姓学生名单,并统计同名人数;  
    select sname,count(1) as count from student group by sname;
    27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;   
    select corse_id,avg(if(isnull(number), 0 ,number)) as avg from score group by corse_id order by avg asc,corse_id desc;
    
    select corse_id,avg(number)from score group by corse_id order by avg(number) asc,corse_id desc;
    28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;   
    select student_id,avg(number),student.sname FROM score LEFT JOIN student on student.sid = score.student_id GROUP BY student_id 
    HAVING avg(number)>85;
    29、查询课程名称为“数学”,且分数低于60的学生姓名和分数; 
    SELECT student.sname,score.number FROM score LEFT JOIN student on student.sid = score.student_id left join course on score.corse_id = course.cid 
    WHERE score.number<60 and course.cname= "物理"
    30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; 
    select student.sname,score.student_id from score LEFT JOIN student
    on student.sid = score.student_id WHERE score.number>80 and score.corse_id=3 GROUP BY student_id 
    31、求选了课程的学生人数 
    select count(distinct student_id) from score
    
    select count(c) from (
         select count(student_id) as c from score group by student_id) as A
    32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;   
     select sname,number from score
        left join student on score.student_id = student.sid
        where score.corse_id in (select course.cid from course left join teacher 
            on course.teache_id = teacher.tid where tname='波多') order by number desc limit 1;
    33、查询各个课程及相应的选修人数;
    select course.cname,count(1) from score
        left join course on score.corse_id = course.cid
        group by corse_id;
    34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;   
    select DISTINCT s1.corse_id,s2.corse_id,s1.number,s2.number from score as s1, score as s2 where s1.number = s2.number and s1.corse_id != s2.corse_id;
    35、查询每门课程成绩最好的前两名;
    select score.sid,score.corse_id,score.number,T.first_num,T.second_num from score left join
        (
        select
            sid,
            (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 0,1) as first_num,
            (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 1,1) as second_num
        from
            score as s1
        ) as T
        on score.sid =T.sid
        where score.number <= T.first_num and score.number >= T.second_num
    36、检索至少选修两门课程的学生学号;
     select student_id from score group by student_id having count(student_id) > 1
    37、查询全部学生都选修的课程的课程号和课程名;  
    select  corse_id,course.cname,count(student_id) from score LEFT JOIN course on 
    score.corse_id = course.cid GROUP BY corse_id HAVING COUNT(student_id)=(select count(sid) FROM student)
    38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;   
     select student_id,student.sname from score
        left join student on score.student_id = student.sid
        where score.corse_id not in (
            select cid from course left join teacher on course.teache_id = teacher.tid where tname = '波多'
        )
        group by student_id
     
    
    select student_id,student.sname from score
        left join student on score.student_id = student.sid
        where score.corse_id not in (
            select cid from course left join teacher on course.teache_id = teacher.tid where tname = '波多'
        )
        group by student_id
    39、查询两门以上不及格课程的同学的学号及其平均成绩;
    select student_id,avg(number) from score  where number<60 GROUP BY student_id having count(corse_id)>=2
    40、检索“004”课程分数小于60,按分数降序排列的同学学号;  
    SELECT student_id,number from score where corse_id=4 and number<60 ORDER BY number desc
    41、删除“002”同学的“001”课程的成绩; 
     delete from score where corse_id = 1 and student_id = 2
  • 相关阅读:
    linux基本知识2
    Notification发送通知
    CSDN管理员看过来
    linux 中安装JDK
    断开网线黑客也能盗走你的数据
    1.6.2 多表插入
    【笨木头Lua专栏】基础补充07:协同程序初探
    猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController
    mysql innodb插入意向锁
    MongoDB实战指南(七):MongoDB复制集之复制集工作机制
  • 原文地址:https://www.cnblogs.com/lst1010/p/5994159.html
Copyright © 2011-2022 走看看