SQL练习题共50道附答案(MySQL)

SQL练习题(共82题) id 表示用户 id;非禁止用户即 Banned 为 No 的用户,禁止用户即 Banned 为 Yes 的用户。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JX7NHMq3-1691249682537)(imgs/image-20211128192755637.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p7aupgxU-1691249682537)(imgs/image-20211128192845380.png)] 阅读详情

SQL练习题共50道附答案(MySQL)

  • 数据库表名称和字段

1.学生表 
student(s_id,s_name,s_birth,s_sex) 
-- 学生编号,学生姓名, 出生年月,学生性别 

2.课程表 
course(c_id,c_name,t_id) 
-- 课程编号, 课程名称, 教师编号 

3.教师表 
teacher(t_id,t_name) 
-– 教师编号,教师姓名 

4.成绩表 
score(s_id,c_id,s_score) 
--学生编号,课程编号,分数
  • 建立一个数据库,导入数据到数据库:

 
 --  建立课程表
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
   `c_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '课程编号',
   `c_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '课程名称',
   `t_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '教师编号',
   PRIMARY KEY (`c_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
 
-- 课程表数据
INSERT INTO `course` VALUES ('01', '语文', '02');
INSERT INTO `course` VALUES ('02', '数学', '01');
INSERT INTO `course` VALUES ('03', '英语', '03');


-- 分数表
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学生编号',
  `c_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '课程编号',
  `s_score` int(3) NULL DEFAULT NULL COMMENT '分数',
  PRIMARY KEY (`s_id`, `c_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


-- 分数数据
INSERT INTO `score` VALUES ('01', '01', 80);
INSERT INTO `score` VALUES ('01', '02', 90);
INSERT INTO `score` VALUES ('01', '03', 99);
INSERT INTO `score` VALUES ('02', '01', 70);
INSERT INTO `score` VALUES ('02', '02', 60);
INSERT INTO `score` VALUES ('02', '03', 80);
INSERT INTO `score` VALUES ('03', '01', 80);
INSERT INTO `score` VALUES ('03', '02', 80);
INSERT INTO `score` VALUES ('03', '03', 80);
INSERT INTO `score` VALUES ('04', '01', 50);
INSERT INTO `score` VALUES ('04', '02', 30);
INSERT INTO `score` VALUES ('04', '03', 20);
INSERT INTO `score` VALUES ('05', '01', 76);
INSERT INTO `score` VALUES ('05', '02', 87);
INSERT INTO `score` VALUES ('05', '03', 95);
INSERT INTO `score` VALUES ('06', '01', 31);
INSERT INTO `score` VALUES ('06', '02', 88);
INSERT INTO `score` VALUES ('06', '03', 34);
INSERT INTO `score` VALUES ('07', '01', 66);
INSERT INTO `score` VALUES ('07', '02', 89);
INSERT INTO `score` VALUES ('07', '03', 98);
INSERT INTO `score` VALUES ('08', '01', 59);
INSERT INTO `score` VALUES ('08', '02', 88);
INSERT INTO `score` VALUES ('09', '02', 67);
INSERT INTO `score` VALUES ('09', '03', 88);
INSERT INTO `score` VALUES ('10', '01', 65);
INSERT INTO `score` VALUES ('10', '02', 78);


-- 建立学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学生编号',
  `s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学生姓名',
  `s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '出生年月',
  `s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学生性别',
  PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


-- 学生数据
INSERT INTO `student` VALUES ('01', '斯内克', '1990-01-01', '男');
INSERT INTO `student` VALUES ('02', '张益达', '1990-12-21', '男');
INSERT INTO `student` VALUES ('03', '张大炮', '1990-05-20', '男');
INSERT INTO `student` VALUES ('04', '李云龙', '1990-08-06', '男');
INSERT INTO `student` VALUES ('05', '楚云飞', '1991-12-01', '女');
INSERT INTO `student` VALUES ('06', '赵日天', '1992-03-01', '女');
INSERT INTO `student` VALUES ('07', '小甜甜', '1989-07-01', '女');
INSERT INTO `student` VALUES ('08', '王菊花', '1990-01-20', '女');
INSERT INTO `student` VALUES ('09', '李慕白', '1994-01-20', '男');
INSERT INTO `student` VALUES ('10', '东京热', '1980-01-20', '女');


-- 建立老师表
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `t_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '教师编号',
  `t_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '教师姓名',
  PRIMARY KEY (`t_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


-- 老师表数据
INSERT INTO `teacher` VALUES ('01', '墨白');
INSERT INTO `teacher` VALUES ('02', '默狐');
INSERT INTO `teacher` VALUES ('03', '柠檬');
SET FOREIGN_KEY_CHECKS = 1;

