MySQL 50道题目练习,帮助你入门

128 阅读13分钟

DDL如下

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(3),  
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);

50道题目如下:

-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数  
SELECT s.*, a.`s_score` AS '01', b.`s_score` AS '02'  
FROM score a  
INNER JOIN score b ON a.`c_id` = '01' AND b.`c_id` = '02' AND a.`s_score` > b.`s_score` AND a.`s_id` = b.`s_id`  
INNER JOIN student s ON s.s_id = a.`s_id`;  
  
-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数  
SELECT s.*, a.`s_score` AS '01', b.`s_score` AS '02'  
FROM score a  
INNER JOIN score b ON a.`s_id` = b.`s_id` AND a.`c_id` = '01' AND b.`c_id` = '02' AND a.`s_score` < b.`s_score`  
INNER JOIN student s ON s.`s_id` = a.`s_id`;  
  
-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩  
SELECT a.`s_id`, s.`s_name`, ROUND(AVG(a.`s_score`), 2) AS avg_score  
FROM score a  
INNER JOIN student s ON a.`s_id` = s.`s_id`  
GROUP BY a.`s_id`  
HAVING avg_score >= 60;  
  
-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩  
-- (包括有成绩的和无成绩的)  
SELECT s.s_id, st.s_name, AVG(s.s_score)  
FROM score s  
INNER JOIN student st ON s.`s_id` = st.`s_id`  
GROUP BY s.s_id  
HAVING AVG(s.s_score) < 60;  
  
-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩  
SELECT s.`s_id`, s.`s_name`, COUNT(1) AS num, SUM(a.`s_score`) AS total  
FROM student s  
LEFT JOIN score a ON s.`s_id` = a.`s_id`  
GROUP BY a.`s_id`;  
  
-- 6、查询"李"姓老师的数量  
SELECT COUNT(1)  
FROM teacher t  
WHERE t.t_name LIKE '李%';  
  
-- 7、查询学过"张三"老师授课的同学的信息  
SELECT st.*  
FROM score sc  
INNER JOIN student st ON sc.s_id = st.s_id  
WHERE sc.c_id IN (SELECT c.c_id  
FROM course c  
INNER JOIN teacher t ON c.t_id = t.t_id  
WHERE t.t_name = '张三');  
SELECT s.*  
FROM student s  
WHERE s.`s_id` IN (SELECT DISTINCT k.s_id  
FROM teacher t  
INNER JOIN course c ON t.`t_id` = c.`t_id`  
INNER JOIN score k ON k.`c_id` = c.`c_id`  
WHERE t.`t_name` = '张三');  
  
-- 8、查询没学过"张三"老师授课的同学的信息  
SELECT *  
FROM student st  
WHERE st.s_id NOT IN (SELECT sc.s_id  
FROM score sc  
INNER JOIN course co ON sc.c_id = co.c_id  
INNER JOIN teacher te ON co.t_id = te.t_id  
WHERE te.t_name = '张三');  
  
-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息  
SELECT st.*  
FROM score a  
INNER JOIN score b ON a.s_id = b.s_id AND a.c_id = '01' AND b.c_id = '02'  
INNER JOIN student st ON st.s_id = a.s_id;  
  
-- ***********10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息  
SELECT st.*  
FROM student st  
WHERE st.s_id IN (SELECT sc.s_id FROM score sc WHERE sc.c_id = '01')  
AND st.s_id NOT IN (SELECT sc.s_id FROM score sc WHERE sc.c_id = '02');  
  
-- 11、查询没有学全所有课程的同学的信息 支付牌照  
SELECT st.*  
FROM student st  
INNER JOIN score sc ON st.s_id = sc.s_id  
GROUP BY sc.s_id  
HAVING COUNT(1) < (SELECT COUNT(1) FROM course);  
  
-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息  
SELECT st.*  
FROM student st  
WHERE st.s_id IN (SELECT DISTINCT(sc.s_id)  
FROM score sc  
WHERE sc.s_id <> '01'  
AND sc.c_id IN (SELECT sc.c_id FROM score sc WHERE sc.s_id = '01'));  
  
-- ***13、查询和"01"号的同学学习的课程完全相同的其他同学的信息  
SELECT t1.s_id  
FROM (SELECT s_id, GROUP_CONCAT(c_id) AS group2 FROM score WHERE s_id = '01' GROUP BY s_id ORDER BY c_id) t2  
INNER JOIN  
(SELECT s_id, GROUP_CONCAT(c_id) AS group1 FROM score WHERE s_id <> '01' GROUP BY s_id ORDER BY c_id) t1  
ON t2.group2 = t1.group1  
INNER JOIN student t3 ON t3.s_id = t1.s_id;  
  
