MySQL面试题1

导读:本篇文章讲解 MySQL面试题1,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

0、创建表

create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10));
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' , '女');
create table Course(cid varchar(10),cname varchar(10),tid varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
create table Teacher(tid varchar(10),tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
create table SC(sid varchar(10),cid varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

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

SELECT DISTINCT t1.sid
from 
    (SELECT * from sc WHERE cid = '01') t1
left join  
    (SELECT * from sc WHERE cid = '02') t2 
on t1.sid = t2.sid 
WHERE t1.score > t2.score ;

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

SELECT sid, avg(score) as avg_sc
from sc 
group by sid
having avg(score)>60 ;

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

SELECT t1.sid 
,t1.sname 
,avg(t2.score) as avg_score
,count(DISTINCT t2.cid) as cid_count  
,sum(t2.score) as total_score
from student t1
left join sc t2
on t1.sid = t2.sid
group by t1.sid ,t1.sname ;

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

SELECT count(DISTINCT tid) as tch_cnt
from teacher
where  tname like '李%';

5、查询没学过“张三”老师课的同学的学号、姓名

SELECT sid ,sname
from student
where sid not in
(SELECT sc.sid
from teacher
left JOIN course
on teacher.tid = course.tid
left join sc
on course.cid = sc.cid
where teacher.tname = ‘张三’);
#6、查询学过“01”并且也学过编号“02”课程的同学的学号、姓名

SELECT DISTINCT student.sid ,student.sname
from student
left join sc
on sc.sid = student.sid
where sc.cid in (‘01’,‘02’);
#7、查询学过“张三”老师所教的课的同学的学号、姓名;

SELECT sid,sname
from student
where sid in
(SELECT sc.sid
from teacher
left join course
on teacher.tid = course.tid
left join sc
on course.cid = sc.cid
where teacher.tname = ‘张三’);
#8、查询课程编号“01”的成绩比课程编号“02”课程低的所有同学的学号、姓名;

SELECT DISTINCT t1.sid ,student.sname
from
(select sid , score from sc where cid =‘01’) t1
left JOIN
(select sid , score from sc where cid =‘02’) t2
on t1.sid = t2.sid
left join student
on student.sid =t1.sid
where t1.score < t2.score;
#9、查询所有课程成绩小于60分的同学的学号、姓名;

SELECT t2.sid , t1.sname
from student t1
RIGHT join
(select sid ,MAX(score)from sc GROUP BY sid HAVING MAX(score) <60) t2
on t1.sid = t2.sid;
#10.查询没有学全所有课的同学的学号、姓名;

SELECT student.sid ,COUNT(DISTINCT sc.cid) as course_cnt
from sc RIGHT JOIN student
on sc.sid = student.sid
GROUP BY student.sid
HAVING COUNT(DISTINCT sc.cid) < (SELECT COUNT(DISTINCT cid) from course);
#11、查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名;

SELECT t2.sid ,t1.sname
from student t1
RIGHT JOIN
(SELECT DISTINCT sid from sc where cid in
(SELECT cid from sc where sid = ‘01’)) t2
on t1.sid =t2.sid ;
#12、查询和”01″号的同学学习的课程完全相同的其他同学的学号和姓名

select t3.sid,student.sname
from student
RIGHT JOIN
(SELECT sid,COUNT(DISTINCT cid) as cid_cnt from sc t1 where cid in
(select cid from sc where sid = ‘01’)
GROUP BY sid
HAVING COUNT(DISTINCT cid) = (SELECT COUNT(DISTINCT cid) from sc t1 where t1.sid =‘01’))t3
on student.sid = t3.sid
where t3.sid <> ‘01’;
#13、把“SC”表中“张三”老师教的课的成绩都更改为此课程的平均成绩;

暂跳过
#14、查询没学过”张三”老师讲授的任一门课程的学生姓名

SELECT t2.sid,t2.sname
from student t2
where t2.sid not in
(select t1.sid as sid
from course ,teacher,sc,student t1
where course.tid = teacher.tid
and course.cid = sc.cid
and t1.sid =sc.sid
and teacher.tname = ‘张三’);
#15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT t1.sid ,student.sname,t1.平均成绩
from student
RIGHT JOIN
(SELECT sid , COUNT(IF(score<60,cid,null))as 不及格数,AVG(score) as 平均成绩
from sc
group by sid
HAVING 不及格数>=2) t1
on t1.sid =student.sid;
#16、检索”01″课程分数小于60,按分数降序排列的学生信息

SELECT t2.sid ,t2.cid,t2.score
from sc t2
where t2.sid in
(SELECT sid
from sc t1
where cid = ‘01’ and score<60)
order by t2.score desc ;
#17、按平均成绩从高到低显示所有学生的平均成绩

SELECT DISTINCT student.sid ,avg(sc.score) as score_avg
FROM sc RIGHT JOIN student
on student.sid = sc.sid
group by student.sid
ORDER BY avg(sc.score) desc ;
#18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率

SELECT
course.cid as 课程ID
,course.cname as 课程_name
,max(sc.score) as 最高分
,min(sc.score) as 最低分
,avg(sc.score) as 平均分
,count(if(sc.score >60,sc.sid,null))/count(sc.sid) as 及格率
from sc
RIGHT JOIN course
on course.cid = sc.cid
group by course.cid;
#19、按各科平均成绩从低到高和及格率的百分数从高到低顺序

SELECT
course.cid as 课程ID
,course.cname as 课程_name
,max(sc.score) as 最高分
,min(sc.score) as 最低分
,avg(sc.score) as 平均分
,count(if(sc.score >60,sc.sid,null))/count(sc.sid) as 及格率
from sc
RIGHT JOIN course
on course.cid = sc.cid
group by course.cid
ORDER BY avg(sc.score) DESC,count(if(sc.score >60,sc.sid,null))/count(sc.sid);
#20.查询学生的总成绩并进行排名

SELECT student.sid ,SUM(score)as 总成绩
from student
left join sc
on student.sid = sc.sid
group by student.sid
order by 总成绩 desc;
#21、查询不同老师所教不同课程平均分从高到低显示

SELECT teacher.tid ,teacher.cid,avg(score) as 平均分
from teacher
left join sc
on teacher.cid = sc.cid
group by teacher.tid,teacher.cid
order by 总成绩 desc;
#22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

SELECT cid ,sid,score,rank_num
from
(SELECT cid ,sid,score,rank() over(partition by cid order by score desc) as rank_num
from sc ) t
where rank_num in (2,3);
#23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比

select
sc.cid
,cname
,count(if(score between 85 and 100,sid,null))/count(sid) as ‘85-100占比’
,count(if(score between 70 and 85,sid,null))/count(sid) as ‘70-85占比’
,count(if(score between 60 and 70,sid,null))/count(sid) as ‘60-70占比’
,count(if(score between 0 and 60,sid,null))/count(sid) as ‘0-60占比’
from sc
left join course
on sc.cid=course.cid
group by sc.cid,cname
#24、查询学生平均成绩及其名次

select sid,avg_score,RANK()over(order by avg_score desc ) as rank_num
from
(select sid,avg(score) as avg_score
from sc
group by sid)t
group by sid;
#25、查询各科成绩前三名的记录

select cid,sid,score,rank_num
from
(select cid,sid,score,rank()over(partition by cid order by score desc) as rank_num
from sc
group by cid,sid)t
where rank_num <=3;
#26、查询每门课程被选修的学生数

select cid,count(DISTINCT sid) as sid_cnt
from sc
group by cid ;
#27、查询出只选修了一门课程的全部学生的学号和姓名

select sc.sid,sname,count(DISTINCT cid) as cid_cnt
from sc
left join student
on sc.sid = student.sid
group by sc.sid,sname
having count(DISTINCT cid) =1 ;
#28、查询男生、女生人数

SELECT ssex,COUNT(sid) as 人数
from student
group by ssex;
#29、查询名字中含有”风”字的学生信息

SELECT *
from student
where sname like ‘%风%’
#30、查询同名同性学生名单,并统计同名人数

select sname,count(DISTINCT sid) as 人数
from student
group by sname
having count(DISTINCT sid)>=2;
#31、查询1990年出生的学生名单

SELECT sid,sname,sage
from student
WHERE year(sage)=1990;
#32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

select cid , avg(score) as avg_score
from sc
group by cid
order by avg_score ,cid desc;
#33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

SELECT teacher.tid,course.cid,student.sid,sc.score
from teacher,course,sc,student
where teacher.tid = course.tid
and course.cid = sc.cid
and sc.sid = student.sid
and teacher.tname = ‘张三’
order by sc.score desc
limit 1;
#34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

SELECT sid , sname ,score,rank_num
FROM
(SELECT
teacher.tid
,course.cid
,student.sid
,student.sname
,sc.score
,DENSE_RANK()over(order by score desc ) as rank_num
from teacher,course,sc,student
where teacher.tid = course.tid
and course.cid = sc.cid
and sc.sid = student.sid
and teacher.tname = ‘张三’) t
where rank_num = 1;
#35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

select
distinct a.sid
, a.cid
,a.score
from sc a
join sc b
on a.cid != b.cid
and a.score = b.score
and a.sid != b.sid
group by a.sid ;
#36.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

select sname,cname,score
from sc,course,student
where sc.sid = student.sid
and sc.cid = course.cid
and sc.score >= 70
group by sname,cname,score;
#37、查询不及格的课程,并按课程号从大到小排列

select sname,cname,score,student.sid
from sc,course,student
where sc.sid = student.sid
and sc.cid = course.cid
and sc.score < 60
order by course.cid desc;
#38、查询课程编号为”01″且课程成绩在60分以上的学生的学号和姓名

select student.sid,sname,sc.cid,sc.score
from sc ,student
where sc.sid = student.sid
and sc.cid = ‘01’
and sc.score >60 ;
#39.每门课程的学生人数

select course.cid ,course.cname,count(sc.sid) as sid_cnt
from sc ,course
where sc.cid = course.cid
GROUP BY course.cid,course.cname;
#40、查询选修“张三”老师所授课程的学生中,成绩最高的学生姓名及其成绩

select sname,max(score)
from
(select t.tname,c.cname,s.sid,s.sname,sc.score
from sc,course as c,teacher as t,student as s
where sc.cid = c.cid
and t.tid = c.tid
and s.sid = sc.sid
and t.tname =‘张三’
order by score desc) t;
#42、查询每门功课成绩最好的前两名学生

SELECT cid,sid,score,rank_num
FROM
(select cid ,sid,score ,dense_rank()over(partition by cid order by score desc) as rank_num
from sc)t
where rank_num in (1,2) ;
#43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

select cid,count(sid) as sid_cnt
from sc
group by cid
having sid_cnt>5
order by count(sid) desc,cid ;
#44、检索至少选修两门课程的学生学号

select s.sid,count(DISTINCT cid) as cid_cnt
from student as s,sc
where s.sid = sc.sid
group by s.sid
having cid_cnt >= 2;
#45、查询选修了全部课程的学生信息

SELECT student.sid,t.cid_cnt,student.sname
FROM student
left JOIN
(SELECT s.sid,count(DISTINCT c.cid) as cid_cnt
FROM course as c ,sc,student as s
where c.cid = sc.cid
and sc.sid = s.sid
group by s.sid ) t
on student.sid = t.sid
having t.cid_cnt = (SELECT count(*) from course)
#46、查询各学生的年龄

SELECT
sid
,sage
,timestampdiff(year,sage,CURDATE())-1 as 年龄
FROM student;
#47、查询本周过生日的学生

SET @day =8-dayofweek(curdate());

SELECT *

FROM student

WHERE date_format(Sage, ‘%m%d’)

BETWEEN date_format(curdate(),‘%m%d’)

AND date_format (date_add(curdate(),interval @day day), ‘%m%d’);

48、查询下周过生日的学生

SELECT *
 
FROM student
 
WHERE date_format(sage, '%m%d') 
 
BETWEEN date_format (date_add(curdate(),interval @day day), '%m%d')
 
AND date_format (date_add(curdate(),interval @day+6 day), '%m%d');

49、查询本月过生日的学生

select sid ,sage ,month(sage)
from student
having month(sage) =month(CURDATE())

50、查询下月过生日的学生

select sid ,month(sage) 
from student
where month(sage)=month(DATE_ADD(CURDATE(),INTERVAL 1 month));

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/65581.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!