MySQL查询语句练习50题+答案

50题目录

    • 首先分别建表和插入数据
    • 1、查询“001”课程比“002”课程成绩高的所有学生的学号;
    • 2、查询平均成绩大于60分的同学的学号和平均成绩;
    • 3、查询所有同学的学号、姓名、选课数、总成绩;
    • 4、查询姓“李”的老师的个数;
    • 5、查询没学过“叶平”老师课的同学的学号、姓名;
    • 6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
    • 7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
    • 8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
    • 9、查询所有课程成绩小于60分的同学的学号、姓名; #注意关键词所有课程,可以采用逆向思维
    • 10、查询没有学全所有课的同学的学号、姓名;
    • 11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
    • 12、查询与“1001”同学所学课程相同的其他同学学号和姓名;
    • 13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
    • 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
    • 15、删除学习“叶平”老师课的SC表记录;
    • 16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、’002’号课的平均成绩;
    • 17、按平均成绩从高到低显示所有学生的“JAVA”、“C#”、“C++”三门的课程成绩,按如下形式显示: 学生ID,,C#,C++,JAVA,有效课程数,有效平均分
    • 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
    • 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 ;
    • 20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
    • 21、查询不同老师所教不同课程平均分从高到低显示
    • 22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004) [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
    • 23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
    • 24、查询学生平均成绩及其名次
    • 25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
    • 26、查询每门课程被选修的学生数
    • 27、查询出只选修了一门课程的全部学生的学号和姓名
    • 28、查询男生、女生人数
    • 29、查询姓“张”的学生名单
    • 30、查询同名同性学生名单,并统计同名人数
    • 31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
    • 32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
    • 33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
    • 34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
    • 35、查询所有学生的选课情况;
    • 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
    • 37、查询不及格的课程,并按课程号从大到小排列
    • 38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
    • 39、求选了课程的学生人数
    • 40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
    • 41、查询各个课程及相应的选修人数
    • 42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
    • 43、查询每门功成绩最好的前两名
    • 44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
    • 45、检索至少选修两门课程的学生学号
    • 46、查询全部学生都选修的课程的课程号和课程名
    • 47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
    • 48、查询两门以上不及格课程的同学的学号及其平均成绩
    • 49、检索“004”课程分数小于60,按分数降序排列的同学学号
    • 50、删除“002”同学的“001”课程的成绩

需要用的表的信息如下:
1.学生表:student(编号sid,姓名sname,年龄sage,性别ssex)
2.课程表:course(课程编号cid,课程名称cname,教师编号tid)
3.成绩表:sc(学生编号sid,课程编号cid,成绩score)
4.教师表:teacher(教师编号tid,姓名tname)

首先分别建表和插入数据

student表

create table Student(SId varchar(10),Sname varchar(10),Sage varchar(10),Ssex varchar(10));
insert into Student values('1001' , '张三' , '19' , '男');
insert into Student values('1002' , '李四' , '20' , '女');
insert into Student values('1003' , '王五' , '21' , '男');
insert into Student values('1004' , '马六' , '19' , '女');
insert into Student values('1005' , '孙七' , '22' , '女');
insert into Student values('1006' , '钱八' , '18' , '男');
insert into Student values('1007' , '赵九' , '23' , '女');
insert into Student values('1008' , '罗晶晶' , '21' , '女');

course表

create table Course(CId varchar(10),Cname varchar(10),TId varchar(10));
insert into Course values('001' , 'PHP' , '1');
insert into Course values('002' , 'C#' , '1');
insert into Course values('003' , 'C++' , '2');
insert into Course values('004' , 'JAVA' , '3');
insert into Course values('005' , 'Python' , '4');
insert into Course values('006' , 'R' , '5');
insert into Course values('007' , 'HTML' , '6');

teacher表

create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('1' , '叶平');
insert into Teacher values('2' , '李浩然');
insert into Teacher values('3' , '胡平原');
insert into Teacher values('4' , '朱清时');
insert into Teacher values('5' , '赛先生');
insert into Teacher values('6' , '宋三东');

sc表

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('1001' , '001' , 89);
insert into SC values('1002' , '001' , 80);
insert into SC values('1003' , '001' , 30);
insert into SC values('1004' , '001' , 78);
insert into SC values('1005' , '001' , 68);
insert into SC values('1006' , '001' , 93);
insert into SC values('1007' , '001' , 62);
insert into SC values('1001' , '002' , 67);
insert into SC values('1002' , '002' , 86);
insert into SC values('1003' , '002' , 67);
insert into SC values('1004' , '002' , 77);
insert into SC values('1005' , '002' , 66);
insert into SC values('1006' , '002' , 84);
insert into SC values('1007' , '002' , 72);

insert into SC values('1001' , '003' , 82);
insert into SC values('1002' , '003' , 85);
insert into SC values('1003' , '003' , 32);
insert into SC values('1004' , '003' , 73);
insert into SC values('1005' , '003' , 64);
insert into SC values('1006' , '003' , 87);
insert into SC values('1007' , '003' , 77);
insert into SC values('1008' , '003' , 94);

insert into SC values('1001' , '004' , 39);
insert into SC values('1002' , '004' , 80);
insert into SC values('1003' , '004' , 80);
insert into SC values('1004' , '004' , 88);
insert into SC values('1005' , '004' , 68);
insert into SC values('1006' , '004' , 59);
insert into SC values('1007' , '004' , 42);
insert into SC values('1008' , '004' , 64);

insert into SC values('1001' , '005' , 89);
insert into SC values('1002' , '005' , 70);
insert into SC values('1003' , '005' , 60);
insert into SC values('1004' , '005' , 58);
insert into SC values('1005' , '005' , 38);
insert into SC values('1006' , '005' , 89);
insert into SC values('1007' , '005' , 72);
insert into SC values('1008' , '005' , 64);

insert into SC values('1001' , '006' , 49);
insert into SC values('1002' , '006' , 90);
insert into SC values('1003' , '006' , 70);
insert into SC values('1004' , '006' , 48);
insert into SC values('1005' , '006' , 98);
insert into SC values('1006' , '006' , 59);
insert into SC values('1007' , '006' , 72);
insert into SC values('1008' , '006' , 74);

insert into SC values('1001' , '007' , 100);
insert into SC values('1002' , '007' , 99);
insert into SC values('1003' , '007' , 89);
insert into SC values('1004' , '007' , 88);
insert into SC values('1005' , '007' , 78);
insert into SC values('1006' , '007' , 99);
insert into SC values('1007' , '007' , 82);

1、查询“001”课程比“002”课程成绩高的所有学生的学号;

select a.sid from 
 (select sid,score from SC where cid='001') a,
 (select sid,score from SC where cid='002') b
  where a.score>b.score and a.sid=b.sid;

2、查询平均成绩大于60分的同学的学号和平均成绩;

select sid ,avg(score) from sc 
group by sid having avg(score)>60;

3、查询所有同学的学号、姓名、选课数、总成绩;

select student.sid,student.sname,count(sc.cid),sum(score)
from student left outer join sc on student.sid=sc.sid
group by student.sid,sname;

4、查询姓“李”的老师的个数;

#需要去重
select count(distinct(tname))
from teacher where tname like '李%';

5、查询没学过“叶平”老师课的同学的学号、姓名;

select student.sid,student.sname
from student
where sid not in (select distinct(sc.sid) from sc,course,teacher
				  where sc.cid=course.cid and
				  teacher.tid=course.tid and     
				  teacher.tname='叶平');

6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

select student.sid,student.sname 
from student,sc 
where student.sid=sc.sid 
      and sc.cid='001' 
	  and exists (select * from sc as sc2 where sc2.sid=sc.sid 
	   			  and sc2.cid='002');

7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

select sid,sname from student
where sid in (select sid from sc,course,teacher where sc.cid=course.cid
			  and teacher.tid=course.tid and teacher.tname='叶平'
			  group by sid having count(sc.cid)=
				 (select count(cid) from course,teacher
				  where teacher.tid=course.tid and tname='叶平'));

8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

select sid,sname 
from (select student.sid,student.sname,score,
			(select score from sc sc2 
			 where sc2.sid=student.sid 
			 and sc2.cid='002') score2 
	  from student,sc 
	  where student.sid=sc.sid and cid='001') sc3 
where score2<score;

9、查询所有课程成绩小于60分的同学的学号、姓名; #注意关键词所有课程,可以采用逆向思维

select sid,sname from student 
 	where sid not in 
   					(select student.sid from student,sc 
   					 where student.sid=sc.sid and score>60);

10、查询没有学全所有课的同学的学号、姓名;

select student.sid,student.sname
from student,sc
where student.sid=sc.sid 
group by student.sid,student.sname having count(cid)<(select count(cid)from course);

11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;

#写法一
select sid,sname from student
where sid in 
		(select distinct sid from sc where cid in (select cid from sc where sid='1001'));

#写法二
select distinct st.sid,sname from student st 
	inner join sc on st.sid=sc.sid
	where sc.cid in (select cid from sc where sid='1001');

12、查询与“1001”同学所学课程相同的其他同学学号和姓名;

select distinct  sc.sid,sname
    from student, sc
    where student.sid= sc.sid 
          and  cid in (select cid from  sc where  sid='1001');

13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;

 update sc set score=(select avg( sc_2.score)
    				  from sc sc_2
     				  where sc_2.cid= sc.cid ) 
     	from course,teacher 
     	where course.cid= sc.cid 
     	and course.tid=teacher.tid 
     	and teacher.tname='叶平');