SQL题目

  1. 查询"语文"课程比"数学"课程成绩高的学生的信息及课程分数
 SELECT
     st.*,
     sc.s_score AS '语文',
     sc2.s_score '数学' 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
     AND sc.c_id = '01'
     LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    AND sc2.c_id = '02' 
WHERE
    sc.s_score > sc2.s_score
  1. 查询"语文"课程比"数学"课程成绩低的学生的信息及课程分数
 SELECT
     st.*,
     sc.s_score '语文',
     sc2.s_score '数学' 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
     AND sc.c_id = '01'
     LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    AND sc2.c_id = '02' 
WHERE
    sc.s_score < sc2.s_score
  1. 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
 SELECT
     st.s_id,
     st.s_name,
     ROUND( AVG( sc.s_score ), 2 ) "平均成绩" 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
 GROUP BY
     st.s_id 
HAVING
    AVG( sc.s_score )>= 60
  1. 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)
 SELECT
     st.s_id,
     st.s_name,(
     CASE
             WHEN ROUND( AVG( sc.s_score ), 2 ) IS NULL THEN
             0 ELSE ROUND( AVG( sc.s_score ), 2 ) 
         END 
         ) "平均成绩" 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
        st.s_id 
    HAVING
    AVG( sc.s_score )< 60 
    OR AVG( sc.s_score ) IS NULL
  1. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
 SELECT
     st.s_id,
     st.s_name,
     count( sc.c_id ) "选课总数",
     sum( CASE WHEN sc.s_score IS NULL THEN 0 ELSE sc.s_score END ) "总成绩" 
 FROM
     student st
     LEFT JOIN score sc ON st.s_id = sc.s_id 
 GROUP BY
    st.s_id
  1. 查询"墨"姓老师的数量
SELECT
    t.t_name,
    count( t.t_id ) 
FROM
    teacher t 
GROUP BY
    t.t_id 
HAVING
    t.t_name LIKE "墨%";
  1. 查询学过"墨白"老师授课的同学的信息
SELECT
    st.* 
FROM
    student st
    LEFT JOIN score sc ON sc.s_id = st.s_id
    LEFT JOIN course c ON c.c_id = sc.c_id
    LEFT JOIN teacher t ON t.t_id = c.t_id 
WHERE
    t.t_name = "墨白"
  1. 查询没学过"柠檬"老师授课的同学的信息
 -- 柠檬老师教的课
 SELECT
     c.* 
 FROM
     course c
     LEFT JOIN teacher t ON t.t_id = c.t_id 
 WHERE
     t.t_name = "柠檬" 
 -- 有柠檬老师课成绩的st.s_id
SELECT
    sc.s_id 
FROM
    score sc 
WHERE
    sc.c_id IN ( SELECT c.c_id FROM course c LEFT JOIN teacher t ON t.t_id = c.t_id WHERE t.t_name = "柠檬" ) 
-- 不在上面查到的st.s_id的学生信息,即没学过柠檬老师授课的同学信息
SELECT
    st.* 
FROM
    student st 
WHERE
    st.s_id NOT IN (
    SELECT
        sc.s_id 
    FROM
        score sc 
    WHERE
    sc.c_id IN ( SELECT c.c_id FROM course c LEFT JOIN teacher t ON t.t_id = c.t_id WHERE t.t_name = "柠檬" ) 
    )
  1. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT
     st.* 
 FROM
     student st
    INNER JOIN score sc ON sc.s_id = st.s_id
    INNER JOIN course c ON c.c_id = sc.c_id 
    AND c.c_id = "01" 
WHERE
    st.s_id IN (
    SELECT
       st2.s_id 
    FROM
        student st2
        INNER JOIN score sc2 ON sc2.s_id = st2.s_id
        INNER JOIN course c2 ON c2.c_id = sc2.c_id 
    AND c2.c_id = "02" 
    )
-- 或者第二种
SELECT
    a.* 
FROM
    student a,
    score b,
    score c 
WHERE
    a.s_id = b.s_id 
    AND a.s_id = c.s_id 
    AND b.c_id = '01' 
    AND c.c_id = '02';
  1. 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
SELECT
     st.* 
 FROM
     student st
     INNER JOIN score sc ON sc.s_id = st.s_id
     INNER JOIN course c ON c.c_id = sc.c_id 
     AND c.c_id = "01" 
 WHERE
     st.s_id NOT IN (
    SELECT
        st2.s_id 
    FROM
        student st2
        INNER JOIN score sc2 ON sc2.s_id = st2.s_id
        INNER JOIN course c2 ON c2.c_id = sc2.c_id 
    AND c2.c_id = "02" 
    )
  1. 查询没有学全所有课程的同学的信息
