MySQL50道经典题目(低中高难度)

–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) --学生编号,课程编号,分数
 
测试数据
--建表
--学生表
CREATE TABLE Student(
s_id VARCHAR(20),
s_name VARCHAR(20) NOT NULL DEFAULT '',
s_birth VARCHAR(20) NOT NULL DEFAULT '',
s_sex VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY(s_id)
);
--课程表
CREATE TABLE Course(
c_id VARCHAR(20),
c_name VARCHAR(20) NOT NULL DEFAULT '',
t_id VARCHAR(20) NOT NULL,
PRIMARY KEY(c_id)
);
--教师表
CREATE TABLE Teacher(
t_id VARCHAR(20),
t_name VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(t_id)
);
--成绩表
CREATE TABLE Score(
s_id VARCHAR(20),
c_id VARCHAR(20),
s_score INT,
PRIMARY KEY(s_id,c_id)
);
--插入学生表测试数据
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 Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
 
--教师表测试数据
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
 
--成绩表测试数据
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('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);
 
练习题和sql语句:
-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
 1 SELECT 
 2     a.*, b.s_score AS 01_score, c.s_score AS 02_score
 3 FROM
 4     student a
 5         JOIN
 6     score b ON a.s_id = b.s_id AND b.c_id = '01'
 7         LEFT JOIN
 8     score c ON a.s_id = c.s_id AND c.c_id = '02'
 9         OR c.c_id = NULL
10 WHERE
11     b.s_score > c.s_score;
12 -- 也可以这样写
13     SELECT 
14     a.*, b.s_score AS 01_score, c.s_score AS 02_score
15 FROM
16     student a,
17     score b,
18     score c
19 WHERE
20     a.s_id = b.s_id AND a.s_id = c.s_id
21         AND b.c_id = '01'
22         AND c.c_id = '02'
23         AND b.s_score > c.s_score

  

-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
SELECT 
    a.*, b.s_score AS 01_score, c.s_score AS 02_score
FROM
    student a
        LEFT JOIN
    score b ON a.s_id = b.s_id AND b.c_id = '01'
        OR b.c_id = NULL
        JOIN
    score c ON a.s_id = c.s_id AND c.c_id = '02'
WHERE
    b.s_score < c.s_score

 

-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT 
    b.s_id, b.s_name, ROUND(AVG(a.s_score), 2) AS avg_score
FROM
    student b
        JOIN
    score a ON b.s_id = a.s_id
GROUP BY b.s_id , b.s_name
HAVING avg_score >= 60;

  

-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)
SELECT 
    b.s_id, b.s_name, ROUND(AVG(a.s_score), 2) AS avg_score
FROM
    student b
        LEFT JOIN
    score a ON b.s_id = a.s_id
GROUP BY b.s_id , b.s_name
HAVING avg_score < 60 
UNION SELECT 
    a.s_id, a.s_name, 0 AS avg_score
FROM
    student a
WHERE
    a.s_id NOT IN (SELECT DISTINCT
            s_id
        FROM
            score);

  

-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT 
    a.s_id,
    a.s_name,
    COUNT(b.c_id) AS sum_course,
    SUM(b.s_score) AS sum_score
FROM
    student a
        LEFT JOIN
    score b ON a.s_id = b.s_id
GROUP BY a.s_id , a.s_name;

  

-- 6、查询"李"姓老师的数量
SELECT 
    COUNT(t_id)
FROM
    teacher
WHERE
    t_name LIKE '李%';

  

-- 7、查询学过"张三"老师授课的同学的信息
SELECT 
    a.*
FROM
    student a
        JOIN
    score b ON a.s_id = b.s_id
WHERE
    b.c_id IN (SELECT 
            c_id
        FROM
            course
        WHERE
            t_id = (SELECT 
                    t_id
                FROM
                    teacher
                WHERE
                    t_name = '张三'));

  

-- 8、查询没学过"张三"老师授课的同学的信息
SELECT 
    *
FROM
    student c
WHERE
    c.s_id NOT IN (SELECT 
            a.s_id
        FROM
            student a
                JOIN
            score b ON a.s_id = b.s_id
        WHERE
            b.c_id IN (SELECT 
                    a.c_id
                FROM
                    course a
                        JOIN
                    teacher b ON a.t_id = b.t_id
                WHERE
                    t_name = '张三'));

  