14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;

select sid from sc where cid in 
  						(select cid from sc where sid='1002')
   						 group by sid having count(*)=
   						 		  (select count(*) from sc where  sid='1002');

15、删除学习“叶平”老师课的SC表记录;

delete sc
    from course,teacher,sc
    where course.cid= sc.cid 
    and course.tid= teacher.tid 
    and tname='叶平';

16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、’002’号课的平均成绩;

insert sc select sid,'002',
		(select avg(score)from sc where cid='002') 
from student where sid not in 
		(select sid from  sc where cid='002');

17、按平均成绩从高到低显示所有学生的“JAVA”、“C#”、“C++”三门的课程成绩,按如下形式显示: 学生ID,C#,C++,JAVA,有效课程数,有效平均分

select sid as 学生id
        ,(select  score from  sc where  sc.sid=t.sid and  cid='004') as 数据库
        ,(select  score from  sc where  sc.sid=t.sid and  cid='001') as 企业管理
        ,(select  score from  sc where  sc.sid=t.sid and  cid='006') as 英语
        ,count(*) as 有效课程数, avg(t.score) as 平均成绩
    from  sc as t
    group by sid
    order by avg(t.score) ;

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

select l.cid as 课程id,l.score as 最高分,r.score as 最低分
    from  sc l , sc as r
    where l.cid = r.cid and
        l. score = (select max(il.score)
                      from  sc as il,student as im
                      where l.cid = il.cid and im. sid=il.sid
                      group by il.cid)
        and r. score = (select min(ir.score)
                      from  sc as ir
                      where r.cid = ir.cid
                      group by ir.cid );

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 ;

