50道MYSQL练习题目前题目好像有好几个题目版本,本版本前的前18题相较于后半部分难度明显会有提升,部分答案并非最优选择,仅供参考。同时部分答案涉及GROUP BY若提示sql_mode=only_full_group_by的错误,原因为MYSQL5.7及以上版本开启了 only_full_group_by 模式,导致原有的GROUP BY语句报错,具体解决方法本文不做赘述。
1.学生表
Student(SId,Sname,Sage,Ssex)
SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
2.课程表
Course(CId,Cname,TId)
CId 课程编号,Cname 课程名称,TId 教师编号
3.教师表
Teacher(TId,Tname)
TId 教师编号,Tname 教师姓名
4.成绩表
SC(SId,CId,score)
SId 学生编号,CId 课程编号,score 分数
学生表 Student
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');
科目表 Course
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
教师表 Teacher
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
成绩表 SC
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);
SELECT * FROM student RIGHT JOIN
(SELECT t1.sid,cldone_score,cldtwo_score FROM
(SELECT sid,score as cldone_score FROM sc WHERE CId='01') as t1,
(SELECT sid,score as cldtwo_score FROM sc WHERE CId='02') as t2
WHERE t1.cldone_score>t2.cldtwo_score AND t1.SId=t2.SId)r
ON student.SId=r.SId;
1.1 查询同时存在" 01 “课程和” 02 "课程的情况
SELECT * FROM(
(SELECT * FROM sc WHERE CId='01') AS t1,
(SELECT * FROM sc WHERE CId='02') AS t2
) WHERE t1.SId=t2.SId;
1.2 查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
SELECT * FROM
(SELECT * FROM sc WHERE CId='01') AS t2
RIGHT JOIN
(SELECT * FROM sc WHERE CId='02') AS t1
on t1.SId=t2.SId;
1.3 查询不存在" 01 “课程但存在” 02 "课程的情况
SELECT * FROM sc
WHERE sc.SId NOT in (SELECT SId FROM sc
WHERE sc.CId = '01')
AND sc.CId = '02';
SELECT student.SId,Sname,ss FROM student,
(SELECT SId,AVG(score) as ss FROM sc
GROUP BY SId
HAVING AVG(score)>60
) r
WHERE student.SId=r.SId;
SELECT student.* ,sc.score FROM
student,sc
WHERE student.SId=sc.SId;
SELECT student.SId,Sname,r.sum,r.count FROM (
SELECT SID,SUM(score) as sum,COUNT(SId) as count
FROM sc
GROUP BY SId)r
RIGHT JOIN student
on student.SId = r.SID;
4.1 查有成绩的学生信息
SELECT * FROM student
WHERE EXISTS(
select sc.sid from sc
WHERE student.sid = sc.sid)
或
select * from student
where student.sid in (select sc.sid from sc);
SELECT COUNT(TId) FROM
(SELECT * FROM teacher WHERE Tname LIKE '李%')r
GROUP BY r.Tid;
或
select count(*)
from teacher
where tname like '李%';
SELECT student.* FROM sc,course,student,teacher
WHERE
student.SId=sc.SId
and course.TId=teacher.TId
and sc.CId=course.CId
AND Tname='张三';
SELECT student.* FROM student
WHERE SId NOT in (
SELECT SId FROM sc
GROUP BY SId
HAVING COUNT(SId) =
(SELECT COUNT(CId) FROM course));
SELECT student.* FROM student
WHERE SId in(
SELECT SId FROM sc
WHERE CId in(
SELECT CId FROM sc WHERE SId='01'));
select sid
from student
where not exists (select 1 from (select cid from sc where sid='01') b
where not exists(select 1 from sc
where sc.sid=student.sid and sc.cid=b.cid));
SELECT student.* FROM student
WHERE SId not in(
SELECT SId FROM sc WHERE CId in(
SELECT course.CId FROM teacher,course
WHERE Tname='张三' AND course.TId=teacher.TId));
select student.SId,student.Sname,avg
from student RIGHT JOIN
(select sid,AVG(score) as avg from sc
where sid in
(select sid from sc where score<60 GROUP BY sid HAVING count(score)>1)
GROUP BY sid) b
on student.sid=b.sid;
SELECT student.* FROM student,(
SELECT SId FROM(SELECT * FROM sc
WHERE CId='01'
ORDER BY score)tem
WHERE tem.score<60)r
WHERE student.SId=r.SId;
或
select student.*, sc.score from student,sc
WHERE student.SId=sc.SId
AND score<60
AND CId='01'
ORDER BY score;
SELECT sc.*,t1.avg FROM sc RIGHT JOIN
(SELECT sid,AVG(score) as avg FROM sc
GROUP BY SId) as t1
on t1.SId=sc.SId
ORDER BY t1.avg DESC;
SELECT cid,
MAX(score) as max,
MIN(score) as min,
AVG(score) as avg,
COUNT(CId) as Count,
sum(CASE when sc.score>=60 THEN 1 ELSE 0 END)/COUNT(*) as jige,
sum(CASE WHEN sc.score>=70 and sc.score<80 THEN 1 ELSE 0 END)/COUNT(*) as zhongdeng,
sum(CASE WHEN sc.score>=80 AND sc.score<90 THEN 1 ELSE 0 END)/COUNT(*) as youliang,
SUM(CASE WHEN sc.score>=90 THEN 1 ELSE 0 END)/COUNT(*) as youxiu
FROM sc
GROUP BY CId
ORDER BY count DESC,sc.CId asc;
SELECT a.cid,a.SId,a.score,COUNT(b.score)+1 as rank
FROM sc as a LEFT JOIN sc b
on a.score<b.score AND a.CId=b.CId
GROUP BY a.CId,a.SId,a.score
ORDER BY a.CId,rank asc;
set @crank=0;
SELECT tmp.SId,tmp.total,@crank := @crank +1 as rank FROM
(SELECT sc.SId,SUM(sc.score) as total FROM sc
GROUP BY SId
ORDER BY total DESC)tmp;
select course.cname, course.cid,
sum(case when sc.score<=100 and sc.score>85 then 1 else 0 end) as "[100-85]",
CONCAT(sum(case when sc.score<=100 and sc.score>85 then 1 else 0 end)/COUNT(*)*100,'%') as "[100-85]百分比",
sum(case when sc.score<=85 and sc.score>70 then 1 else 0 end) as "[85-70]",
CONCAT(sum(case when sc.score<=85 and sc.score>70 then 1 else 0 end)/COUNT(*)*100,'%') as "[85-70]百分比]" ,
sum(case when sc.score<=70 and sc.score>60 then 1 else 0 end) as "[70-60]",
CONCAT(sum(case when sc.score<=70 and sc.score>60 then 1 else 0 end)/COUNT(*)*100,'%') as "[70-60]百分比",
sum(case when sc.score<=60 and sc.score>0 then 1 else 0 end) as "[60-0]",
CONCAT(sum(case when sc.score<=60 and sc.score>0 then 1 else 0 end)/COUNT(*)*100,'%') as "[60-0]百分比"
from sc left join course
on sc.cid = course.cid
group by sc.cid;
select * from sc
where (select count(*) from sc as a
where sc.cid = a.cid and sc.score<a.score )< 3
order by cid asc, sc.score desc;
SELECT cid,COUNT(SId) as total FROM sc
GROUP BY CId;
SELECT student.SId,student.Sname,temp.total FROM student,(
SELECT sid,COUNT(CId) as total FROM sc
GROUP BY SId)temp
WHERE temp.total=2 AND student.SId=temp.Sid;
或
select student.sid, student.sname from student
where student.sid in
(select sc.sid from sc
group by sc.sid
having count(sc.cid)=2);
select ssex, count(*) from student
group by ssex;
SELECT * FROM student
WHERE Sname LIKE('%风%');
SELECT sname,COUNT(*) FROM student
GROUP BY Sname
HAVING count(*)>1;
SELECT * FROM student
WHERE YEAR(Sage)=1990;
SELECT * FROM
(SELECT cid,AVG(score) as cidavg FROM sc
GROUP BY CId) as temp ORDER BY cidavg,cid asc;
select student.sid, student.sname, AVG(sc.score) as aver from student, sc
where student.sid = sc.sid
group by sc.sid
having aver > 85;
SELECT student.Sname,sc.cid,sc.score FROM course,sc,student
WHERE course.Cname='数学'
AND course.CId=sc.CId
AND student.SId=sc.SId
AND score<60;
SELECT student.sid,student.Sname,sc.CId,score FROM student LEFT JOIN sc
on student.SId=sc.SId;
SELECT student.Sname,course.CId,course.Cname,sc.score
FROM sc,course,student
WHERE sc.score>70
AND sc.CId=course.CId
AND sc.SId=student.SId;
SELECT CId,score FROM sc
WHERE sc.score<60
GROUP BY CId;
SELECT student.SId,student.Sname FROM sc,student
WHERE CId='01'
AND sc.score>=80
AND sc.SId=student.SId;
SELECT cid,count(SId) as count FROM sc
GROUP BY CId;
SELECT student.*,sc.score,sc.CId FROM sc,student,teacher,course
WHERE teacher.Tname='张三'
AND teacher.TId=course.TId
AND course.CId=sc.CId
AND student.SId=sc.SId
HAVING max(sc.score);
select student.*, sc.score, sc.cid from student, teacher, course,sc
where teacher.tname = "张三"
AND teacher.tid = course.tid
AND sc.sid = student.sid
AND sc.cid = course.cid
AND sc.score=(select Max(sc.score)
from sc,student, teacher, course
where teacher.tid = course.tid
and sc.sid = student.sid
and sc.cid = course.cid
and teacher.tname = "张三");
SELECT a.CId,a.SId,a.score FROM sc as a INNER JOIN sc as b
ON a.SId=b.SId
AND a.CId!=b.CId
AND a.score=b.score
GROUP BY CId,SId;
select a.sid,a.cid,a.score from sc as a
left join sc as b
on a.cid = b.cid and a.score<b.score
group by a.cid, a.sid
having count(b.cid)<2
order by a.cid;
SELECT cid,COUNT(SId) FROM sc
GROUP BY CId
HAVING COUNT(SId)>5;
SELECT sid,COUNT(SId) as two FROM sc
GROUP BY SId
HAVING two>=2;
select student.* from sc ,student
where sc.SId=student.SId
GROUP BY sc.SId
HAVING count(*) = (select DISTINCT count(*) from course );
SELECT sid,YEAR(NOW())-YEAR(Sage) as age
FROM student;
select student.SId as stu_id,student.Sname as stu_name,
TIMESTAMPDIFF(YEAR,student.Sage,CURDATE()) as age #时间差函数TIMESTAMPDIFF
from student;
SELECT * FROM student
WHERE WEEKOFYEAR(Sage)=WEEKOFYEAR(CURDATE());
select *
from student
where WEEKOFYEAR(student.Sage)=WEEKOFYEAR(CURDATE())+1;
SELECT * FROM student
WHERE MONTH(Sage)=MONTH(CURDATE());
SELECT * FROM student
WHERE MONTH(Sage)=MONTH(CURDATE())+1;