SELECT
    * 
 FROM
     student 
WHERE
     s_id NOT IN (
     SELECT
         st.s_id 
     FROM
        student st
        INNER JOIN score sc ON sc.s_id = st.s_id 
        AND sc.c_id = "01" 
    WHERE
    st.s_id IN ( SELECT st1.s_id FROM student st1 INNER JOIN score sc2 ON sc2.s_id = st1.s_id AND sc2.c_id = "02" ) 
    AND st.s_id IN ( SELECT st2.s_id FROM student st2 INNER JOIN score sc2 ON sc2.s_id = st2.s_id AND sc2.c_id = "03" ))
  1. 查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECT DISTINCT
    st.* 
FROM
    student st
    LEFT JOIN score sc ON sc.s_id = st.s_id 
WHERE
    sc.c_id IN (
    SELECT
        sc2.c_id 
    FROM
        student st2
        LEFT JOIN score sc2 ON sc2.s_id = st2.s_id 
    WHERE
    st2.s_id = '01' 
    )
  1. 查询和"01"号的同学学习的课程完全相同的其他同学的信息
SELECT
     st.* 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
 GROUP BY
     st.s_id 
 HAVING
     group_concat( sc.c_id ) = (
    SELECT
        group_concat( sc2.c_id ) 
    FROM
        student st2
        LEFT JOIN score sc2 ON sc2.s_id = st2.s_id 
    WHERE
    st2.s_id = '01' 
    )
  1. 查询没学过"默狐"老师讲授的任一门课程的学生姓名
 SELECT
     st.s_name 
 FROM
     student st 
 WHERE
     st.s_id NOT IN (
     SELECT
         sc.s_id 
     FROM
        score sc
        INNER JOIN course c ON c.c_id = sc.c_id
        INNER JOIN teacher t ON t.t_id = c.t_id 
    AND t.t_name = "默狐" 
    )
  1. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
 SELECT
     st.s_id,
     st.s_name,
     avg( sc.s_score ) 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
 WHERE
     sc.s_id IN (
    SELECT
        sc.s_id 
    FROM
        score sc 
    WHERE
        sc.s_score < 60 
        OR sc.s_score IS NULL 
    GROUP BY
        sc.s_id 
    HAVING
        COUNT( 1 )>= 2 
    ) 
GROUP BY
    st.s_id
  1. 检索"01"课程分数小于60,按分数降序排列的学生信息
 SELECT
     st.*,
     sc.s_score 
 FROM
     student st
     INNER JOIN score sc ON sc.s_id = st.s_id 
     AND sc.c_id = "01" 
     AND sc.s_score < 60 
 ORDER BY
    sc.s_score DESC

-- 第二种SQL
SELECT
    st.*,
    sc.s_score 
FROM
    student st
    LEFT JOIN score sc ON sc.s_id = st.s_id 
WHERE
    sc.c_id = "01" 
    AND sc.s_score < 60 
ORDER BY
  sc.s_score DESC
  1. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
 SELECT
     st.s_id,
     st.s_name,
     avg( sc4.s_score ) "平均分",
     sc.s_score "语文",
     sc2.s_score "数学",
     sc3.s_score "英语" 
 FROM
     student st
    LEFT JOIN score sc ON sc.s_id = st.s_id 
    AND sc.c_id = "01"
    LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    AND sc2.c_id = "02"
    LEFT JOIN score sc3 ON sc3.s_id = st.s_id 
    AND sc3.c_id = "03"
    LEFT JOIN score sc4 ON sc4.s_id = st.s_id 
GROUP BY
    st.s_id 
ORDER BY
    avg( sc4.s_score ) DESC

-- 第二种
SELECT
    st.s_id,
    st.s_name,
    ( CASE WHEN avg( sc4.s_score ) IS NULL THEN 0 ELSE avg( sc4.s_score ) END ) "平均分",
    ( CASE WHEN sc.s_score IS NULL THEN 0 ELSE sc.s_score END ) "语文",
    ( CASE WHEN sc2.s_score IS NULL THEN 0 ELSE sc2.s_score END ) "数学",
    ( CASE WHEN sc3.s_score IS NULL THEN 0 ELSE sc3.s_score END ) "英语" 
FROM
    student st
    LEFT JOIN score sc ON sc.s_id = st.s_id 
    AND sc.c_id = "01"
    LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    AND sc2.c_id = "02"
    LEFT JOIN score sc3 ON sc3.s_id = st.s_id 
    AND sc3.c_id = "03"
    LEFT JOIN score sc4 ON sc4.s_id = st.s_id 