-- 9、查询学过编号为"01"并且也学过编号为"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';

  

-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
SELECT 
    a.*
FROM
    student a
WHERE
    a.s_id IN (SELECT 
            s_id
        FROM
            score
        WHERE
            c_id = '01')
        AND a.s_id NOT IN (SELECT 
            s_id
        FROM
            score
        WHERE
            c_id = '02');	

  

-- 11、查询没有学全所有课程的同学的信息
-- @wendiepei的写法
SELECT 
    s.*
FROM
    student s
        LEFT JOIN
    Score s1 ON s1.s_id = s.s_id
GROUP BY s.s_id
HAVING COUNT(s1.c_id) < (SELECT 
        COUNT(*)
    FROM
        course);

-- @k1051785839的写法
SELECT 
    *
FROM
    student
WHERE
    s_id NOT IN (SELECT 
            s_id
        FROM
            score t1
        GROUP BY s_id
        HAVING COUNT(*) = (SELECT 
                COUNT(DISTINCT c_id)
            FROM
                course));	

  

-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECT 
    *
FROM
    student
WHERE
    s_id IN (SELECT DISTINCT
            a.s_id
        FROM
            score a
        WHERE
            a.c_id IN (SELECT 
                    a.c_id
                FROM
                    score a
                WHERE
                    a.s_id = '01'));

  

-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
-- @ouyang_1993的写法
SELECT 
    Student.*
FROM
    Student
WHERE
    s_id IN (SELECT 
            s_id
        FROM
            Score
        GROUP BY s_id
        HAVING COUNT(s_id) = (SELECT 
                COUNT(c_id)
            FROM
                Score
            WHERE
                s_id = '01'))
        AND s_id NOT IN (SELECT 
            s_id
        FROM
            Score
        WHERE
            c_id IN (SELECT DISTINCT
                    c_id
                FROM
                    Score
                WHERE
                    c_id NOT IN (SELECT 
                            c_id
                        FROM
                            Score
                        WHERE
                            s_id = '01'))
        GROUP BY s_id)
        AND s_id NOT IN ('01')
-- @k1051785839的写法 
SELECT 
    t3.*
FROM
    (SELECT 
        s_id,
            GROUP_CONCAT(c_id
                ORDER BY c_id) group1
    FROM
        score
    WHERE
        s_id & lt > '01'
    GROUP BY s_id) t1
        INNER JOIN
    (SELECT 
        GROUP_CONCAT(c_id
                ORDER BY c_id) group2
    FROM
        score
    WHERE
        s_id = '01'
    GROUP BY s_id) t2 ON t1.group1 = t2.group2
        INNER JOIN
    student t3 ON t1.s_id = t3.s_id;

  

-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT 
    a.s_name
FROM
    student a
WHERE
    a.s_id NOT IN (SELECT 
            s_id
        FROM
            score
        WHERE
            c_id = (SELECT 
                    c_id
                FROM
                    course
                WHERE
                    t_id = (SELECT 
                            t_id
                        FROM
                            teacher
                        WHERE
                            t_name = '张三')));

  

-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT 
    a.s_id, a.s_name, ROUND(AVG(b.s_score))
FROM
    student a
        LEFT JOIN
    score b ON a.s_id = b.s_id
WHERE
    a.s_id IN (SELECT 
            s_id
        FROM
            score
        WHERE
            s_score < 60
        GROUP BY s_id
        HAVING COUNT(1) >= 2)
GROUP BY a.s_id , a.s_name ;

  

-- 16、检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT 
    a.*, b.c_id, b.s_score
FROM
    student a,
    score b
WHERE
    a.s_id = b.s_id AND b.c_id = '01'
        AND b.s_score < 60
ORDER BY b.s_score DESC;

  

-- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT 
    a.s_id,
    (SELECT 
            s_score
        FROM
            score
        WHERE
            s_id = a.s_id AND c_id = '01') AS 语文,
    (SELECT 
            s_score
        FROM
            score
        WHERE
            s_id = a.s_id AND c_id = '02') AS 数学,
    (SELECT 
            s_score
        FROM
            score
        WHERE
            s_id = a.s_id AND c_id = '03') AS 英语,
    ROUND(AVG(s_score), 2) AS 平均分