select t.cid as 课程号,
	max(course.cname)as 课程名,
	isnull(avg(score),0) as 平均成绩,
	100 * sum(case when isnull(score,0)>=60 then 1 else 0 
								end)/count(*) as 及格百分数
    from  sc teac,course
    where t.cid=course.cid
    group by t.cid
    order by 100 * sum(case when isnull(score,0)>=60 then 1 
    									 else 0 end)/count(*) desc;

20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)

 select sum(case when  cid ='001' then  score else 0 end)/sum(case  cid when '001' then 1 else 0 end) as 企业管理平均分
        ,100 * sum(case when  cid ='001' and  score >= 60 then 1 else 0 end)/sum(case when  cid ='001' then 1 else 0 end) as 企业管理及格百分数
        ,sum(case when  cid ='002' then  score else 0 end)/sum(case  cid when '002' then 1 else 0 end) as 马克思平均分
        ,100 * sum(case when  cid ='002' and  score >= 60 then 1 else 0 end)/sum(case when  cid ='002' then 1 else 0 end) as 马克思及格百分数
        ,sum(case when  cid ='003' then  score else 0 end)/sum(case  cid when '003' then 1 else 0 end) as uml平均分
        ,100 * sum(case when  cid ='003' and  score >= 60 then 1 else 0 end)/sum(case when  cid ='003' then 1 else 0 end) as uml及格百分数
        ,sum(case when  cid ='004' then  score else 0 end)/sum(case  cid when '004' then 1 else 0 end) as 数据库平均分
        ,100 * sum(case when  cid ='004' and  score >= 60 then 1 else 0 end)/sum(case when  cid ='004' then 1 else 0 end) as 数据库及格百分数
  from  sc;