GROUP BY
    st.s_id 
ORDER BY
    avg( sc4.s_score ) DESC
  1. 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
    (及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)
SELECT
     c.c_id,
     c.c_name,
     max( sc.s_score ) "最高分",
     MIN( sc2.s_score ) "最低分",
    avg( sc3.s_score ) "平均分",((
         SELECT
             count( s_id ) 
         FROM
            score 
        WHERE
            s_score >= 60 
            AND c_id = c.c_id 
            )/(
        SELECT
           count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
            )) "及格率",((
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            s_score >= 70 
            AND s_score < 80 
           AND c_id = c.c_id 
            )/(
        SELECT
           count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
           )) "中等率",((
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            s_score >= 80 
            AND s_score < 90 
            AND c_id = c.c_id 
            )/(
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
            )) "优良率",((
        SELECT
            count( s_id ) 
        FROM
           score 
        WHERE
            s_score >= 90 
            AND c_id = c.c_id 
            )/(
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
        )) "优秀率" 
FROM
    course c
    LEFT JOIN score sc ON sc.c_id = c.c_id
    LEFT JOIN score sc2 ON sc2.c_id = c.c_id
    LEFT JOIN score sc3 ON sc3.c_id = c.c_id 
GROUP BY
    c.c_id
  1. 按各科成绩进行排序,并显示排名(实现不完全)
 SELECT
     c.c_id,
     c.c_name,
    max( sc.s_score ) "最高分",
     MIN( sc2.s_score ) "最低分",
     avg( sc3.s_score ) "平均分",((
         SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            s_score >= 60 
            AND c_id = c.c_id 
            )/(
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
            )) "及格率",((
       SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
           s_score >= 70 
            AND s_score < 80 
            AND c_id = c.c_id 
            )/(
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
            )) "中等率",((
        SELECT
            count( s_id ) 
        FROM
            score 
       WHERE
            s_score >= 80 
            AND s_score < 90 
            AND c_id = c.c_id 
            )/(
       SELECT
           count( s_id ) 
        FROM
            score 
        WHERE
           c_id = c.c_id 
            )) "优良率",((
        SELECT
            count( s_id ) 
        FROM
           score 
        WHERE
            s_score >= 90 
            AND c_id = c.c_id 
            )/(
        SELECT
            count( s_id ) 
        FROM
            score 
        WHERE
            c_id = c.c_id 
        )) "优秀率" 
FROM
    course c
    LEFT JOIN score sc ON sc.c_id = c.c_id
    LEFT JOIN score sc2 ON sc2.c_id = c.c_id
    LEFT JOIN score sc3 ON sc3.c_id = c.c_id 
GROUP BY
    c.c_id
  1. 查询学生的总成绩并进行排名
 SELECT
     st.s_id,
     st.s_name,(
    CASE
 
             WHEN sum( sc.s_score ) IS NULL THEN
             0 ELSE sum( sc.s_score ) 
         END 
         ) 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
        st.s_id 
ORDER BY
    sum( sc.s_score ) DESC
  1. 查询不同老师所教不同课程平均分从高到低显示
 SELECT
     t.t_id,
     t.t_name,
     c.c_name,
     avg( sc.s_score ) 
 FROM
     teacher t
     LEFT JOIN course c ON c.t_id = t.t_id
     LEFT JOIN score sc ON sc.c_id = c.c_id 
GROUP BY
    t.t_id 
ORDER BY
    avg( sc.s_score ) DESC
  1. 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
 SELECT
     a.* 
 FROM
     (
     SELECT
         st.*,
         c.c_id,
         c.c_name,
         sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = "01" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 1,
        2 
    ) a UNION ALL
SELECT
    b.* 
FROM
    (
    SELECT
        st.*,
        c.c_id,
        c.c_name,
        sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = "02" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 1,
        2 
    ) b UNION ALL
SELECT
    c.* 
FROM
    (
    SELECT
        st.*,
        c.c_id,
        c.c_name,
        sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = "03" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 1,
    2 
    ) c
  1. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
 SELECT
     c.c_id,
     c.c_name,((
         SELECT
             count( 1 ) 
         FROM
             score sc 
         WHERE
             sc.c_id = c.c_id 
            AND sc.s_score <= 100 AND sc.s_score > 80 
            )/(
        SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
            )) "100-85",((
        SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
            AND sc.s_score <= 85 AND sc.s_score > 70 
            )/(
        SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
            )) "85-70",((
       SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
            AND sc.s_score <= 70 AND sc.s_score > 60 
            )/(
        SELECT
            count( 1 ) 
        FROM
            score sc 
       WHERE
            sc.c_id = c.c_id 
            )) "70-60",((
        SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
            AND sc.s_score <= 60 AND sc.s_score >= 0 
            )/(
        SELECT
            count( 1 ) 
        FROM
            score sc 
        WHERE
            sc.c_id = c.c_id 
        )) "60-0" 