FROM
    score a
GROUP BY a.s_id
ORDER BY 平均分 DESC;

--@喝完这杯还有一箱的写法
SELECT 
    a.s_id,
    MAX(CASE a.c_id
        WHEN '01' THEN a.s_score
    END) 语文,
    MAX(CASE a.c_id
        WHEN '02' THEN a.s_score
    END) 数学,
    MAX(CASE a.c_id
        WHEN '03' THEN a.s_score
    END) 英语,
    AVG(a.s_score),
    b.s_name
FROM
    Score a
        JOIN
    Student b ON a.s_id = b.s_id
GROUP BY a.s_id
ORDER BY 5 DESC	;

  

-- 18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT 
    a.c_id,
    b.c_name,
    MAX(s_score),
    MIN(s_score),
    ROUND(AVG(s_score), 2),
    ROUND(100 * (SUM(CASE
                WHEN a.s_score >= 60 THEN 1
                ELSE 0
            END) / SUM(CASE
                WHEN a.s_score THEN 1
                ELSE 0
            END)),
            2) AS 及格率,
    ROUND(100 * (SUM(CASE
                WHEN a.s_score >= 70 AND a.s_score <= 80 THEN 1
                ELSE 0
            END) / SUM(CASE
                WHEN a.s_score THEN 1
                ELSE 0
            END)),
            2) AS 中等率,
    ROUND(100 * (SUM(CASE
                WHEN a.s_score >= 80 AND a.s_score <= 90 THEN 1
                ELSE 0
            END) / SUM(CASE
                WHEN a.s_score THEN 1
                ELSE 0
            END)),
            2) AS 优良率,
    ROUND(100 * (SUM(CASE
                WHEN a.s_score >= 90 THEN 1
                ELSE 0
            END) / SUM(CASE
                WHEN a.s_score THEN 1
                ELSE 0
            END)),
            2) AS 优秀率
FROM
    score a
        LEFT JOIN
    course b ON a.c_id = b.c_id
GROUP BY a.c_id , b.c_name;

  

-- 19、按各科成绩进行排序,并显示排名
-- mysql没有rank函数
	SELECT 
    a.s_id,
    a.c_id,
    @i:=@i + 1 AS i保留排名,
    @k:=(CASE
        WHEN @score = a.s_score THEN @k
        ELSE @i
    END) AS rank不保留排名,
    @score:=a.s_score AS score
FROM
    (SELECT 
        s_id, c_id, s_score
    FROM
        score
    GROUP BY s_id , c_id , s_score
    ORDER BY s_score DESC) a,
    (SELECT @k:=0, @i:=0, @score:=0) s;
--@k1051785839的写法
(SELECT 
    *
FROM
    (SELECT 
        t1.c_id,
            t1.s_score,
            (SELECT 
                    COUNT(DISTINCT t2.s_score)
                FROM
                    score t2
                WHERE
                    t2.s_score >= t1.s_score
                        AND t2.c_id = '01') rank
    FROM
        score t1
    WHERE
        t1.c_id = '01'
    ORDER BY t1.s_score DESC) t1) UNION (SELECT 
    *
FROM
    (SELECT 
        t1.c_id,
            t1.s_score,
            (SELECT 
                    COUNT(DISTINCT t2.s_score)
                FROM
                    score t2
                WHERE
                    t2.s_score >= t1.s_score
                        AND t2.c_id = '02') rank
    FROM
        score t1
    WHERE
        t1.c_id = '02'
    ORDER BY t1.s_score DESC) t2) UNION (SELECT 
    *
FROM
    (SELECT 
        t1.c_id,
            t1.s_score,
            (SELECT 
                    COUNT(DISTINCT t2.s_score)
                FROM
                    score t2
                WHERE
                    t2.s_score >= t1.s_score
                        AND t2.c_id = '03') rank
    FROM
        score t1
    WHERE
        t1.c_id = '03'
    ORDER BY t1.s_score DESC) t3) ;

  

-- 20、查询学生的总成绩并进行排名
SELECT 
    a.s_id,
    @i:=@i + 1 AS i,
    @k:=(CASE
        WHEN @score = a.sum_score THEN @k
        ELSE @i
    END) AS rank,
    @score:=a.sum_score AS score