21、查询不同老师所教不同课程平均分从高到低显示

select max(z.tid) as 教师id,
	   max(z.tname) as 教师姓名,c.cid as 课程id,
	   max(c.cname) as 课程名称,
	   avg(score) as 平均成绩
    from  sc as t,course as c ,teacher as z
    where t.cid=c.cid and c.tid=z.tid
    group by c.cid
    order by avg(score) desc; 

22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004) [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩

select  distinct top 3
      sc.sid as 学生学号,
      student.sname as 学生姓名 ,
      t1.score as 企业管理,
      t2.score as 马克思,
      t3.score as uml,
      t4.score as 数据库,
      isnull(t1.score,0) + isnull(t2. score,0) + isnull(t3. score,0) + isnull(t4.score,0) as 总分
      from student, sc  left join  sc as t1
                      on  sc.sid = t1.sid and t1.cid = '001'
            left join  sc as t2
                      on  sc.sid = t2.sid and t2.cid = '002'
            left join  sc as t3
                      on  sc.sid = t3.sid and t3.cid = '003'
            left join  sc as t4
                      on  sc.sid = t4.sid and t4.cid = '004'
      where student. sid= sc.sid and
      isnull(t1.score,0) + isnull(t2.score,0) + isnull(t3.score,0) + isnull(t4.score,0)
      not in
      (select distinct
            top 15 with ties
            isnull(t1.score,0) + isnull(t2.score,0) + isnull(t3.score,0) + isnull(t4.score,0)
      from  sc
            left join  sc as t1
                      on  sc.sid = t1.sid and t1.cid = 'k1'
            left join  sc as t2
                      on  sc.sid = t2.sid and t2.cid = 'k2'
            left join  sc as t3
                      on  sc.sid = t3.sid and t3.cid = 'k3'
            left join  sc as t4
                      on  sc.sid = t4.sid and t4.cid = 'k4'
      order by isnull(t1.score,0) + isnull(t2.score,0) + isnull(t3.score,0) + isnull(t4.score,0) desc);

23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]

select  sc.cid as 课程id, cname as 课程名称
        ,sum(case when  score between 85 and 100 then 1 else 0 end) as [100 - 85]
        ,sum(case when  score between 70 and 85 then 1 else 0 end) as [85 - 70]
        ,sum(case when  score between 60 and 70 then 1 else 0 end) as [70 - 60]
        ,sum(case when  score < 60 then 1 else 0 end) as [60 -]
    from sc,course
    where sc.cid=course.cid
    group by sc.cid,cname;

24、查询学生平均成绩及其名次

select 1+(select count(distinct 平均成绩)
       from (select sid,avg(score) as 平均成绩
             from  sc
             group by sid) as t1
       where 平均成绩>t2.平均成绩) as 名次,
       sid as 学生学号,平均成绩
       from (select sid,avg(score) 平均成绩
            from  sc
            group by sid) as t2
       order by 平均成绩 desc;

25、查询各科成绩前三名的记录:(不考虑成绩并列情况)

  select t1.sid as 学生id,t1.cid as 课程id, score as 分数
      from  sc t1
      where score in (select top 3 score
             		  from sc
              	      where t1.cid= cid
             		  order by score de sc)
      order by t1.cid;