FROM
    course c 
ORDER BY
    c.c_id
  1. 查询学生平均成绩及其名次
 SET @i = 0;
 SELECT
     a.*,
     @i := @i + 1 
 FROM
     (
     SELECT
         st.s_id,
         st.s_name,
        round(( CASE WHEN avg( sc.s_score ) IS NULL THEN 0 ELSE avg( sc.s_score ) END ), 2 ) "平均分" 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
        st.s_id 
    ORDER BY
    sc.s_score DESC 
   ) a
  1. 查询各科成绩前三名的记录
 SELECT
     a.* 
 FROM
     (
     SELECT
         st.s_id,
         st.s_name,
         c.c_id,
         c.c_name,
        sc.s_score 
    FROM
        student st
       LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = '01' 
      ORDER BY
        sc.s_score DESC 
       LIMIT 0,
        3 
    ) a UNION ALL
SELECT
    b.* 
FROM
    (
    SELECT
        st.s_id,
        st.s_name,
        c.c_id,
        c.c_name,
       sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = '02' 
    ORDER BY
        sc.s_score DESC 
        LIMIT 0,
        3 
    ) b UNION ALL
SELECT
    c.* 
FROM
    (
    SELECT
        st.s_id,
        st.s_name,
        c.c_id,
        c.c_name,
        sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = '03' 
    ORDER BY
        sc.s_score DESC 
        LIMIT 0,
    3 
    ) c
  1. 查询每门课程被选修的学生数
 SELECT
    c.c_id,
     c.c_name,
     count( 1 ) 
 FROM
     course c
     LEFT JOIN score sc ON sc.c_id = c.c_id
     INNER JOIN student st ON st.s_id = c.c_id 
 GROUP BY
    st.s_id
  1. 查询出只有两门课程的全部学生的学号和姓名
 SELECT
     st.s_id,
     st.s_name 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id
     INNER JOIN course c ON c.c_id = sc.c_id 
 GROUP BY
     st.s_id 
HAVING
    count( 1 )=2
  1. 查询男生、女生人数
SELECT
    st.s_sex,
    count( 1 ) 
FROM
    student st 
GROUP BY
    st.s_sex
  1. 查询名字中含有"白"字的学生信息
SELECT
    st.* 
FROM
    student st 
WHERE
    st.s_name LIKE "%白%";
  1. 查询同名同性学生名单,并统计同名人数
 SELECT
     st.*,
     count( 1 ) 
 FROM
     student st 
 GROUP BY
     st.s_name,
     st.s_sex 
 HAVING
    count( 1 )> 1
  1. 查询1990年出生的学生名单
SELECT
    st.* 
FROM
    student st 
WHERE
    st.s_birth LIKE "1990%";
  1. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
 SELECT
     c.c_id,
     c.c_name,
     avg( sc.s_score ) 
 FROM
     course c
     INNER JOIN score sc ON sc.c_id = c.c_id 
 GROUP BY
     c.c_id 
ORDER BY
    avg( sc.s_score ) DESC,
    c.c_id ASC
  1. 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
 SELECT
     st.s_id,
     st.s_name,
     avg( sc.s_score ) 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
 GROUP BY
     st.s_id 
HAVING
    avg( sc.s_score )>= 85
  1. 查询课程名称为"数学",且分数低于60的学生姓名和分数
 SELECT
     st.s_id,
     st.s_name,
    sc.s_score 
 FROM
     student st
     INNER JOIN score sc ON sc.s_id = st.s_id 
     AND sc.s_score < 60
     INNER JOIN course c ON c.c_id = sc.c_id 
    AND c.c_name = "数学"
  1. 查询所有学生的课程及分数情况
SELECT
     st.s_id,
     st.s_name,
     c.c_name,
     sc.s_score 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id
     LEFT JOIN course c ON c.c_id = sc.c_id 
ORDER BY
    st.s_id,
    c.c_name
  1. 查询任何一门课程成绩在70分以上的姓名、课程名称和分数
SELECT
     st2.s_id,
     st2.s_name,
     c2.c_name,
     sc2.s_score 
 FROM
     student st2
     LEFT JOIN score sc2 ON sc2.s_id = st2.s_id
     LEFT JOIN course c2 ON c2.c_id = sc2.c_id 
