美文网首页
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

相关文章

  • MySQL Operation

    sql语句练习sql练习2 MYSQL导入数据出现The MySQL server is running with...

  • 2018-08-05--08-11

    08-05配置1、sql语句练习。根据月乔的文档&sql优化,根据文档练习2、hive语句1)hive,sql连接...

  • SQL语句练习2

    设计背景 该练习主要针对人力资源管理系统而设计,其中设计到三张表,分别为部门表,员工表。 部门表主要用于存储部门名...

  • sql 语句练习(2)

    自己练习sql 和分析。 表结构和数据 1.查询课程成绩大于60 2.查询每个老师任的几门课程 3.查询老师任课程...

  • 存储过程

    定义: 一组预编译好的SQL语句,可以理解成批量处理语句. 存储过程a : (SQL语句1;SQL语句2;SQL语...

  • SQL SERVER 查看SQL语句IO,时间,索引消耗

    1.查看SQL语句IO消耗 2.查看SQL语句时间消耗 3.查看SQL语句索引消耗

  • MySQL 练习题

    01第一天20180703 【SQL练习】经典SQL练习题 02第二天20180704 sql语句练习50题(My...

  • SQL练习

    SQL练习-4张表 针对下面的4张表格进行SQL语句的练习。 image SQL练习-题目 查询001课程比002...

  • SQL union/常用函数

    union 合并两条或多条语句的结果[sql语句1] union [sql语句2]; 合并另个sql语句所得到的结...

  • SQL语句练习

    一、已知有如下表,请用sql语句在mysql里建立相应的表 表1 学生表(student) 表2 课程表(cou...

网友评论

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

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