26、查询每门课程被选修的学生数

 select  cid,count(sid) from sc group by cid;

27、查询出只选修了一门课程的全部学生的学号和姓名

 select  sc.sid,student.sname,count(cid) as 选课数
 	from sc,student
 	where  sc.sid=student.sid 
 	group by sc.sid,student.sname having count(cid)=1;

28、查询男生、女生人数

select count(ssex) as 男生人数 
	from student 
	group by ssex having ssex='男';
	
select count(ssex) as 女生人数 
	from student
	group by ssex having ssex='女'

29、查询姓“张”的学生名单

select sname from student where sname like '张%';

30、查询同名同性学生名单,并统计同名人数

select sname,count(*) 
	from student 
	group by sname having count(*)>1;

31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)

select sname,convert(char (11),datepart(year,sage)) as age
    from student
    where  convert(char(11),datepart(year,sage))='1981';

32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

select  cid,avg(score) 
	from  sc 
	group by cid order by avg(score),cid desc ;

33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

select sname,sc.sid,avg(score)
    from student,sc
    where student.sid= sc.sid 
    group by sc.sid,sname having avg(score)>85;

34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数

select sname,isnull(score,0)
    from student,sc,course
    where  sc.sid=student.sid 
    and  sc.cid=course.cid 
    and  course.cname='数据库'
    and  score<60; 

35、查询所有学生的选课情况;

select  sc.sid, sc.cid,sname,cname
    from  sc,student,course
    where  sc.sid=student.sid 
    and  sc.cid=course.cid ;

36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;

select  distinct student.sid,student.sname,sc.cid, sc.score
    from student, sc
    where  sc.score>=70 
    and  sc.sid=student.sid;

37、查询不及格的课程,并按课程号从大到小排列

select cid from sc where score<60 order by cid ;

38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;

select  sc.sid,student.sname 
	from  sc,student 
	where  sc.sid=student.sid 
	and  score>80 
	and  cid='003';

39、求选了课程的学生人数

select count(*) from sc;

40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩

select student.sname,score
    from student, sc,course c,teacher
    where student.sid= sc.sid 
    and sc.cid=c.cid and c.tid=teacher.tid 
    and teacher.tname='叶平' 
    and sc.score=(select max(score)from sc where cid=c.cid );

41、查询各个课程及相应的选修人数

select count(*) from sc group by  cid;

42、查询不同课程成绩相同的学生的学号、课程号、学生成绩

select distinct  a.sid,b.score 
	from  sc a,sc b 
	where a.score=b. score and a.cid <>b.cid ;

43、查询每门功成绩最好的前两名

select t1.sid as 学生id,t1.cid as 课程id, score as 分数
      from  sc t1
      where  score in (select top 2  score
              from  sc
              where t1.cid= cid
              order by score desc)
      order by t1.cid;

44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列

select  cid as 课程号,count(*) as 人数
    from   sc 
    group  by  cid
    order  by  count(*) desc,cid;

45、检索至少选修两门课程的学生学号

select  sid 
    from  sc 
    group  by sid having count(*)>= 2;

46、查询全部学生都选修的课程的课程号和课程名

select  cid,cname 
    from  course 
    where  cid  in (select cid from sc group by cid);

47、查询没学过“叶平”老师讲授的任一门课程的学生姓名

select sname from student 
where  sid not in 
				(select sid from course,teacher,sc 
				 where course.tid=teacher.tid 
				 and sc.cid=course.cid and tname='叶平');

48、查询两门以上不及格课程的同学的学号及其平均成绩

select  sid,avg(isnull(score,0)) from  sc 
	where sid in 
				(select sid from sc 
				where score <60 
				group by sid having count(*)>2)
	group by sid;

49、检索“004”课程分数小于60,按分数降序排列的同学学号

select sid from sc where cid='004'
                   and score <60 order by  score de sc; 

50、删除“002”同学的“001”课程的成绩

delete from  sc where  sid='002'and  cid='001';

你可能感兴趣的:(#,MySQL,mysql,数据库,sql)