FROM
    (SELECT 
        s_id, SUM(s_score) AS sum_score
    FROM
        score
    GROUP BY s_id
    ORDER BY sum_score DESC) a,
    (SELECT @k:=0, @i:=0, @score:=0) s;

  

-- 21、查询不同老师所教不同课程平均分从高到低显示
SELECT 
    a.t_id,
    c.t_name,
    a.c_id,
    ROUND(AVG(s_score), 2) AS avg_score
FROM
    course a
        LEFT JOIN
    score b ON a.c_id = b.c_id
        LEFT JOIN
    teacher c ON a.t_id = c.t_id
GROUP BY a.c_id , a.t_id , c.t_name
ORDER BY avg_score DESC;

  

-- 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
SELECT 
    d.*, c.排名, c.s_score, c.c_id
FROM
    (SELECT 
        a.s_id, a.s_score, a.c_id, @i:=@i + 1 AS 排名
    FROM
        score a, (SELECT @i:=0) s
    WHERE
        a.c_id = '01'
    ORDER BY a.s_score DESC) c
        LEFT JOIN
    student d ON c.s_id = d.s_id
WHERE
    排名 BETWEEN 2 AND 3 
UNION SELECT 
    d.*, c.排名, c.s_score, c.c_id
FROM
    (SELECT 
        a.s_id, a.s_score, a.c_id, @j:=@j + 1 AS 排名
    FROM
        score a, (SELECT @j:=0) s
    WHERE
        a.c_id = '02'
    ORDER BY a.s_score DESC) c
        LEFT JOIN
    student d ON c.s_id = d.s_id
WHERE
    排名 BETWEEN 2 AND 3 
UNION SELECT 
    d.*, c.排名, c.s_score, c.c_id
FROM
    (SELECT 
        a.s_id, a.s_score, a.c_id, @k:=@k + 1 AS 排名
    FROM
        score a, (SELECT @k:=0) s
    WHERE
        a.c_id = '03'
    ORDER BY a.s_score DESC) c
        LEFT JOIN
    student d ON c.s_id = d.s_id
WHERE
    排名 BETWEEN 2 AND 3;

  

-- 23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
SELECT DISTINCT
    f.c_name,
    a.c_id,
    b.`85-100`,
    b.百分比,
    c.`70-85`,
    c.百分比,
    d.`60-70`,
    d.百分比,
    e.`0-60`,
    e.百分比
FROM
    score a
        LEFT JOIN
    (SELECT 
        c_id,
            SUM(CASE
                WHEN s_score > 85 AND s_score <= 100 THEN 1
                ELSE 0
            END) AS `85-100`,
            ROUND(100 * (SUM(CASE
                WHEN s_score > 85 AND s_score <= 100 THEN 1
                ELSE 0
            END) / COUNT(*)), 2) AS 百分比
    FROM
        score
    GROUP BY c_id) b ON a.c_id = b.c_id
        LEFT JOIN
    (SELECT 
        c_id,
            SUM(CASE
                WHEN s_score > 70 AND s_score <= 85 THEN 1
                ELSE 0
            END) AS `70-85`,
            ROUND(100 * (SUM(CASE
                WHEN s_score > 70 AND s_score <= 85 THEN 1
                ELSE 0
            END) / COUNT(*)), 2) AS 百分比
    FROM
        score
    GROUP BY c_id) c ON a.c_id = c.c_id
        LEFT JOIN
    (SELECT 
        c_id,
            SUM(CASE
                WHEN s_score > 60 AND s_score <= 70 THEN 1
                ELSE 0
            END) AS `60-70`,
            ROUND(100 * (SUM(CASE
                WHEN s_score > 60 AND s_score <= 70 THEN 1
                ELSE 0
            END) / COUNT(*)), 2) AS 百分比
    FROM
        score
    GROUP BY c_id) d ON a.c_id = d.c_id
        LEFT JOIN
    (SELECT 
        c_id,
            SUM(CASE
                WHEN s_score >= 0 AND s_score <= 60 THEN 1
                ELSE 0
            END) AS `0-60`,
            ROUND(100 * (SUM(CASE
                WHEN s_score >= 0 AND s_score <= 60 THEN 1
                ELSE 0
            END) / COUNT(*)), 2) AS 百分比
    FROM
        score
    GROUP BY c_id) e ON a.c_id = e.c_id
        LEFT JOIN
    course f ON a.c_id = f.c_id

  

 