WHERE
    st2.s_id IN (
    SELECT
        st.s_id 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
        st.s_id 
    HAVING
        min( sc.s_score )>= 70 
    ) 
ORDER BY
    s_id
  1. 查询不及格的课程
 SELECT
     st.s_id,
     c.c_name,
     st.s_name,
     sc.s_score 
 FROM
     student st
     INNER JOIN score sc ON sc.s_id = st.s_id 
     AND sc.s_score < 60
    INNER JOIN course c ON c.c_id = sc.c_id
  1. 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名
SELECT
    st.s_id,
    st.s_name,
    sc.s_score 
FROM
    student st
    INNER JOIN score sc ON sc.s_id = st.s_id 
    AND sc.c_id = "01" 
    AND sc.s_score >= 80
  1. 求每门课程的学生人数
SELECT
    c.c_id,
    c.c_name,
    count( 1 ) 
FROM
    course c
    INNER JOIN score sc ON sc.c_id = c.c_id 
GROUP BY
    c.c_id
  1. 查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT
     st.*,
     c.c_name,
     sc.s_score,
     t.t_name 
 FROM
     student st
     INNER JOIN score sc ON sc.s_id = st.s_id
    INNER JOIN course c ON c.c_id = sc.c_id
    INNER JOIN teacher t ON t.t_id = c.t_id 
    AND t.t_name = "墨白" 
ORDER BY
    sc.s_score DESC 
    LIMIT 0,1
  1. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
 SELECT
     st.s_id,
     st.s_name,
     sc.c_id,
     sc.s_score 
 FROM
     student st
    LEFT JOIN score sc ON sc.s_id = st.s_id
    LEFT JOIN course c ON c.c_id = sc.c_id 
WHERE
   (
    SELECT
        count( 1 ) 
    FROM
        student st2
       LEFT JOIN score sc2 ON sc2.s_id = st2.s_id
        LEFT JOIN course c2 ON c2.c_id = sc2.c_id 
    WHERE
        sc.s_score = sc2.s_score 
    AND c.c_id != c2.c_id 
    )>1
  1. 查询每门功成绩最好的前两名
 SELECT
    a.* 
 FROM
     (
     SELECT
         st.s_id,
         st.s_name,
         c.c_name,
         sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = "01" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 0,
        2 
    ) a UNION ALL
SELECT
    b.* 
FROM
    (
    SELECT
        st.s_id,
        st.s_name,
        c.c_name,
        sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
        AND c.c_id = "02" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 0,
        2 
    ) b UNION ALL
SELECT
    c.* 
FROM
    (
    SELECT
        st.s_id,
        st.s_name,
        c.c_name,
        sc.s_score 
    FROM
        student st
        LEFT JOIN score sc ON sc.s_id = st.s_id
        INNER JOIN course c ON c.c_id = sc.c_id 
       AND c.c_id = "03" 
    ORDER BY
        sc.s_score DESC 
        LIMIT 0,
    2 
    ) c
    -- 借鉴(更准确,漂亮):
SELECT
    a.s_id,
    a.c_id,
    a.s_score 
FROM
    score a 
WHERE
    ( SELECT COUNT( 1 ) FROM score b WHERE b.c_id = a.c_id AND b.s_score >= a.s_score )<= 2 
ORDER BY
    a.c_id
  1. 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
 SELECT
     sc.c_id,
     count( 1 ) 
 FROM
     score sc
     LEFT JOIN course c ON c.c_id = sc.c_id 
 GROUP BY
     c.c_id 
 HAVING
    count( 1 )> 5 
ORDER BY
    count( 1 ) DESC,
    sc.c_id ASC
  1. 检索至少选修两门课程的学生学号
SELECT
    st.s_id 
FROM
    student st
    LEFT JOIN score sc ON sc.s_id = st.s_id 
GROUP BY
    st.s_id 
HAVING
    count( 1 )>=2
  1. 查询选修了全部课程的学生信息
SELECT
     st.* 
 FROM
     student st
     LEFT JOIN score sc ON sc.s_id = st.s_id 
 GROUP BY
    st.s_id 
 HAVING
     count( 1 )=(
    SELECT
        count( 1 ) 
    FROM
    course 
    )
  1. 查询各学生的年龄
SELECT
    st.*,
    timestampdiff(
        YEAR,
        st.s_birth,
    now()) 
FROM
    student st
  1. 查询本周过生日的学生
SELECT
    st.* 
FROM
    student st 
WHERE
    WEEK (
    now())= WEEK (
    date_format( st.s_birth, '%Y%m%d' ))
  1. 查询下周过生日的学生
SELECT
    st.* 
