模块四 sql练习题


01

二、操作表
1、自行创建测试数据;
2、查询学生总人数;
3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
4、查询每个年级的班级数,取出班级数最多的前三个年级;
5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩;
6、查询每个年级的学生人数;
7、查询每位学生的学号,姓名,选课数,平均成绩;
8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;
9、查询姓“李”的老师的个数和所带班级数;
10、查询班级数小于5的年级id和年级名;
11、查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56为高年级),示例结果如下;
12、查询学过“张三”老师2门课以上的同学的学号、姓名;
13、查询教授课程超过2门的老师的id和姓名;
14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
15、查询没有带过高年级的老师id和姓名;
16、查询学过“张三”老师所教的所有课的同学的学号、姓名;
17、查询带过超过2个班级的老师的id和姓名;
18、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;
19、查询所带班级数最多的老师id和姓名;
20、查询有课程成绩小于60分的同学的学号、姓名;
21、查询没有学全所有课的同学的学号、姓名;
22、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;
23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;
24、查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;
25、删除学习“张三”老师课的score表记录;
26、向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;

02

27、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示:学生ID,语文,数学,英语,课程数和平均分;
28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
30、课程平均分从高到低显示(现实任课老师);
31、查询各科成绩前三名的记录(不考虑成绩并列情况) ;
32、查询每门课程被选修的学生数;
33、查询选修了2门以上课程的全部学生的学号和姓名;
34、查询男生、女生的人数,按倒序排列;
35、查询姓“张”的学生名单;
36、查询同名同姓学生名单,并统计同名人数;
37、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
38、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;
40、求选修了课程的学生人数
41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;
42、查询各个课程及相应的选修人数;
43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
44、查询每门课程成绩最好的前两名学生id和姓名;
45、检索至少选修两门课程的学生学号;
46、查询没有学生选修的课程的课程号和课程名;
47、查询没带过任何班级的老师id和姓名;
48、查询有两门以上课程超过80分的学生id及其平均成绩;
49、检索“3”课程分数小于60,按分数降序排列的同学学号;
50、删除编号为“2”的同学的“1”课程的成绩;
51、查询同时选修了物理课和生物课的学生id和姓名;
-- MySQL dump 10.13  Distrib 5.6.16, for Linux (x86_64)
--
-- Host: localhost    Database: luffysql
-- ------------------------------------------------------
-- Server version   5.6.16

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(255) NOT NULL,
  `grade_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `cls_grade_id` (`grade_id`),
  CONSTRAINT `cls_grade_id` FOREIGN KEY (`grade_id`) REFERENCES `class_grade` (`gid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class`
--

LOCK TABLES `class` WRITE;
/*!40000 ALTER TABLE `class` DISABLE KEYS */;
INSERT INTO `class` VALUES (1,'一年一班',1),(2,'二年一班',2),(3,'三年二班',3),(5,'一年二班',1),(6,'一年三班',1),(7,'二年二班',2),(8,'一年四班',1),(9,'二年三班',2),(10,'四年一班',4),(11,'四年二班',4),(12,'六年一班',6),(13,'五年一班',5),(14,'五年二班',5),(15,'四年三班',4);
/*!40000 ALTER TABLE `class` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `class_grade`
--

DROP TABLE IF EXISTS `class_grade`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
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;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class_grade`
--