-- 24、查询学生平均成绩及其名次
SELECT 
    a.s_id,
    @i:=@i + 1 AS '不保留空缺排名',
    @k:=(CASE
        WHEN @avg_score = a.avg_s THEN @k
        ELSE @i
    END) AS '保留空缺排名',
    @avg_score:=avg_s AS '平均分'
FROM
    (SELECT 
        s_id, ROUND(AVG(s_score), 2) AS avg_s
    FROM
        score
    GROUP BY s_id
    ORDER BY avg_s DESC) a,
    (SELECT @avg_score:=0, @i:=0, @k:=0) b;

  

 
-- 25、查询各科成绩前三名的记录
-- 1.选出b表比a表成绩大的所有组
-- 2.选出比当前id成绩大的 小于三个的
SELECT 
    a.s_id, a.c_id, a.s_score
FROM
    score a
        LEFT JOIN
    score b ON a.c_id = b.c_id
        AND a.s_score < b.s_score
GROUP BY a.s_id , a.c_id , a.s_score
HAVING COUNT(b.s_id) < 3
ORDER BY a.c_id , a.s_score DESC

  

-- 26、查询每门课程被选修的学生数
SELECT 
    c_id, COUNT(s_id)
FROM
    score a
GROUP BY c_id;

  

 
-- 27、查询出只有两门课程的全部学生的学号和姓名
SELECT 
    s_id, s_name
FROM
    student
WHERE
    s_id IN (SELECT 
            s_id
        FROM
            score
        GROUP BY s_id
        HAVING COUNT(c_id) = 2);

  

-- 28、查询男生、女生人数
SELECT 
    s_sex, COUNT(s_sex) AS 人数
FROM
    student
GROUP BY s_sex;

  

-- 29、查询名字中含有"风"字的学生信息
SELECT 
    *
FROM
    student
WHERE
    s_name LIKE '%风%';

  

 
-- 30、查询同名同性学生名单,并统计同名人数
SELECT 
    a.s_name, a.s_sex, COUNT(*)
FROM
    student a
        JOIN
    student b ON a.s_id != b.s_id AND a.s_name = b.s_name
        AND a.s_sex = b.s_sex
GROUP BY a.s_name , a.s_sex;

  

 
-- 31、查询1990年出生的学生名单
SELECT 
    s_name
FROM
    student
WHERE
    s_birth LIKE '1990%';

  

-- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
SELECT 
    c_id, ROUND(AVG(s_score), 2) AS avg_score
FROM
    score
GROUP BY c_id
ORDER BY avg_score DESC , c_id ASC;

  

-- 33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
SELECT 
    a.s_id, b.s_name, ROUND(AVG(a.s_score), 2) AS avg_score
FROM
    score a
        LEFT JOIN
    student b ON a.s_id = b.s_id
GROUP BY s_id
HAVING avg_score >= 85;

  

 
-- 34、查询课程名称为"数学",且分数低于60的学生姓名和分数
SELECT 
    a.s_name, b.s_score
FROM
    score b
        JOIN
    student a ON a.s_id = b.s_id
WHERE
    b.c_id = (SELECT 
            c_id
        FROM
            course
        WHERE
            c_name = '数学')
        AND b.s_score < 60

  

-- 35、查询所有学生的课程及分数情况;
SELECT 
    a.s_id,
    a.s_name,
    SUM(CASE c.c_name
        WHEN '语文' THEN b.s_score
        ELSE 0
    END) AS '语文',
    SUM(CASE c.c_name
        WHEN '数学' THEN b.s_score
        ELSE 0
    END) AS '数学',
    SUM(CASE c.c_name
        WHEN '英语' THEN b.s_score
        ELSE 0
    END) AS '英语',
    SUM(b.s_score) AS '总分'
FROM
    student a
        LEFT JOIN
    score b ON a.s_id = b.s_id
        LEFT JOIN
    course c ON b.c_id = c.c_id