FROM
    student st 
WHERE
    WEEK (
    now())+ 1 = WEEK (
    date_format( st.s_birth, '%Y%m%d' ))
  1. 查询本月过生日的学生
SELECT
    st.* 
FROM
    student st 
WHERE
    MONTH (
    now())= MONTH (
    date_format( st.s_birth, '%Y%m%d' ))
  1. 查询下月过生日的学生
 SELECT
     st.* 
 FROM
     student st 
 WHERE
     MONTH (
         timestampadd(
             MONTH,
             1,
        now()))= MONTH (
    date_format( st.s_birth, '%Y%m%d' ))
    -- 或
SELECT
    st.* 
FROM
    student st 
WHERE
    ( MONTH ( now()) + 1 ) MOD 12 = MONTH (
    date_format( st.s_birth, '%Y%m%d' ))
经典sql面试及答案(50) 经典sql面试及答案(50) (新链接)SQL 经典五十道题 联想笔记本数据库csdn1010 复习 重点知识/关键词 like、rlike MySQL EXTRACT() 函数 行列转换&多行合并为一行(第40)【数据库表行列转置的实现_My... 阅读详情

相关推荐

MySQL全方位练习(学生表 教师表 课程表 分数表)

一、创建表并初始化数据 1、表说明 student(学生表)、teacher(教师表)、course(课程表)、sc(分数表) 2、创建表 //学生表create table student( sno varchar2(10) primary key, sname varchar2(20), sage number(2), ...

weixin_30298497的博客 3249

sql 50道 练习题

sql 练习题目,学生教师分数表

running_131的博客 9117

50道MySQL经典练习题

这个是网上流传的50道SQL练习题,最近拿来练习,刚做完,这里把我做的答案给大家做个参考,如有错误,还请告知。 另外,做题的时候先不要看答案(答案不唯一,只要满足要求即可),要有自己的一个思考过程,这样做出来才能达到最好的训练效果。(感觉做这种题是会上瘾的……) 我使用的Mysql版本是5.7.19。SQL语句可能会因数据库系统的不同会有少许差异。 这里放上MySQL语法执行的先后顺序: 7:SE...

AvenueCyy的博客 4521

50道SQL练习题

50道SQL练习题

皮卡丘的情绪 1万+

MySQL学习:50道经典题目(含参考答案)(更新中)

首先根据course_id将成绩表分为两张表,筛选出" 1 "课程比" 2 "课程成绩高的学生,再与学生表关联。1. 查询" 1 "课程比" 2 "课程成绩高的学生的信息(学号、姓名、性别、出生日期)及课程分数。利用自连接,统计比当前分数高的分数有几个,排名就是几加1。使用case when语句,多个排序条件时用逗号分隔。利用课程数量,计算出所有课程数和每个学生的选课数量。先筛选与" 1 "号同学选课数量相同的同学,再剔除。10. 查询没有学全所有课程的同学的信息。选了" 1 "号同学没选的课的同学。

weixin_42661635的博客 1万+

50道经典SQL练习题 -- 更新完成

      网上流传较广的50道SQL训练,花好几天终于写完了,和参考了网上的部分答案,但很多都是自己理解后写的,可能会有一些错误或更优解,欢迎指出。

ylqdh的博客 2088