-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名  
SELECT st.*  
FROM student st  
WHERE st.s_id NOT IN (SELECT DISTINCT(sc.s_id)  
FROM score sc  
INNER JOIN (SELECT co.c_id  
FROM course co  
INNER JOIN teacher te ON co.t_id = te.t_id  
WHERE te.t_name = '张三') ct ON sc.c_id = ct.c_id);  
  
-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩  
SELECT sc.s_id, st.s_name, AVG(sc.s_score)  
FROM score sc  
INNER JOIN student st ON sc.s_id = st.s_id  
WHERE sc.s_score < 60  
GROUP BY sc.s_id  
HAVING COUNT(1) >= 2;  
  
-- 16、检索"01"课程分数小于60,按分数降序排列的学生信息  
SELECT st.*  
FROM score sc  
INNER JOIN student st ON sc.s_id = st.s_id  
WHERE sc.c_id = '01'  
AND sc.s_score < 60  
ORDER BY sc.s_score DESC;  
  
-- ***17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩  
SELECT a.`s_id`,  
MAX(CASE WHEN a.`c_id` = '01' THEN a.`s_score` END) AS 'chinese',  
MAX(CASE WHEN a.`c_id` = '02' THEN a.`s_score` END) AS 'math',  
MAX(CASE WHEN a.`c_id` = '03' THEN a.`s_score` END) AS 'english',  
ROUND(AVG(a.`s_score`), 2) AS vg  
FROM score a  
GROUP BY a.`s_id`  
ORDER BY vg DESC;  
  
-- *****18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率  
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90  
SELECT a.`c_id`,  
b.`c_name`,  
MAX(a.`s_score`) AS 'max',  
MIN(a.`s_score`) AS 'min',  
ROUND(AVG(a.`s_score`), 2) AS 'avg',  
CONCAT(ROUND(SUM(CASE WHEN a.`s_score` >= 60 THEN 1 ELSE 0 END) / COUNT(1) * 100, 2), '%') AS '及格率',  
ROUND(SUM(CASE WHEN a.`s_score` BETWEEN 70 AND 80 THEN 1 ELSE 0 END) / COUNT(1), 2) AS '中等率',  
ROUND(SUM(CASE WHEN a.`s_score` BETWEEN 80 AND 90 THEN 1 ELSE 0 END) / COUNT(1), 2) AS '优良率',  
ROUND(SUM(CASE WHEN a.`s_score` >= 90 THEN 1 ELSE 0 END) / COUNT(1), 2) AS '优秀率'  
FROM score a  
INNER JOIN course b ON a.`c_id` = b.`c_id`  
GROUP BY a.`c_id`;  
  
-- ***19、按各科成绩进行排序,并显示排名  
(SELECT a.`c_id`,  
a.`s_score`,  
(SELECT COUNT(DISTINCT (b.`s_score`)) FROM score b WHERE b.c_id = '01' AND b.s_score >= a.`s_score`) AS rank  
FROM score a  
WHERE a.`c_id` = '01'  
ORDER BY a.`c_id` ASC, a.`s_score` DESC)  
UNION  
(SELECT a.`c_id`,  
a.`s_score`,  
(SELECT COUNT(DISTINCT (b.`s_score`)) FROM score b WHERE b.c_id = '02' AND b.s_score >= a.`s_score`) AS rank  
FROM score a  
WHERE a.`c_id` = '02'  
ORDER BY a.`c_id` ASC, a.`s_score` DESC)  
UNION  
(SELECT a.`c_id`,  
a.`s_score`,  
(SELECT COUNT(DISTINCT (b.`s_score`)) FROM score b WHERE b.c_id = '03' AND b.s_score >= a.`s_score`) AS rank  
FROM score a  
WHERE a.`c_id` = '03'  
ORDER BY a.`c_id` ASC, a.`s_score` DESC);  
  
SELECT a.s_score, @cr := (CASE WHEN @cid != a.c_id THEN 1 ELSE @cr + 1 END) AS 'rank', @cid := a.c_id AS c_id  
FROM (SELECT s.c_id, s.s_score FROM score s GROUP BY s.c_id, s.s_score ORDER BY s.c_id, s.s_score DESC) a,  
(SELECT @cid := 0, @cr := 0) AS xx;  
  
-- 20、***查询学生的总成绩并进行排名  
SELECT s_id, total AS '总分', (@i := @i + 1) AS '排名'  
FROM (SELECT s_id, SUM(s_score) AS total FROM score GROUP BY s_id ORDER BY total DESC) t,  
(SELECT @i := 0) AS j;  
  
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) as a, (SELECT @k := 0, @i := 0, @score := 0) s;  
  