GROUP BY a.s_id , a.s_name

  

-- 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT 
    a.s_name, b.c_name, c.s_score
FROM
    course b
        LEFT JOIN
    score c ON b.c_id = c.c_id
        LEFT JOIN
    student a ON a.s_id = c.s_id
WHERE
    c.s_score >= 70;

  

-- 37、查询不及格的课程
SELECT 
    a.s_id, a.c_id, b.c_name, a.s_score
FROM
    score a
        LEFT JOIN
    course b ON a.c_id = b.c_id
WHERE
    a.s_score < 60;

  

--38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;
SELECT 
    a.s_id, b.s_name
FROM
    score a
        LEFT JOIN
    student b ON a.s_id = b.s_id
WHERE
    a.c_id = '01' AND a.s_score > 80

  

-- 39、求每门课程的学生人数
SELECT 
    COUNT(*)
FROM
    score
GROUP BY c_id;

  

-- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 查询老师id	
SELECT 
    c_id
FROM
    course c,
    teacher d
WHERE
    c.t_id = d.t_id AND d.t_name = '张三';
    
-- 查询最高分(可能有相同分数)
SELECT 
    MAX(s_score)
FROM
    score
WHERE
    c_id = '02';
    
-- 查询信息
SELECT 
    a.*, b.s_score, b.c_id, c.c_name
FROM
    student a
        LEFT JOIN
    score b ON a.s_id = b.s_id
        LEFT JOIN
    course c ON b.c_id = c.c_id
WHERE
    b.c_id = (SELECT 
            c_id
        FROM
            course c,
            teacher d
        WHERE
            c.t_id = d.t_id AND d.t_name = '张三')
        AND b.s_score IN (SELECT 
            MAX(s_score)
        FROM
            score
        WHERE
            c_id = '02');

  

-- 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT DISTINCT
    b.s_id, b.c_id, b.s_score
FROM
    score a,
    score b
WHERE
    a.c_id != b.c_id
        AND a.s_score = b.s_score;

  

-- 42、查询每门功成绩最好的前两名
-- 牛逼的写法
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

  

-- 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT 
    c_id, COUNT(*) AS total
FROM
    score
GROUP BY c_id
HAVING total > 5
ORDER BY total , c_id ASC;

  

-- 44、检索至少选修两门课程的学生学号
SELECT 
    s_id, COUNT(*) AS sel
FROM
    score
GROUP BY s_id
HAVING sel >= 2;

  

-- 45、查询选修了全部课程的学生信息
SELECT 
    *
FROM
    student
WHERE
    s_id IN (SELECT 
            s_id
        FROM
            score
        GROUP BY s_id
        HAVING COUNT(*) = (SELECT 
                COUNT(*)
            FROM
                course));

  

--46、查询各学生的年龄
-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
SELECT 
    s_birth,
    (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(s_birth, '%Y') - (CASE
        WHEN DATE_FORMAT(NOW(), '%m%d') > DATE_FORMAT(s_birth, '%m%d') THEN 0
        ELSE 1
    END)) AS age
FROM
    student;

  

-- 47、查询本周过生日的学生
SELECT 
    *
FROM
    student
WHERE
    WEEK(DATE_FORMAT(NOW(), '%Y%m%d')) = WEEK(s_birth);
SELECT 
    *
FROM
    student
WHERE
    YEARWEEK(s_birth) = YEARWEEK(DATE_FORMAT(NOW(), '%Y%m%d'));
	
SELECT WEEK(DATE_FORMAT(NOW(), '%Y%m%d'));

  

-- 48、查询下周过生日的学生
SELECT 
    *
FROM
    student
WHERE
    WEEK(DATE_FORMAT(NOW(), '%Y%m%d')) + 1 = WEEK(s_birth);

  

-- 49、查询本月过生日的学生
SELECT 
    *
FROM
    student
WHERE
    MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) = MONTH(s_birth)

  

-- 50、查询下月过生日的学生
SELECT 
    *
FROM
    student
WHERE
    MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) + 1 = MONTH(s_birth);

 

代码排版好看也是一种艺术=.=!

星光不问赶路人!

 
posted on 2021-05-11 17:48  寒江孤影!  阅读(354)  评论(0)    收藏  举报