SQL练习题共50道附答案(MySQL

以下文章来源于公众号 框架师 ,作者 MoBai白 随便建立一个数据库,导入数据到数据库: -- 建立课程表 DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `c_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' C...

weixin_44224716的博客 1183

sql50道题-mysql版,附详细解答

sql50道题-mysql版,附详细解答 实验狗插空写了网上流行的sql经典50题。做完这些题对于看书的锻炼巩固效果还是很棒的,又不至于很难,不会打击到学习的信心,对于新手来说适合练手,推荐! 废话不多说,我先把题目全部贴出来,先自己做,然后再看答案效果会好很多哦! 在代码部分我附了自己的答题思路,以及相关的知识点的干货链接,不明白知识点的点进去学习一波再继续做下去吧。 欢迎纠错讨论...

hetti的博客 1724

精选36道SQL练习题解析 from(原50道SQL练习题)

精选36道MySQL练习题解析 from 原50道SQL练习题 对网络上流传的50道SQL练习题做了筛选,去掉了一些重复的题,剩下36道,总结分为6大类,几乎囊括了SQL查询绝大部分知识点,并给出了不同方法及解析,掌握这36道题,SQL查询语句基本上没啥大问题了

若如初见 1万+

SQL 50道练习题 解答过程

SQL 50道练习题 解答过程 博主使用的是MySQL8.0.13 + workbench,如果是使用Oracle或者SQL Server可能会有语言差异或者是MySQL的不同版本也许会有差异。 题目来源及答案部分参考: https://blog.youkuaiyun.com/zhang945254064/article/details/80305602 https://zhuanlan.zhihu.com/...

Minervar的博客 1231

Sql经典练习题库(附答案)

SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的SQL接口。 它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。    结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。    美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。    SQL语言包含4个部分:    数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。    数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。    数据查询语言(DQL),例如:SELECT语句。    数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。    SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。

50道MYSQL练习题及答案

50道MYSQL练习题目前题目好像有好几个题目版本,本版本前的前18题相较于后半部分难度明显会有提升,部分答案并非最优选择,仅供参考。同时部分答案涉及GROUP BY若提示sql_mode=only_full_group_by的错误,原因为MYSQL5.7及以上版本开启了 only_full_group_by 模式,导致原有的GROUP BY语句报错,具体解决方法本文不做赘述。 数据表介绍 1.学...

qq_45574891的博客 3184

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 321

50道经典SQL练习题 MYSQL8.0实现

使用MYSQL8.0完成了“50道经典SQL练习题”,答案可能有误,欢迎指正。 参考了多位网友的答案 超经典SQL练习题,做完这些你的SQL就过关了 50道SQL练习题 50道SQL练习题及答案与详细分析 准备数据 CREATE TABLE student( id VARCHAR(10), name VARCHAR(10), age DATETIME, sex VARCHAR(10...

博客 4829

【深度学习】通俗易懂讲解循环神经网络LSTM

目录 1、循环神经网络(Recurrent Neural Networks) 2、长依赖存在的问题 3、LSTM 网络 4、LSTMs的核心思想 5、一步一步理解LSTM 6、LSTM的变种 7、总结 1、循环神经网络(Recurrent Neural Networks) 人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。...

Nieson2012的专栏 2729

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek,并借助DuckDuckGo实现联网查询

虎鲸不是鱼 1699

MySQL 50道练习题及答案

练习题参考知乎 https://zhuanlan.zhihu.com/p/50662216 以下是根据自己思路编写的代码,部分参考了知乎,途中遇到了不少问题 整个实践过程中总是忘记指定字段所在的表名,出现如下错误 ERROR 1052 (23000): Column ‘’ in field list is ambiguous, 指定列重复,即两张表存在相同字段,没有在表字段前指明表名,导致指代不清...

M10F的博客 7328

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 458

深夜小酌,50道经典SQL题,真香~

蹲坑之余,在网上找到了50道所谓经典SQL题,这不就是深夜必备小菜?我用脚叼起拖鞋,从冰箱拿出封印已久的半瓶可乐,打开数日未见的MySQL8,来吧,来场说卷就卷的刷题。

陈哈哈的菜园子 6222

【nerfStudio】1-在windows上安装nerfStudio

安装Git。安装Visual Studio 2022。在安装CUDA之前必须完成此步骤。必须在“桌面开发与C++”工作流程(在BuildTools版本中称为“C++构建工具”)中包含所需的组件。Nerfstudio要求。我们建议使用conda来管理依赖关系。在继续之前,请确保安装了Conda。 依赖关系 PyTorch 请注意,如果安装了低于2.0.1的PyTorch版本,则应卸载先前版本的pytorch、functorch和tiny-cuda-nn。 基于CUDA 11.8的Torch 2.0.1 安装基

dlhlSC的博客 1692

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1657

50道mysql笔试题目及答案_50道SQL练习题及答案(MySQL版)

--1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数SELECT st.*, class1, class2 FROM student st JOIN(SELECT * FROM(SELECT SId s1, score class1 FROM sc WHERE CId = '01') c1,(SELECT SId s2, score class2 FROM sc WHERE ...

weixin_34996026的博客 5966

【CAN总线测试】——使用VH6501 进行Busoff快慢恢复测试

即在IDBase中填标准帧11位二进制ID,如果不满11位,高位补零,凑齐11位,并将下方CurrTriggerField设置干扰前一位AckSlot位,Triggeroffset设置为0。首先确认环境支持VN6501,6501硬件连接成功后,工程的小闪电是正常黄色状态,若是灰色证明缺少License,或者软件安装环境不正确。填写干扰报文ID、干扰位置 注意这里的干扰位置是实际干扰的前一位,TriggerOffset表示偏移量,可以干扰某个字节的具体位.找到并打开Panel后,开启工程,并且配置面板。

LOVE135149的博客 5629
上一篇: ITextPDF7 的一些功能的使用
下一篇: SQL优化详解
错过了时间
博客等级 码龄8年 139粉丝 37原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值