美文网首页
sql 语句练习(2)

sql 语句练习(2)

作者: dongshangtong | 来源:发表于2019-05-10 08:38 被阅读0次

    自己练习sql 和分析。


    545D960C-2BC5-4877-B979-5EADEDCE235E.png

    表结构和数据

    /*
     Navicat Premium Data Transfer
    
     Source Server         : localhost
     Source Server Type    : MySQL
     Source Server Version : 50624
     Source Host           : localhost
     Source Database       : sqlexam
    
     Target Server Type    : MySQL
     Target Server Version : 50624
     File Encoding         : utf-8
    
     Date: 10/21/2016 06:46:46 AM
    */
    
    SET NAMES utf8;
    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(32) NOT NULL,
      PRIMARY KEY (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `class`
    -- ----------------------------
    BEGIN;
    INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `course`
    -- ----------------------------
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE `course` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `cname` varchar(32) NOT NULL,
      `teacher_id` int(11) NOT NULL,
      PRIMARY KEY (`cid`),
      KEY `fk_course_teacher` (`teacher_id`),
      CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `course`
    -- ----------------------------
    BEGIN;
    INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
    COMMIT;
    
    -- ----------------------------
    --  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,
      `num` int(11) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_score_student` (`student_id`),
      KEY `fk_score_course` (`course_id`),
      CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
      CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `score`
    -- ----------------------------
    BEGIN;
    INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `student`
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `gender` char(1) NOT NULL,
      `class_id` int(11) NOT NULL,
      `sname` varchar(32) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_class` (`class_id`),
      CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `student`
    -- ----------------------------
    BEGIN;
    INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `teacher`
    -- ----------------------------
    DROP TABLE IF EXISTS `teacher`;
    CREATE TABLE `teacher` (
      `tid` int(11) NOT NULL AUTO_INCREMENT,
      `tname` varchar(32) NOT NULL,
      PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `teacher`
    -- ----------------------------
    BEGIN;
    INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    表结构和数据
    

    1.查询课程成绩大于60

    SELECT * FROM score WHERE num > 60
    

    2.查询每个老师任的几门课程

    SELECT teacher_id , COUNT(1) FROM course  GROUP BY teacher_id
    

    3.查询老师任课程和且要显示老师名称

    SELECT co.cid, co.cname , co.teacher_id, te.tname FROM course co LEFT JOIN teacher te on  co.teacher_id = te.tid
    
    

    4.查询每个学生对应的班级信息

    SELECT st.sid , st.gender,st.sname,cl.cid,cl.caption FROM student st  LEFT JOIN class cl on st.class_id = cl.cid
    
    

    5.查询学生表里的男女个数是多少啊?

    SELECT gender, COUNT(sid) FROM student GROUP BY  gender
    

    6.查询平均成绩大于60分的同学的学号和平均成绩

    SELECT sc.student_id , AVG(num) as avg_num FROM score sc  GROUP BY sc.student_id HAVING  avg_num > 60
    
    

    7.查询平均成绩大于60分的同学的信息和平均成绩

    SELECT st.sid ,st.sname , st.gender, b.avg_num  FROM student st RIGHT  JOIN
            (SELECT sc.student_id , AVG(num) as avg_num FROM score sc  GROUP BY sc.student_id HAVING  avg_num > 60) B
            ON st.sid = b.student_id
    

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

    SELECT st.sid, st.sname, COUNT(sc.student_id) , SUM(sc.num) FROM student st 
            LEFT JOIN score sc on st.sid = sc.student_id  GROUP BY st.sid
    

    9.查询姓“李”的老师的个数

                SELECT COUNT(tid) FROM teacher WHERE   tname like '李%'
    

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

           SELECT tid FROM teacher WHERE tname = '李平老师'
                 
    --           李平老师所任课的课程ID
                 SELECT  cid  FROM course WHERE teacher_id = (SELECT tid FROM teacher WHERE tname = '李平老师')
                 
    --           学过李平老师 的学生
                 SELECT sc.student_id FROM score sc WHERE sc.course_id  IN( 
                 SELECT  cid  FROM course WHERE teacher_id = (SELECT tid FROM teacher WHERE tname = '李平老师')
                 ) GROUP BY sc.student_id
                 
    --           再找没有学过李平老师的学生
         SELECT st.sid ,st.sname FROM student st  WHERE st.sid not in (
             
                         SELECT sc.student_id FROM score sc WHERE sc.course_id  IN( 
                                    SELECT  cid  FROM course WHERE teacher_id = (SELECT tid FROM teacher WHERE tname = '李平老师')
                        ) GROUP BY sc.student_id
             )
    

    11.查询“生物”课程比“物理”课程成绩高的所有学生的学号

    --       生物  
                SELECT score.student_id,score.course_id,score.num FROM score LEFT JOIN course ON  score.course_id = course.cid WHERE course.cname = '生物'
    --       物理
                SELECT score.student_id,score.course_id,score.num FROM score LEFT JOIN course ON  score.course_id = course.cid WHERE course.cname = '物理'
            
         SELECT B.student_id FROM 
               (SELECT score.student_id,score.course_id,score.num FROM score LEFT JOIN course ON  score.course_id = course.cid WHERE course.cname = '生物') A
                 
                 INNER JOIN
                 (SELECT score.student_id,score.course_id,score.num FROM score LEFT JOIN course ON  score.course_id = course.cid WHERE course.cname = '物理') B
                 
                 ON A.student_id =  B.student_id
                 
                 WHERE A.num > B.num
    

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

                  SELECT st.sid, st.sname FROM  student st LEFT JOIN
                    score sc
                        ON  st.sid = sc.student_id
                    WHERE  sc.course_id = '1' or sc.course_id = '2' GROUP BY student_id
    

    12.查询学过“李平老师”所教的所有课的同学的学号、姓名

    --               李平老师 所教的课程ID
                    SELECT cid FROM course LEFT JOIN teacher ON teacher.tid = course.teacher_id  WHERE teacher.tname = '李平老师'
                 
    --           上过李平老师所有的课 的同学ID
    
             SELECT sc.student_id FROM score sc WHERE sc.course_id IN (
                SELECT cid FROM course LEFT JOIN teacher ON teacher.tid = course.teacher_id  WHERE teacher.tname = '李平老师'
     
             ) GROUP BY sc.student_id HAVING COUNT(sc.course_id) =(SELECT COUNT(cid) FROM course LEFT JOIN teacher ON teacher.tid = course.teacher_id  WHERE teacher.tname = '李平老师')
                 
                 
    --      最后连表显示同学姓名和学号
                 SELECT st.sid ,st.sname FROM   student st,
                   (SELECT sc.student_id FROM score sc WHERE sc.course_id IN(SELECT co.cid FROM course co LEFT JOIN teacher ON teacher.tid = co.teacher_id  WHERE teacher.tname = '李平老师') 
                        GROUP BY sc.student_id
                     HAVING COUNT(sc.course_id) =(SELECT COUNT(cou.cid) FROM course cou LEFT JOIN teacher ON teacher.tid = cou.teacher_id  WHERE teacher.tname = '李平老师')) B
                    WHERE st.sid = B.student_id
    

    13.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名

                  (SELECT sc1.student_id,sc1.num FROM score sc1 WHERE sc1.course_id = '1'A,
                     (SELECT sc2.student_id,sc2.num FROM score sc2 WHERE sc2.course_id = '2')B 
                        
                    SELECT st.sid , st.sname FROM student st,
                            (SELECT sc1.student_id,sc1.num FROM score sc1 WHERE sc1.course_id = '1')A,
                            (SELECT sc2.student_id,sc2.num FROM score sc2 WHERE sc2.course_id = '2')B
                     WHERE st.sid = A.student_id  and  st.sid = B.student_id  AND A.num > B.num
    
    1. 查询有课程成绩小于60分的同学的学号、姓名
     SELECT  * FROM score sc WHERE sc.num < 60 
         
                  SELECT st.sid ,st.sname FROM student st WHERE st.sid IN(
                   SELECT  sc.student_id FROM score sc WHERE sc.num < 60 GROUP               BY sc.student_id
                 )
    

    15.查询没有学全所有课的同学的学号、姓名

         SELECT st.sid ,st.sname FROM student st ,
                 (SELECT sc.student_id , COUNT(1) FROM score sc GROUP BY sc.student_id HAVING COUNT(1) < (SELECT COUNT(1) FROM course)) A
                 
                 WHERE st.sid = A.student_id
    

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

     SELECT st.sid ,st.sname FROM student st,
                 (SELECT sc.student_id FROM score sc WHERE sc.student_id != '1' AND sc.course_id IN(
                 
                        SELECT cc.course_id  FROM score cc WHERE cc.student_id = '1' 
                 )  GROUP BY  sc.student_id) B
                 
                 WHERE st.sid = B.student_id
    
    

    17.查询至少学过学号为“001”同学所有课的其他同学学号和姓名

                  SELECT st.sid ,st.sname FROM student st,
                 (SELECT sc.student_id FROM score sc WHERE sc.student_id != '1' AND sc.course_id IN(
                 
                        SELECT cc.course_id  FROM score cc WHERE cc.student_id = '1' 
                 )  GROUP BY  sc.student_id HAVING COUNT(1)=(SELECT COUNT(1)  FROM score  WHERE student_id = '1' ) ) B
                 
                 WHERE st.sid = B.student_id
    

    18.查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名

    SELECT st.sid ,st.sname FROM student st,
                 
                ( SELECT score.student_id FROM score  WHERE score.student_id IN (
                 SELECT scc.student_id FROM score scc WHERE scc.student_id != '02' GROUP BY scc.student_id HAVING COUNT(1)=(SELECT COUNT(1) FROM score sc WHERE sc.student_id = '02')
                 ) 
                 AND score.course_id IN ( SELECT sc.course_id FROM score sc WHERE sc.student_id = '02')
                 GROUP BY score.student_id HAVING COUNT(1) = (SELECT COUNT(1) FROM score WHERE score.student_id = '02')) B
                 WHERE st.sid = B.student_id
    
    

    19.删除学习“李平老师”老师课的score表记录

                 SELECT cid FROM course WHERE course.teacher_id = (SELECT tid FROM teacher WHERE tname = '李平老师')
                 
                 DELETE FROM score WHERE cid IN(
                    SELECT cid FROM course WHERE course.teacher_id = (SELECT tid FROM teacher WHERE tname = '李平老师')
                 )
    
    

    20.向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩

         insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2)
        from student where sid not in (
            select student_id from score where course_id = 2
        )
    

    21.按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,生物,物理,体育,有效课程数,有效平均分

                 SELECT 
                     sc.student_id,
                     (SELECT num  FROM score LEFT JOIN course ON score.course_id = course.cid  WHERE course.cname = '生物' AND score.student_id = sc.student_id) as '生物',
                     (SELECT num  FROM score LEFT JOIN course ON score.course_id = course.cid  WHERE course.cname = '物理' AND score.student_id = sc.student_id) as '物理',
                     (SELECT num  FROM score LEFT JOIN course ON score.course_id = course.cid  WHERE course.cname = '体育' AND score.student_id = sc.student_id) as '体育',
                      COUNT(sc.course_id) AS '有效课程数',
                        AVG(sc.num) AS '有效平均分'
                    
                 FROM score sc  GROUP BY sc.student_id ORDER BY AVG(num) ASC         
    

    22.查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

                 SELECT course_id ,MAX(num),MIN(num) FROM score GROUP BY score.course_id
    

    23.按各科平均成绩从低到高和及格率的百分数从高到低顺序

                 SELECT course_id,AVG(num) ,SUM(CASE WHEN num > 60 THEN 1 ELSE 0 END)/SUM(1)*100 as percent FROM score GROUP BY course_id ORDER BY percent DESC
    

    24.课程平均分从高到低显示(现实任课老师)

                 SELECT score.course_id,AVG(IF(isnull(score.num),0,score.num)) as score_avg,course.cname, teacher.tname  FROM score 
                 LEFT JOIN course ON course.cid = score.course_id
                 LEFT JOIN teacher ON teacher.tid = course.teacher_id
                 
                 GROUP BY score.course_id        
    

    25、***查询各科成绩前三名的记录:(不考虑成绩并列情况)

                 SELECT  score.sid , score.course_id ,score.num ,B.NO1,B.NO2 FROM score
                   
                 LEFT JOIN
                 (SELECT
                 sc.sid,
                 (SELECT num FROM score sc1 WHERE sc1.course_id = sc.course_id ORDER BY num DESC LIMIT 0,1) as NO1,
                 (SELECT num FROM score sc1 WHERE sc1.course_id = sc.course_id ORDER BY num DESC LIMIT 3,1)as NO2
                 FROM score  sc ) B
             
                 ON score.sid = B.sid
                 
                 WHERE score.num <= B.NO1 and score.num >= B.NO2
    

    26.查询每门课程被选修的学生数

                 SELECT score.course_id ,COUNT(score.student_id) FROM score GROUP BY score.course_id
    

    27.查询出只选修了一门课程的全部学生的学号和姓名

                 SELECT student.sid ,student.sname FROM student,
                 (SELECT score.student_id FROM score GROUP BY score.student_id HAVING  COUNT(score.course_id) =1) B
                 
                 WHERE student.sid =    B.student_id
    

    28.查询男生、女生的人数

                 SELECT * FROM 
                 (SELECT COUNT(1)as man FROM student WHERE student.gender ='男') A,
                 (SELECT COUNT(1)as wemen FROM student WHERE student.gender ='女') B
    

    29.查询姓“张”的学生名单

                 SELECT * FROM student WHERE student.sname LIKE '张%'
    

    30.查询同名同姓学生名单,并统计同名人数

                 SELECT student.sname ,COUNT(student.sname) FROM student GROUP BY student.sname
    

    31.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

     SELECT score.course_id ,AVG(if(isnull(num),0 ,num)) as avg_score FROM score  GROUP BY score.course_id ORDER BY  avg_score ASC , score.course_id DESC
                 
    

    32.查询平均成绩大于65的所有学生的学号、姓名和平均成绩

                 SELECT student.sid,student.sname , B.avg_csore FROM student,
                  (SELECT score.student_id, AVG(num) as avg_csore FROM score GROUP BY score.student_id HAVING avg_csore > 65) B
                    
                    WHERE student.sid = B.student_id
    

    33.查询课程名称为“物理”,且分数低于60的学生姓名和分数

                    SELECT student.sname,score.num FROM score 
                    
                        LEFT JOIN course ON score.course_id = course.cid 
                        LEFT JOIN student ON score.student_id = student.sid 
                        
                        WHERE  course.cname = '物理' AND  score.num < 60
    

    34.查询课程编号为3且课程成绩在80分以上的学生的学号和姓名

                        SELECT student.sid,student.sname , score.num FROM student 
                        
                        LEFT JOIN score ON score.student_id = student.sid
                        
                        WHERE score.num > 65
    
    

    35.求选了课程的学生人数

                        第一种
                        SELECT COUNT(DISTINCT student_id)  FROM score
                        
                        第二种
                        SELECT COUNT(1) FROM
                           (SELECT score.student_id FROM score GROUP BY score.student_id) B
    

    36.查询选修“李平”老师所授课程的学生中,成绩最高的学生姓名及其成绩

                     SELECT student.sname ,score.num FROM score 
     
                     LEFT JOIN student  ON student.sid = score.student_id
                     
                     WHERE score.course_id IN(
                        SELECT cid FROM course 
                        
                            LEFT JOIN teacher ON teacher.tid = course.teacher_id
                            
                            WHERE teacher.tname = '李平老师'
                    )
                    
                    ORDER BY score.num DESC LIMIT 1
    

    37.查询各个课程及相应的选修人数

                    SELECT course.cname,COUNT(1) FROM course 
                    
                            LEFT JOIN score  ON score.course_id = course.cid
                            
                            GROUP BY  course.cid
    
    1. **查询不同课程但成绩相同的学生的学号、课程号、学生成绩
                select DISTINCT s1.course_id,s2.course_id,s1.num,s2.num from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id;
    

    39.检索至少选修两门课程的学生学号

                select student_id from score group by student_id having count(student_id) > 1
    

    40.查询全部学生都选修的课程的课程号和课程名

                select course_id,count(1) from score group by course_id having count(1) = (select count(1) from student);
    

    41.查询没学过“李平”老师讲授的任一门课程的学生姓名

                select student_id,student.sname from score
                left join student on score.student_id = student.sid
                where score.course_id not in (
                        select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老师'
                )
                group by student_id
    

    42.查询两门以上不及格课程的同学的学号及其平均成绩

    select student_id,count(1) from score where num < 60 group by student_id having count(1) > 2
    

    43.检索“2”课程分数小于60,按分数降序排列的同学学号

                select student_id from score where num< 60 and course_id = 2 order by num desc;
    

    44.删除“2”同学的“1”课程的成绩

    delete from score where course_id = 1 and student_id = 2
    

    相关文章

      网友评论

          本文标题:sql 语句练习(2)

          本文链接:https://www.haomeiwen.com/subject/lrfooqtx.html