--1.学生表 stu(s_id,s_name,s_age,s_sex) --s_id 学生编号,s_name 学生姓名,s_birth 出生年月,s_sex 学生性别
--2.课程表 co(c_id,c_name,t_id) –c) --c_id 课程编号,c_name 课程名称,t_id 教师编号
--3.教师表 te (t_id,t_name) –t_id 教师编号,t_name 教师姓名
--4.成绩表 SC(s_id,c_id,score) –s_id 学生编号,c_id 课程编号,score 分数 */
--创建测试数据
create table stu(s_id varchar(10) primary key,s_name varchar(10),s_birth date,s_sex varchar(10));
insert into stu values ('01' , '赵雷' , '1990-01-01' , '男'), ('02' , '钱电' , '1990-12-21' , '男'), ('03' , '孙风' , '1990-05-20' , '男'), ('04' , '李云' , '1990-08-06' , '男'), ('05' , '周梅' , '1991-12-01' , '女'), ('06' , '吴兰' , '1992-03-01' , '女'), ('07' , '郑竹' , '1992-04-21' , '女'), ('08' , '王菊' , '1990-01-20' , '女');
create table co(c_id varchar(10) primary key,c_name varchar(10),t_id varchar(10));
insert into co values ('01' , '语文' , '02'), ('02' , '数学' , '01'), ('03' , '英语' , '03');
create table te(t_id varchar(10) primary key,t_name varchar(10));
insert into te values ('01' , '张三'), ('02' , '李四'), ('03' , '王五');
create table sc(s_id varchar(10),c_id varchar(10),score int);
insert into sc values ('01' , '01' , 80), ('01' , '02' , 90), ('01' , '03' , 99), ('02' , '01' , 70), ('02' , '02' , 60), ('02' , '03' , 80), ('03' , '01' , 80), ('03' , '02' , 80), ('03' , '03' , 80), ('04' , '01' , 50), ('04' , '02' , 30), ('04' , '03' , 20), ('05' , '01' , 76), ('05' , '02' , 87), ('06' , '01' , 31), ('06' , '03' , 34), ('07' , '02' , 89), ('07' , '03' , 98);
mysql题目
--1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
SELECT stu.*,c1.score '01课程',c2.score '02课程',c3.score '03课程'
FROM (SELECT score,s_id from sc where c_id=01) as c1,
(SELECT score,s_id from sc where c_id=02) as c2,
(SELECT score,s_id from sc where c_id=03) as c3,stu
WHERE c1.s_id=c2.s_id and stu.s_id=c1.s_id and c3.s_id=c2.s_id and c1.score>c2.score
--2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
SELECT stu.*,c1.score '01课程',c2.score '02课程',c3.score '03课程'
FROM (SELECT score,s_id from sc where c_id=01) as c1,
(SELECT score,s_id from sc where c_id=02) as c2,
(SELECT score,s_id from sc where c_id=03) as c3,stu
WHERE c1.s_id=c2.s_id and c1.s_id=stu.s_id and c2.s_id=c3.s_id and c1.score<c2.score
--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT stu.s_id,stu.s_name,AVG(sc.score) s_avg
FROM stu,sc
WHERE stu.s_id=sc.s_id GROUP BY stu.s_id,stu.s_name
HAVING AVG(sc.score)>=60
--4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
SELECT stu.s_id,stu.s_name,AVG(score) s_avg
FROM stu,sc
WHERE stu.s_id=sc.s_id
GROUP BY stu.s_id,stu.s_name
HAVING AVG(score)<=60;
--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT stu.s_id,stu.s_name,COUNT(sc.c_id) c_count,SUM(score) c_sum
FROM stu,sc
WHERE stu.s_id=sc.s_id
GROUP BY stu.s_id,stu.s_name
--6、查询"李"姓老师的数量
SELECT COUNT(t_name)
FROM te
WHERE t_name LIKE '李%'
--7、查询学过"张三"老师授课的同学的信息
SELECT stu.*
FROM stu,te,co,sc
WHERE stu.s_id=sc.s_id and sc.c_id=co.c_id and co.t_id=te.t_id and te.t_name='张三'
--8、查询没学过"张三"老师授课的同学的信息
SELECT stu.*
FROM stu,te,co,sc
WHERE stu.s_id=sc.s_id and sc.c_id=co.c_id and co.t_id=te.t_id and stu.s_name not in
(SELECT stu.s_name from stu,te,co,sc
WHERE stu.s_id=sc.s_id and sc.c_id=co.c_id and co.t_id=te.t_id and te.t_name='张三')
--9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT stu.* FROM stu
WHERE s_id in (SELECT s1.s_id from
(select s_id from sc where c_id=01) as s1,
(select s_id from sc where c_id=02) as s2
WHERE s1.s_id=s2.s_id)
--10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
SELECT stu.* FROM stu
WHERE s_id in (SELECT s_id from sc where c_id=01)
and s_id not in (select s_id from sc where c_id=02);
--11、查询没有学全所有课程的同学的信息
方法一:
SELECT stu.*
FROM stu
WHERE s_id not in (SELECT s1.s_id from
(select s_id from sc where c_id=01) as s1,
(select s_id from sc where c_id=02) as s2,
(select s_id from sc where c_id=03) as s3
WHERE s1.s_id=s2.s_id and s2.s_id=s3.s_id and s1.s_id=s3.s_id);
方法二:
select stu.*
from stu LEFT JOIN sc
on sc.s_id = stu.s_id
GROUP BY sc.s_id,stu.s_id,stu.s_name,stu.s_birth,stu.s_sex having COUNT(sc.c_id) < (select COUNT(*) from co)
--12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECT stu.*,c_id
FROM stu,sc
WHERE stu.s_id=sc.s_id
and sc.c_id in (select c_id from sc where sc.s_id=01)
and not stu.s_id=01;
--13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
SELECT * FROM stu WHERE s_id in
(SELECT s_id from sc where s_id not in
(SELECT s_id from sc where c_id not in (select c_id from sc where s_id='01'))
GROUP BY s_id
HAVING COUNT(*)=(SELECT COUNT(*) FROM sc where s_id='01') and s_id !='01');
--14、查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT stu.s_name
FROM stu,sc,te,co
WHERE stu.s_id=sc.s_id and sc.c_id=co.c_id and te.t_id=co.t_id
and stu.s_name not in (SELECT stu.s_name FROM stu,sc,te,co
where stu.s_id=sc.s_id and sc.c_id=co.c_id and te.t_id=co.t_id and te.t_name='张三')
GROUP BY stu.s_name
--15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT stu.s_id,stu.s_name,B.s_avg
FROM stu INNER JOIN
(SELECT s_id,AVG(score) as s_avg FROM sc WHERE score<60
GROUP BY s_id HAVING COUNT(distinct c_id)>=2) as B
ON stu.s_id=B.s_id
--16、检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT stu.* FROM stu,sc
WHERE stu.s_id=sc.s_id and score<60 and c_id='01'
ORDER BY score desc
--17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT sc.*,s_avg FROM sc LEFT JOIN
(SELECT s_id,AVG(score) as s_avg FROM sc GROUP BY s_id) R
ON sc.s_id=R.s_id ORDER BY s_avg DESC
--18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT co.c_id '课程ID',co.c_name '课程name',
MAX(sc.score) as '最高分',
MIN(sc.score) as '最低分',
AVG(sc.score) as '平均分' ,
--SUM(CASE WHEN sc.score>=60 then 1 else 0 end)*1.0/COUNT(sc.c_id) as '及格率',
isnull(cast(SUM(CASE WHEN sc.score>=60 then 1 else 0 end)*1.0/COUNT(sc.c_id) as decimal(10,2)),0) as '及格率',
isnull(cast(SUM(CASE WHEN sc.score>=70 and sc.score<80 then 1 else 0 end)*1.0/COUNT(sc.c_id) as decimal(10,2)),0) as '中等率',
isnull(cast(SUM(CASE WHEN sc.score>=80 and sc.score<90 then 1 else 0 end)*1.0/COUNT(sc.c_id) as decimal(10,2)),0) as '优良率',
isnull(cast(SUM(CASE WHEN sc.score>=90 then 1 else 0 end)*1.0/COUNT(sc.c_id) as decimal(10,2)),0) as '优秀率'
FROM co LEFT JOIN sc ON co.c_id=sc.c_id
GROUP BY sc.c_id,co.c_id,co.c_name;
--19、按各科成绩进行排序,并显示排名
SELECT A.c_id,co.c_name,A.s_id,A.score,COUNT(B.score)+1 as rank
FROM co,sc as A LEFT JOIN sc as B ON A.score < B.score AND A.c_id = B.c_id
WHERE co.c_id=A.c_id
GROUP BY A.c_id,co.c_name,A.s_id,A.score ORDER BY A.c_id,rank ASC;
--20、查询学生的总成绩并进行排名
SELECT stu.s_name,SUM(sc.score) as s_SUM
FROM stu,sc
WHERE stu.s_id=sc.s_id
GROUP BY stu.s_name
ORDER BY s_SUM DESC;
--21、查询不同老师所教不同课程平均分从高到低显示
SELECT te.*,co.c_name,AVG(sc.score) as s_avg
FROM te,co,sc
WHERE te.t_id=co.t_id and co.c_id=sc.c_id
GROUP BY te.t_id,te.t_name,co.c_name
ORDER BY s_avg DESC;
--22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
SELECT stu.*,R.c_id,R.score,R.排名 FROM stu,
(SELECT *,RANK() OVER(PARTITION BY c_id ORDER BY score DESC) AS 排名 FROM sc) AS R
WHERE stu.s_id=R.s_id AND R.排名 BETWEEN 2 AND 3;
--23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
SELECT sc.c_id as '课程编号',co.c_name as '课程名称',
SUM(CASE WHEN sc.score<=100 and sc.score>85 THEN 1 ELSE 0 END) AS "100-85",
cast(SUM(CASE WHEN sc.score<=100 and sc.score>85 THEN 1 ELSE 0 END)*1.0/COUNT(sc.c_id)*100 as varchar) + '%' AS "100-85",
SUM(CASE WHEN sc.score<=85 and sc.score>70 THEN 1 ELSE 0 END) AS "85-70",
CAST(SUM(CASE WHEN sc.score<=85 and sc.score>70 THEN 1 ELSE 0 END)*1.0/COUNT(sc.c_id)*100 as varchar) + '%' AS "85-70",
SUM(CASE WHEN sc.score<=70 and sc.score>60 THEN 1 ELSE 0 END) AS "70-60",
CAST(SUM(CASE WHEN sc.score<=70 and sc.score>60 THEN 1 ELSE 0 END)*1.0/COUNT(sc.c_id)*100 as varchar) + '%' AS "70-60",
SUM(CASE WHEN sc.score<=60 and sc.score>0 THEN 1 ELSE 0 END) AS "0-60",
CAST(SUM(CASE WHEN sc.score<=60 and sc.score>0 THEN 1 ELSE 0 END)*1.0/COUNT(sc.c_id)*100 as varchar) + '%' AS "0-60"
FROM co,sc WHERE co.c_id=sc.c_id GROUP BY sc.c_id,co.c_name;
--24、查询学生平均成绩及其名次
SELECT stu.s_id,stu.s_name,AVG(sc.score) as s_avg,DENSE_RANK() over(order by AVG(sc.score) DESC) as s_rank
FROM stu,sc
WHERE stu.s_id=sc.s_id GROUP BY stu.s_id,stu.s_name order by s_avg DESC;
--25、查询各科成绩前三名的记录
SELECT *
FROM (SELECT *,DENSE_RANK() OVER(PARTITION BY c_id ORDER BY score DESC) as s_rank
FROM sc) as A
WHERE s_rank<=3;
--26、查询每门课程被选修的学生数
SELECT c_id,COUNT(s_id) as s_count
FROM sc GROUP BY c_id;
--27、查询出只有两门课程的全部学生的学号和姓名
SELECT stu.s_id,stu.s_name
FROM stu,sc
WHERE stu.s_id=sc.s_id GROUP BY stu.s_id,stu.s_name
HAVING COUNT(c_id)=2;
--28、查询男生、女生人数
SELECT stu.s_sex,COUNT(stu.s_sex) as sex_count
FROM stu GROUP BY stu.s_sex;
--29、查询名字中含有"风"字的学生信息
SELECT stu.* FROM stu
WHERE stu.s_name LIKE '%风%';
--30、查询同名同性学生名单,并统计同名人数
SELECT stu.s_name,stu.s_sex,COUNT(*)as s_count
FROM stu JOIN stu as A
ON A.s_id!=stu.s_id AND stu.s_name=A.s_name AND stu.s_sex=A.s_sex
GROUP BY stu.s_name,stu.s_sex;
--31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
SELECT stu.* FROM stu
WHERE s_birth LIKE '1990%';
或
SELECT stu.* FROM stu
WHERE YEAR(s_birth) = 1990;
--32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号
SELECT c_id,AVG(score) as '平均成绩'
FROM sc
GROUP BY c_id ORDER BY '平均成绩' DESC,c_id;
--33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
SELECT stu.s_id,stu.s_name,AVG(sc.score) as s_avg
FROM stu,sc
WHERE stu.s_id=sc.s_id GROUP BY stu.s_id,stu.s_name
HAVING AVG(sc.score)>=85;
--34、查询课程名称为"数学",且分数低于60的学生姓名和分数
SELECT stu.s_name,sc.score
FROM stu,sc,co
WHERE stu.s_id=sc.s_id AND sc.c_id=co.c_id AND co.c_name='数学' AND sc.score<60;
--35、查询所有学生的课程及分数情况;
SELECT stu.s_id,stu.s_name,sc.c_id,sc.score
FROM stu,sc WHERE stu.s_id=sc.s_id;
--36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT stu.s_name,co.c_name,sc.score
FROM stu,sc,co
WHERE stu.s_id=sc.s_id AND sc.c_id=co.c_id AND score>70;
--37、查询不及格的课程
SELECT * FROM sc WHERE score<60;
--38、查询课程编号为01且课程成绩在70分以上的学生的学号和姓名;
SELECT stu.s_id,stu.s_name
FROM stu,sc
WHERE stu.s_id=sc.s_id AND c_id='01' AND score>70;
--39、求每门课程的学生人数
SELECT sc.c_id,c_name,COUNT(sc.c_id) as '学生人数'
FROM sc,co
WHERE sc.c_id=co.c_id GROUP BY sc.c_id,c_name;
--40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT stu.*,score,A.s_rank
FROM stu,(SELECT s_id,c_id,score,DENSE_RANK() OVER(ORDER BY score DESC) AS s_rank
FROM sc WHERE c_id in
(SELECT c_id FROM co,te WHERE co.t_id=te.t_id AND t_name='张三')) as A
WHERE stu.s_id=A.s_id and s_rank=1;
--41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT DISTINCT A.s_id,A.c_id,A.score
FROM sc as A,sc as B
WHERE A.c_id!=B.c_id AND A.score=B.score;
--42、查询每门功课成绩最好的前两名
SELECT *
FROM (SELECT *,DENSE_RANK() OVER(PARTITION BY c_id ORDER BY score DESC) as s_rank
FROM sc) as A
WHERE s_rank <=2;
--43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT c_id as '课程号',COUNT(c_id) as '选修人数'
FROM sc
GROUP BY c_id
HAVING COUNT(c_id) > 5
ORDER BY COUNT(c_id) desc,c_id;
--44、检索至少选修两门课程的学生学号
SELECT s_id FROM sc
GROUP BY s_id
HAVING COUNT(s_id)>=2;
--45、查询选修了全部课程的学生信息
SELECT * FROM stu WHERE s_id IN(
SELECT s_id FROM sc
GROUP BY s_id
HAVING COUNT(c_id)=(SELECT COUNT(*) FROM co));
--46、查询各学生的年龄
SELECT s_id AS 学生编号,s_name AS 学生姓名,year(getdate())-year(s_birth) AS 年龄
FROM stu;
--47、查询本周过生日的学生
SELECT stu.*
FROM stu
WHERE DATEADD(WK, DATEDIFF(WK, 0, GETDATE()), 0)=DATEADD(WK, DATEDIFF(WK, 0, s_birth), 0);
--48、查询下周过生日的学生
SELECT stu.*
FROM stu
WHERE DATEADD(WK, DATEDIFF(WK, 0, GETDATE())+1, 0)=DATEADD(WK, DATEDIFF(WK, 0, s_birth), 0);
--49、查询本月过生日的学生
SELECT stu.*
FROM stu
WHERE month(GETDATE())=month(s_birth);
--50、查询下月过生日的学生
SELECT stu.*
FROM stu
WHERE month(GETDATE())+1=month(s_birth);
来源:oschina
链接:https://my.oschina.net/u/4487084/blog/4405763