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);
代码排版好看也是一种艺术=.=!
星光不问赶路人!
浙公网安备 33010602011771号