SQL练习题50道

流过昼夜 提交于 2020-07-28 10:56:36

 --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);

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!