-- ***21、查询不同老师所教不同课程平均分从高到低显示  
SELECT sc.c_id, co.t_id, co.c_name, AVG(sc.s_score) avg_score  
FROM score sc  
INNER JOIN course co ON sc.c_id = co.c_id  
GROUP BY co.t_id, sc.c_id  
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) AS 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 排名 IN (2, 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) AS 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 排名 IN (2, 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) AS 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 排名 IN (2, 3);  
  
-- ******23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比  
SELECT sc.c_id,  
co.c_name,  
SUM(CASE WHEN s_score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '[100-85]',  
ROUND(100 * (SUM(CASE WHEN s_score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) / COUNT(1)), 2) AS '[100-85]百分比'  
FROM score sc  
INNER JOIN course co ON sc.c_id = co.c_id  
GROUP BY co.c_id  
HAVING co.c_id = '01';  
  
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 k.*, (@r := @r + 1)  
FROM (SELECT sc.s_id, ROUND(AVG(sc.s_score), 2) AS avg_score FROM score sc GROUP BY sc.s_id ORDER BY avg_score DESC) k,  
(SELECT @r := 0) r;  
  
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、****查询各科成绩前三名的记录  
SELECT *  
FROM score sc  
GROUP BY sc.c_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 sc.c_id, COUNT(1)  
FROM score sc  
GROUP BY sc.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 st.s_sex, COUNT(1)  
FROM student st  
GROUP BY st.s_sex;  
  
-- 29、查询名字中含有"风"字的学生信息  
SELECT *  
FROM student  
WHERE s_name LIKE '%风%';  
  
-- 30、查询同名同性学生名单,并统计同名人数  
SELECT st.s_name, st.s_sex, COUNT(1)  
FROM student st  
GROUP BY st.s_name, st.s_sex  
HAVING COUNT(1) > 1;  
  
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 sc.c_id, AVG(sc.s_score) aa  
FROM score sc  
GROUP BY sc.c_id  
ORDER BY aa DESC, sc.c_id ASC;  
  
-- 33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩  
SELECT sc.s_id, st.s_name, ROUND(AVG(sc.s_score), 2) aa  
FROM score sc  
LEFT JOIN student st ON sc.s_id = st.s_id  
GROUP BY sc.s_id  
HAVING aa >= 85;  
  
-- 34、查询课程名称为"数学",且分数低于60的学生姓名和分数  
SELECT st.s_name, sc.s_score  
FROM course co  
INNER JOIN score sc ON co.c_id = sc.c_id  
INNER JOIN student st ON st.s_id = sc.s_id  
WHERE co.c_name = '数学'  
AND sc.s_score < 60;  
  
-- ***35、查询所有学生的课程及分数情况  
SELECT st.s_id,  
st.s_name,  
SUM(CASE co.c_name WHEN '语文' THEN sc.s_score ELSE 0 END) AS '语文',  
SUM(CASE co.c_name WHEN '数学' THEN sc.s_score ELSE 0 END) AS '数学',  
SUM(CASE co.c_name WHEN '英语' THEN sc.s_score ELSE 0 END) AS '英语'  
FROM student st  
LEFT JOIN score sc ON st.s_id = sc.s_id  
LEFT JOIN course co ON co.c_id = sc.c_id  
GROUP BY st.s_id;  
  
-- 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 st.s_id, st.s_name  
FROM score sc  
INNER JOIN student st ON sc.s_id = st.s_id  
WHERE sc.c_id = '01'  
AND sc.s_score > 80;  
  
-- 39、求每门课程的学生人数  
SELECT COUNT(1)  
FROM score  
GROUP BY c_id;  
  
-- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩  
SELECT sc.s_id, st.s_name, sc.s_score  
FROM teacher te  
INNER JOIN course co ON te.t_id = co.t_id  
INNER JOIN score sc ON sc.c_id = co.c_Id  
INNER JOIN student st ON st.s_id = sc.s_id  
WHERE te.t_name = '张三'  
ORDER BY sc.s_score DESC  
LIMIT 1;  
  
-- ***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 sc.c_id, COUNT(1) AS num  
FROM score sc  
GROUP BY sc.c_id  
HAVING num > 5  
ORDER BY num DESC, sc.c_id ASC;  
  
-- 44、检索至少选修两门课程的学生学号  
SELECT s_id, COUNT(1) AS sel  
FROM score  
GROUP BY s_id  
HAVING sel >= 2;  
  
-- 45、查询选修了全部课程的学生信息  
SELECT *  
FROM student st  
WHERE st.s_id IN (SELECT sc.s_id FROM score sc GROUP BY sc.s_id HAVING COUNT(1) >= (SELECT COUNT(1) 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);