LOCK TABLES `class_grade` WRITE;
/*!40000 ALTER TABLE `class_grade` DISABLE KEYS */;
INSERT INTO `class_grade` VALUES (1,'一年级'),(2,'二年级'),(3,'三年级'),(4,'四年级'),(5,'五年级'),(6,'六年级');
/*!40000 ALTER TABLE `class_grade` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `course`
--

DROP TABLE IF EXISTS `course`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(255) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `course_teacher_id` (`teacher_id`),
  CONSTRAINT `cos_teacher_id` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `course`
--

LOCK TABLES `course` WRITE;
/*!40000 ALTER TABLE `course` DISABLE KEYS */;
INSERT INTO `course` VALUES (1,'生物',1),(2,'体育',1),(3,'物理',2),(4,'数学',1),(5,'英语',1),(6,'化学',3),(7,'政治',3),(8,'语文',3);
/*!40000 ALTER TABLE `course` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `score`
--

DROP TABLE IF EXISTS `score`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `score` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `score_student_id` (`student_id`),
  KEY `score_course_id` (`course_id`),
  CONSTRAINT `score_stu_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `score_cour_id` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `score`
--

LOCK TABLES `score` WRITE;
/*!40000 ALTER TABLE `score` DISABLE KEYS */;
INSERT INTO `score` VALUES (1,1,1,60),(2,1,2,59),(3,2,2,99),(4,1,3,66),(5,3,1,59),(6,3,2,70),(7,2,1,61),(8,2,3,60),(9,1,4,60),(10,1,5,30),(11,4,2,76),(12,12,2,76),(13,7,2,76),(14,8,2,76),(15,9,2,76),(16,11,2,76),(17,10,2,76),(18,6,2,76),(19,5,2,76),(26,1,5,60),(27,1,8,80),(28,13,4,50),(29,4,3,59),(30,2,3,52);
/*!40000 ALTER TABLE `score` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `student`
--

DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `sname` varchar(255) NOT NULL,
  `gender` enum('男','女') NOT NULL,
  `class_id` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `sname` (`sname`) USING BTREE,
  KEY `stu_class_id` (`class_id`),
  CONSTRAINT `stu_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `student`
--

LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (1,'乔丹','女',1),(2,'艾弗森','女',1),(3,'科比','男',2),(4,'alex','男',3),(5,'agon','女',15),(6,'aliyun','男',13),(7,'大王','男',10),(8,'dog','女',11),(9,'佩奇','男',11),(10,'菲菲','女',12),(11,'糖果','女',11),(12,'大象','男',8),(13,'张飞','男',8);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `teach2cls`
--

DROP TABLE IF EXISTS `teach2cls`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `teach2cls` (
  `tcid` int(11) NOT NULL AUTO_INCREMENT,
  `tid` int(11) NOT NULL,
  `cid` int(11) NOT NULL,
  PRIMARY KEY (`tcid`),
  KEY `teach_tid` (`tid`),
  KEY `teach_cid` (`cid`),
  CONSTRAINT `teacls_tid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `teacls_cid` FOREIGN KEY (`cid`) REFERENCES `class` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `teach2cls`
--

LOCK TABLES `teach2cls` WRITE;
/*!40000 ALTER TABLE `teach2cls` DISABLE KEYS */;
INSERT INTO `teach2cls` VALUES (1,1,1),(2,1,2),(3,2,1),(4,3,2),(5,2,3),(6,1,6);
/*!40000 ALTER TABLE `teach2cls` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `teacher`
--

DROP TABLE IF EXISTS `teacher`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(255) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `teacher`
--

LOCK TABLES `teacher` WRITE;
/*!40000 ALTER TABLE `teacher` DISABLE KEYS */;
INSERT INTO `teacher` VALUES (1,'张三'),(2,'李四'),(3,'王五'),(4,'王刚'),(5,'李飞');
/*!40000 ALTER TABLE `teacher` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2021-04-10 16:15:44
-- 查询学生总人数;
SELECT COUNT(1) FROM student;

-- 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
SELECT
    s1.student_id,
    s2.sname 
FROM
    score AS s1
    LEFT JOIN course AS c1 ON s1.course_id = c1.cid
    LEFT JOIN student AS s2 ON s1.student_id = s2.sid 
WHERE
    cid IN ( SELECT cid FROM course WHERE cname = '生物' OR cname = '物理' ) 
    AND score >= 60 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) > 1;


-- 查询每个年级的班级数,取出班级数最多的前三个年级;
SELECT
    cg.gname 
FROM
    class AS c1
    LEFT JOIN class_grade AS cg ON c1.grade_id = cg.gid 
GROUP BY
    cg.gid 
ORDER BY
    COUNT( 1 ) DESC 
    LIMIT 3;

-- 查询平均成绩最高和最低的学生的id和姓名以及平均成绩;
( SELECT
    se.student_id,
    st.sname,
    AVG( score ) 
    FROM
        score AS se
        LEFT JOIN student AS st ON se.student_id = st.sid 
    GROUP BY
        student_id 
    ORDER BY
        AVG( score ) DESC 
        LIMIT 1 
    ) UNION ALL
    (
    SELECT
        se.student_id,
        st.sname,
        AVG( score ) 
    FROM
        score AS se
        LEFT JOIN student AS st ON se.student_id = st.sid 
    GROUP BY
        student_id 
    ORDER BY
        AVG( score ) ASC 
        LIMIT 1 
    );

-- 查询每个年级的学生人数;
SELECT
    COUNT( * ),
    s.class_id,
    c.caption,
    cg.gname 
FROM
    student s,
    class c,
    class_grade cg 
WHERE
    c.cid = s.class_id 
    AND cg.gid = c.grade_id 
GROUP BY
    cg.gid
-- # 方式二
SELECT
    COUNT( * ),
    s.class_id,
    c.caption,
    cg.gname 
FROM
    student s
    LEFT JOIN class c ON c.cid = s.class_id
    LEFT JOIN class_grade cg ON cg.gid = c.grade_id 
GROUP BY
    cg.gid


-- 查询每位学生的学号,姓名,选课数,平均成绩;
SELECT
    st.sid,
    st.sname,
    COUNT( cname ),
    AVG( score ) 
FROM
    score AS se
    LEFT JOIN student AS st ON se.student_id = st.sid
    LEFT JOIN course AS ce ON se.course_id = ce.cid 
GROUP BY
    student_id

-- 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;
SELECT
    st.sname,
    ce.cname AS high_course,
    (
    SELECT
        course.cname 
    FROM
        score
        LEFT JOIN course ON score.course_id = course.cid 
    WHERE
        student_id = 2 
    ORDER BY
        score ASC 
        LIMIT 1 
    ) AS min_couse,
    se.score 
FROM
    score se
    LEFT JOIN course ce ON se.course_id = ce.cid
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    se.student_id = 2 
ORDER BY
    se.score DESC 
    LIMIT 1

-- 查询姓“李”的老师的个数和所带班级数;
SELECT
    COUNT( 1 ) AS '带班个数',
    (
    SELECT
        COUNT( 1 ) 
    FROM
        teacher tr 
    WHERE
        tr.tname LIKE '李%' 
    ) AS '李老师个数' 
FROM
    teach2cls ts
    LEFT JOIN teacher tr ON ts.tid = tr.tid 
WHERE
    tr.tname LIKE '李%' 
GROUP BY
    ts.tid

-- 查询班级数小于5的年级id和年级名;
SELECT
    cg.gid,
    cg.gname 
FROM
    class cs
    LEFT JOIN class_grade cg ON cs.grade_id = cg.gid 
WHERE
    cs.cid < 5

-- 查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56为高年级),示例结果如下;
SELECT
    c.cid AS '班级id',
    c.caption AS '班级名称',
    cg.gname AS '年级',
    (
    CASE

            WHEN cg.gid <= 12 THEN
            '低年级' 
            WHEN cg.gid <= 34 AND cg.gid > 12 THEN
            '中年级' 
            WHEN cg.gid <= 56 AND cg.gid > 34 THEN
            '高年级' ELSE '无' 
        END 
        ) AS '年级级别' 
    FROM
        class c
        LEFT JOIN class_grade cg ON c.grade_id = cg.gid

-- 查询学过“张三”老师2门课以上的同学的学号、姓名;
SELECT
    s.sid,
    s.sname 
FROM
    score
    LEFT JOIN student s ON score.student_id = s.sid 
WHERE
    course_id IN (
    SELECT
        cid 
    FROM
        course c
        LEFT JOIN teacher t ON c.teacher_id = t.tid 
    WHERE
        t.tname = '张三' 
    ) 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) > 2

-- 查询教授课程超过2门的老师的id和姓名;
SELECT
    t.tid,
    t.tname 
FROM
    course c
    LEFT JOIN teacher t ON c.teacher_id = t.tid 
GROUP BY
    tname 
HAVING
    COUNT( 1 ) > 2

-- 查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score s
    LEFT JOIN student st ON s.student_id = st.sid 
WHERE
    course_id IN ( 1, 2 ) 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) > 1

-- 查询没有带过高年级的老师id和姓名;
SELECT
    tr.tid,
    tr.tname 
FROM
    teach2cls t
    LEFT JOIN teacher tr ON t.tid = tr.tid 
WHERE
    cid BETWEEN 34 
    AND 56

-- 查询学过“张三”老师所教的所有课的同学的学号、姓名;
SELECT
    s.sid,
    s.sname 
FROM
    score
    LEFT JOIN student s ON score.student_id = s.sid 
WHERE
    course_id IN (
    SELECT
        cid 
    FROM
        course c
        LEFT JOIN teacher t ON c.teacher_id = t.tid 
    WHERE
        t.tname = '张三' 
    ) 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) = 4

-- 查询带过超过2个班级的老师的id和姓名;
SELECT
    tr.tid,
    tr.tname 
FROM
    teach2cls ts
    LEFT JOIN teacher tr ON ts.tid = tr.tid 
GROUP BY
    ts.tid 
HAVING
    COUNT( 1 ) > 2

-- 查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名
SELECT
    A.student_id,
    st.sname 
FROM
    (
    SELECT
        student_id,
        score AS sw 
    FROM
        score 
    WHERE
        course_id = 1 
    ) AS A
    LEFT JOIN (
    SELECT
        student_id,
        score AS ty 
    FROM
        score 
    WHERE
        course_id = 2 
    ) AS B ON A.student_id = B.student_id
    LEFT JOIN student st ON A.student_id = st.sid 
WHERE
    sw >
IF
    ( ISNULL( ty ), 0, ty )

-- 查询所带班级数最多的老师id和姓名;
SELECT
    tr.tid,
    tr.tname 
FROM
    teach2cls ts
    LEFT JOIN teacher tr ON ts.tid = tr.tid 
GROUP BY
    ts.tid 
ORDER BY
    COUNT( 1 ) DESC 
    LIMIT 1

-- 查询有课程成绩小于60分的同学的学号、姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score s
    LEFT JOIN student st ON s.student_id = st.sid 
WHERE
    score < 60 
GROUP BY
    st.sid

-- 查询没有学全所有课的同学的学号、姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
GROUP BY
    se.student_id 
HAVING
    COUNT( 1 ) < ( SELECT COUNT( cid ) FROM course )

-- 查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    se.student_id != 1 
    AND course_id IN ( SELECT course_id FROM score WHERE student_id = 1 ) 
GROUP BY
    student_id

-- 查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    se.student_id != 1 
    AND course_id IN ( SELECT course_id FROM score WHERE student_id = 1 ) 
GROUP BY
    student_id

-- 查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    student_id IN (
    SELECT
        student_id 
    FROM
        score 
    WHERE
        student_id != 2 
    GROUP BY
        student_id 
    HAVING
        COUNT( 1 ) = (
        SELECT
            COUNT( 1 ) 
        FROM
            score 
        WHERE
            student_id = 2 
        ) 
    ) 
    AND course_id IN ( SELECT course_id FROM score WHERE student_id = 2 ) 
GROUP BY
    student_id 
HAVING
    COUNT( course_id ) = (
    SELECT
        COUNT( 1 ) 
    FROM
        score 
    WHERE
        student_id = 2 
    )

-- 删除学习“张三”老师课的score表记录
DELETE 
FROM
    score 
WHERE
    course_id IN (
    SELECT
        cid 
    FROM
        course ce
        LEFT JOIN teacher tr ON ce.teacher_id = tr.tid 
    WHERE
        tr.tname = '张三' 
    )

-- 向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;
INSERT INTO score ( student_id, course_id, score ) SELECT
sid,
2,
(
    SELECT
        AVG( score ) 
    FROM
        score 
    WHERE
        course_id = 2 
    ) 
FROM
    student 
WHERE
    sid NOT IN ( SELECT student_id FROM score WHERE course_id = 2 )

-- 按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示:学生ID,语文,数学,英语,课程数和平均分;
SELECT
    sc.student_id,
    (
    SELECT
        score 
    FROM
        score se
        LEFT JOIN course ce ON se.course_id = ce.cid 
    WHERE
        ce.cname = '语文' 
        AND se.student_id = sc.student_id 
    ) AS yw,
    (
    SELECT
        score 
    FROM
        score se
        LEFT JOIN course ce ON se.course_id = ce.cid 
    WHERE
        ce.cname = '数学' 
        AND se.student_id = sc.student_id 
    ) AS sx,
    (
    SELECT
        score 
    FROM
        score se
        LEFT JOIN course ce ON se.course_id = ce.cid 
    WHERE
        ce.cname = '英语' 
        AND se.student_id = sc.student_id 
    ) AS yy,
    COUNT( sc.course_id ),
    AVG( sc.score ) 
FROM
    score AS sc 
GROUP BY
    student_id DESC


-- 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
SELECT
    course_id,
    max( score ) AS max_num,
    min( score ) AS min_num 
FROM
    score 
GROUP BY
    course_id;

-- 按各科平均成绩从低到高和及格率的百分数从高到低顺序;
SELECT
    course_id,
    avg( score ) AS avgnum,
    sum(
    CASE

            WHEN score.score > 60 THEN
            1 ELSE 0 
        END 
        ) / count( 1 ) * 100 AS percent 
    FROM
        score 
    GROUP BY
        course_id 
    ORDER BY
        avgnum ASC,
        percent DESC;

-- 课程平均分从高到低显示(现实任课老师);
SELECT
    tr.tname,
    AVG( score ) 
FROM
    score se
    LEFT JOIN course ce ON se.course_id = ce.cid
    LEFT JOIN teacher tr ON tr.tid = ce.teacher_id 
GROUP BY
    course_id 
ORDER BY
    AVG( score ) DESC

-- 查询各科成绩前三名的记录(不考虑成绩并列情况) ;
SELECT
    score.sid,
    score.course_id,
    score.score,
    T.first_num,
    T.second_num 
FROM
    score
    LEFT JOIN (
    SELECT
        sid,
        (
        SELECT
            score 
        FROM
            score AS s2 
        WHERE
            s2.course_id = s1.course_id 
        ORDER BY
            score DESC 
            LIMIT 0,
            1 
        ) AS first_num,
        (
        SELECT
            score 
        FROM
            score AS s2 
        WHERE
            s2.course_id = s1.course_id 
        ORDER BY
            score DESC 
            LIMIT 3,
            1 
        ) AS second_num 
    FROM
        score AS s1 
    ) AS T ON score.sid = T.sid 
WHERE
    score.score <= T.first_num AND score.score >= T.second_num


-- 查询每门课程被选修的学生数;
SELECT
    course_id,
    COUNT( 1 ) 
FROM
    score 
GROUP BY
    course_id


-- 查询选修了2门以上课程的全部学生的学号和姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) > 2

-- 查询男生、女生的人数,按倒序排列;
SELECT
    * 
FROM
    (
    SELECT
        COUNT( 1 ) 
    FROM
        student 
    WHERE
        gender = '男' 
    ) AS A,
    (
    SELECT
        COUNT( 1 ) 
    FROM
        student 
    WHERE
        gender = '女' 
    ) AS B

-- 查询姓“张”的学生名单;
SELECT
    * 
FROM
    student 
WHERE
    sname LIKE '张%'


-- 查询同名同姓学生名单,并统计同名人数;
SELECT
    sname,
    COUNT( 1 ) AS '同名人数' 
FROM
    student 
GROUP BY
    sname

-- 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
SELECT
    course_id,
    AVG(
    IF
        ( ISNULL( score ), 0, score ) 
    ) AS avg 
FROM
    score 
GROUP BY
    course_id 
ORDER BY
    avg ASC,
    course_id DESC

-- 查询课程名称为“数学”,且分数低于60的学生姓名和分数;
SELECT
    st.sname,
    se.score 
FROM
    score se
    LEFT JOIN course ce ON se.course_id = ce.cid
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    ce.cname = '数学' 
    AND se.score < 60

-- 查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;
SELECT
    st.sid,
    st.sname 
FROM
    score se
    LEFT JOIN course ce ON se.course_id = ce.cid
    LEFT JOIN student st ON se.student_id = st.sid 
WHERE
    se.course_id = 3 
    AND se.score < 80

-- 求选修了课程的学生人数
SELECT
    COUNT( 1 ) 
FROM
    ( SELECT student_id FROM score GROUP BY student_id ) AS A

-- 查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;
SELECT
    st.sname,
    se.score 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid
    LEFT JOIN course AS ce ON se.course_id = ce.cid
    LEFT JOIN teacher tr ON ce.teacher_id = tr.tid 
WHERE
    tr.tname = '王五' 
ORDER BY
    se.score DESC 
    LIMIT 1 

-- 方法2:
SELECT
    sname,
    score 
FROM
    score
    LEFT JOIN student ON score.student_id = student.sid 
WHERE
    score.course_id IN (
    SELECT
        course.cid 
    FROM
        course
        LEFT JOIN teacher ON course.teacher_id = teacher.tid 
    WHERE
        tname = '王五' 
    ) 
ORDER BY
    score DESC 
    LIMIT 1;

-- 查询各个课程及相应的选修人数;
SELECT
    course_id,
    COUNT( 1 ) 
FROM
    score 
GROUP BY
    course_id

-- 查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
SELECT DISTINCT
    s1.student_id,
    s2.student_id,
    s1.course_id,
    s2.course_id,
    s1.score,
    s2.score 
FROM
    score AS s1,
    score AS s2 
WHERE
    s1.score = s2.score 
    AND s1.course_id != s2.course_id

-- 查询每门课程成绩最好的前两名学生id和姓名;
SELECT
    score.student_id,
    student.sname 
FROM
    score
    LEFT JOIN student ON score.student_id = student.sid
    LEFT JOIN (
    SELECT
        sid,
        (
        SELECT
            score 
        FROM
            score AS s2 
        WHERE
            s2.course_id = s1.course_id 
        ORDER BY
            score DESC 
            LIMIT 0,
            1 
        ) AS first_score,
        (
        SELECT
            score 
        FROM
            score AS s2 
        WHERE
            s2.course_id = s1.course_id 
        ORDER BY
            score DESC 
            LIMIT 1,
            1 
        ) AS second_score 
    FROM
        score AS s1 
    ) AS T ON score.sid = T.sid 
WHERE
    score.score <= first_score AND score.score >= T.second_score


-- 检索至少选修两门课程的学生学号;
SELECT
    student_id 
FROM
    score 
GROUP BY
    student_id 
HAVING
    COUNT( 1 ) > 2

-- 查询没有学生选修的课程的课程号和课程名;
SELECT
    cid,
    cname 
FROM
    course 
WHERE
    cid NOT IN ( SELECT course_id FROM score GROUP BY course_id )


-- 查询没带过任何班级的老师id和姓名;
SELECT
    tid,
    tname 
FROM
    teacher 
WHERE
    tid NOT IN ( SELECT tid FROM teach2cls GROUP BY tid )

-- 查询有两门以上课程超过80分的学生id及其平均成绩;
SELECT
    se.student_id,
    AVG( se.score ) 
FROM
    score se 
WHERE
    score > 80 
GROUP BY
    course_id 
HAVING
    COUNT( 1 ) > 2

-- 检索“3”课程分数小于60,按分数降序排列的同学学号;
SELECT
    student_id 
FROM
    score 
WHERE
    course_id = 3 
    AND score < 60 
ORDER BY
    score DESC

-- 删除编号为“2”的同学的“1”课程的成绩;
DELETE 
FROM
    score 
WHERE
    student_id = 2 
    AND course_id = 1

-- 查询同时选修了物理课和生物课的学生id和姓名;
SELECT
    student_id,
    sname,
    course_id 
FROM
    score se
    LEFT JOIN student st ON se.student_id = st.sid 
GROUP BY
    se.student_id 
HAVING
    COUNT( 1 ) > 1 
    AND se.course_id IN (
    SELECT
        cid 
    FROM
        course 
    WHERE
        cname = '物理' 
        OR cname = '生物' 
    )