Mysql面试题(笔试基础)

108 篇文章 3 订阅

练习数据
数据表 --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-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('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2017-12-30' , '女');
insert into Student values('12' , '赵六' , '2017-01-01' , '女');
insert into Student values('13' , '孙七' , '2018-01-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);
练习题目
查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 1.1 查询同时存在" 01 "课程和" 02 "课程的情况 1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
查询在 SC 表存在成绩的学生信息
查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null ) 4.1 查有成绩的学生信息
查询「李」姓老师的数量
查询学过「张三」老师授课的同学的信息
查询没有学全所有课程的同学的信息
查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
查询没学过"张三"老师讲授的任一门课程的学生姓名
查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
检索" 01 "课程分数小于 60,按分数降序排列的学生信息
按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
查询各科成绩前三名的记录
查询每门课程被选修的学生数
查询出只选修两门课程的学生学号和姓名
查询男生、女生人数
查询名字中含有「风」字的学生信息
查询同名同性学生名单,并统计同名人数
查询 1990 年出生的学生名单
查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
查询不及格的课程
查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
求每门课程的学生人数
成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
查询每门功成绩最好的前两名
统计每门课程的学生选修人数(超过 5 人的课程才统计)。
检索至少选修两门课程的学生学号
查询选修了全部课程的学生信息
查询各学生的年龄,只按年份来算
按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
查询本周过生日的学生
查询下周过生日的学生
查询本月过生日的学生
查询下月过生日的学生 
参考答案
--1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
 
select * from
(select SC.SId, SC.score from SC where SC.CId = '01') as t1 inner join
(select SC.SId, SC.score from SC where SC.CId = '02') as t2 on t1.SId = t2.SId
where t1.score > t2.score
 
--1.1 查询同时存在" 01 "课程和" 02 "课程的情况
 
select * from
(select SC.SId, SC.score from SC where SC.CId = '01') as t1 inner join
(select SC.SId, SC.score from SC where SC.CId = '02') as t2 on t1.SId = t2.SId
 
--1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
 
select * from
(select SC.SId, SC.score from SC where SC.CId = '01') as t1 left join
(select SC.SId, SC.score from SC where SC.CId = '02') as t2 on t1.SId = t2.SId
 
-- 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
 
select * 
from sc
where SId not in (select SId from  sc where CId = '01') 
and CId = '02'
 
-- 2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
 
select t1.sid, t1.sname, t2.avgscore 
from student as t1 inner join (
select sc.sid, avg(sc.score) as avgscore from sc group by sc.sid 
having avgscore >= 60) as t2
on t1.sid = t2.sid
 
-- 3. 查询在 SC 表存在成绩的学生信息     注意⚠️DISTINCT⚠️关键字
 
select DISTINCT student.* 
from student, sc
where student.sid = sc.sid 
 
-- 4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)
 
select student.sid, student.sname, t1.coursecount, t1.sumscore
from student inner join (
select sc.sid, count(sc.cid) as coursecount, sum(sc.score) as sumscore from sc group by sc.sid) as t1
on student.sid = t1.sid
 
-- 4.1 查有成绩的学生信息    注意⚠️EXISTS⚠️关键字
 
select student.* 
from student 
where student.sid in (
select DISTINCT sc.sid from sc)
 
select *
from student
where EXISTS(select * from sc where student.SId=sc.SId)
 
-- 5. 查询「李」姓老师的数量
 
select count(*) 
from teacher
where teacher.Tname like '李%'
 
-- 6. 查询学过「张三」老师授课的同学的信息
 
select student.* 
from student, sc 
where student.sid = sc.sid 
and sc.cid in (select cid from course, teacher where course.tid = teacher.tid and Tname = '张三')
 
-- 同时连接多张表
select student.*
from teacher  ,course  ,student, sc
where teacher.Tname='张三'
and   teacher.TId=course.TId
and   course.CId=sc.CId
and   sc.SId=student.SId
 
-- 7. 查询没有学全所有课程的同学的信息
 
-- 这种解法不包括什么课都没选的学生
select student.* from student, (select sid, count(cid) as coursecount from sc group by sid) as t1
where student.sid = t1.sid 
and t1.coursecount<>3
 
select student.*
from sc ,student
where sc.SId=student.SId
GROUP BY sc.SId
Having count(*)<(select count(*) from course)
 
 
-- 利用笛卡尔积可以把什么课都没选的同学查询出来
select DISTINCT student.*
from 
(select student.SId,course.CId
from student,course ) as t1 LEFT JOIN (SELECT sc.SId,sc.CId from sc)as t2 on t1.SId=t2.SId and t1.CId=t2.CId,student
where t2.SId is null
and   t1.SId=student.SId
 
 
select student.* from student
where student.sid not in (
select student.sid from sc, student 
where sc.sid = student.sid
group by sid 
having count(*) = (select count(*) from course))
 
-- 8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
 
select DISTINCT student.* 
from sc, student
where sc.CId in (
select CId from sc where SId='01')
and sc.SId = student.SId
 
-- 9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
 
select DISTINCT student.*
from (
select student.SId, t.CId
from student ,(select sc.CId from sc where sc.SId='01') as t)
as t1 LEFT JOIN sc on t1.SId=sc.SId and t1.CId=sc.CId,student
where sc.SId is not null 
and t1.SId=student.SId
and t1.SId <>'01'
 
-- 10. 查询没学过"张三"老师讲授的任一门课程的学生姓名
 
 -- solution1
select * 
from student 
where student.SId not in (
select student.SId from (
select student.SId, t.CId from (
select course.CId from course, teacher 
where  course.TId = teacher.TId and teacher.Tname = '张三') as t, student) as t1 
right join sc on t1.SId=sc.SId and t1.CId=sc.CId, student
where t1.SId=student.SId)
 
-- solution2
select *
from student 
where student.SId not in 
(
    select student.SId
from student left join sc on student.SId=sc.SId 
where EXISTS 
(select *
from teacher ,course
where teacher.Tname='张三'
and   teacher.TId=course.TId
and     course.CId=sc.CId))
 
-- 11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
 
select student.SId, student.Sname, t2.avgscore
from student, (select sc.SId, avg(sc.score) as avgscore from sc group by sc.SId) as t2
where student.SId = t2.SId
and student.SId in (
select t1.SId from
(select * from sc
where sc.score < 60) as t1
group by t1.SId
having count(*) >= 2)
 
-- 12. 检索" 01 "课程分数小于60,按分数降序排列的学生信息
 
select student.*, t1.score from student, (
select * from sc 
where sc.CId = '01' and sc.score < 60) as t1
where student.SId = t1.SId
order by t1.score DESC
 
-- 13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
 
select sc.*, t1.avgscore from sc left join
(select sc.SId, avg(sc.score) as avgscore 
from sc group by sc.SId) as t1
on sc.SId = t1.SId
order by t1.avgscore DESC
 
-- 14. 查询各科成绩最高分、最低分和平均分: 以如下形式显示:
-- 课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 
-- 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
 
select sc.CId, max(sc.score) as '最高分', min(sc.score) as '最低分', avg(sc.score) as '平均分',
count(*) as '选修人数', sum(case when sc.score >= 60 then 1 else 0 end)/count(*) as '及格率',
sum(case when sc.score >= 70 and sc.score < 80 then 1 else 0 end)/count(*) as '中等率',
sum(case when sc.score >= 80 and sc.score < 90 then 1 else 0 end)/count(*) as '优良率',
sum(case when sc.score >= 90 then 1 else 0 end)/count(*) as '优秀率'
from sc 
group by sc.CId
order by count(*) DESC, sc.CId ASC
 
-- 15. 按各科成绩进行排序,并显示排名,Score 重复时保留名次空缺
 
SELECT *, RANK() OVER(PARTITION BY sc.cid ORDER BY sc.score DESC)排名
FROM sc;
 
-- 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
 
SELECT *, DENSE_RANK() OVER(PARTITION BY sc.cid ORDER BY sc.score DESC)排名
FROM sc;
 
-- 16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
 
SELECT sc.SId, RANK() OVER(ORDER BY sum(sc.score) DESC)排名, sum(sc.score) as sumscore
 
FROM sc
 
GROUP BY sc.SId
 
ORDER BY sumscore DESC;
 
 
-- 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
 
SELECT sc.SId, DENSE_RANK() OVER(ORDER BY sum(sc.score) DESC)排名, sum(sc.score) as sumscore
 
FROM sc
 
GROUP BY sc.SId
 
ORDER BY sumscore DESC;
 
 
-- 17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
 
select sc.CId, sum(case when sc.score >=85 then 1 else 0 end) as num_100_85,
sum(case when sc.score >=70 and sc.score <85 then 1 else 0 end) as num_85_70,
sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end) as num_70_60,
sum(case when sc.score < 60 then 1 else 0 end) as num_60_0,
sum(case when sc.score >=85 then 1 else 0 end)/count(*) as p_100_85,
sum(case when sc.score >=70 and sc.score <85 then 1 else 0 end) /count(*) as p_85_70,
sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end)/count(*) as p_70_60,
sum(case when sc.score < 60 then 1 else 0 end)/count(*) as p_60_0
from sc 
group by sc.CId
 
-- 18. 查询各科成绩前三名的记录
 
SELECT * 
 
FROM(
 
    SELECT *, RANK() OVER (PARTITION BY sc.CId ORDER BY sc.score) as r
 
    FROM sc) as A
 
WHERE A.r <= 3
 
 
-- 19. 查询每门课程被选修的学生数
SELECT sc.CId, COUNT(*)
 
FROM sc
 
GROUP BY(sc.CId)
 
 
-- 20. 查询出只选修两门课程的学生学号和姓名
 
SELECT DISTINCT student.SId, student.Sname 
 
FROM student, (
 
    SELECT sc.SId, COUNT(*) as a
 
    FROM sc
 
    GROUP BY(sc.SId)) as A
 
WHERE student.SId = A.SId
 
AND A.a = 2
 
 
 
SELECT Distinct student.Sid, student.Sname
 
FROM student 
 
where student.SId in (
 
SELECT sc.SId 
 
FROM sc
 
GROUP BY sc.SId
 
having count(*)=2)
 
 
-- 21. 查询男生、女生人数
 
SELECT Ssex, count(*)
 
FROM student
 
GROUP BY student.Ssex
 
-- 22. 查询名字中含有「风」字的学生信息
 
SELECT *
 
FROM student
 
WHERE student.sname LIKE '%风%';
 
 
-- 23. 查询同名同姓学生名单,并统计同名人数
 
SELECT Sname, count(*)
 
FROM student
 
GROUP BY Sname
 
HAVING COUNT(*) >1;
 
 
-- 24. 查询 1990 年出生的学生名单
 
SELECT *
 
FROM student
 
WHERE sage LIKE '1990-%';
 
-- 25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
 
SELECT sc.CId, avg(sc.score) as avgscore
 
FROM sc
 
GROUP BY sc.CId
 
ORDER BY avg(sc.score) DESC, sc.CId
 
-- 26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
 
SELECT student.Sid, student.Sname, t.avgscore
 
FROM student, (
 
    SELECT sc.SId, avg(sc.score) as avgscore
 
    FROM sc
 
    GROUP BY sc.SId) as t
 
WHERE student.SId = t.SId
 
AND t.avgscore >= 85
 
-- 27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
 
SELECT student.Sname, t.score
 
FROM student, (
 
    SELECT sc.SId, sc.score
 
    FROM sc 
 
    WHERE sc.score < 60
 
    AND sc.CId = (SELECT CId FROM course WHERE course.Cname='数学')) as t
 
WHERE student.SId = t.SId
 
-- 28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
 
SELECT st.*, sc.CId, sc.score
 
FROM student AS st
 
LEFT JOIN sc
 
ON st.SId = sc.SId
 
ORDER BY st.SId, sc.CId;
 
-- 29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
 
SELECT student.Sname, course.Cname, sc.score
 
FROM student, course, sc
 
WHERE student.SId = sc.SId
 
AND course.CId = sc.CId
 
AND sc.score > 70
 
ORDER BY sc.CId
 
-- 30.查询不及格的课程
 
SELECT sc.CId, sc.score
 
FROM sc
 
WHERE sc.score <60
 
ORDER BY sc.CId;
 
-- 31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
 
SELECT student.SId, student.Sname 
 
FROM student, sc
 
WHERE student.SId = sc.SId
 
AND sc.CId = '01'
 
AND sc.score > 80
 
-- 32.求每门课程的学生人数
 
SELECT sc.CId, count(sc.SId)
 
FROM sc
 
GROUP BY sc.CId
 
-- 33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
 
SELECT student.*, sc.score, sc.CId 
 
FROM student, sc
 
WHERE sc.CId = (SELECT course.CId 
 
FROM course, teacher
 
WHERE course.TId = teacher.TId
 
AND teacher.Tname = '张三')
 
AND student.SId = sc.SId
 
ORDER BY sc.score DESC
 
LIMIT 1
 
-- 34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
 
SELECT * FROM(
 
SELECT student.*, sc.score, sc.CId, DENSE_RANK() OVER (ORDER BY sc.score DESC)排名 
 
FROM student, sc
 
WHERE sc.CId = (SELECT course.CId 
 
FROM course, teacher
 
WHERE course.TId = teacher.TId
 
AND teacher.Tname = '张三')
 
AND student.SId = sc.SId) as t
 
WHERE t.排名='1'
 
-- 35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
 
 
SELECT sc.SId, sc.CId, sc.score
 
FROM sc
 
WHERE sc.score in (
 
SELECT score FROM(
 
SELECT sc.score, count(sc.score) as count_people
 
FROM sc
 
GROUP BY sc.score) A
 
WHERE A.count_people > 1) 
 
 
SELECT s,c,score
 
FROM
 
(
 
  SELECT max(score),avg(score),COUNT(score),student.s,c,score
 
  FROM student
 
  LEFT JOIN sc
 
  ON student.s=sc.s
 
  GROUP BY student.s
 
  HAVING max(score)=avg(score) AND COUNT(score)>=2
 
) A;
 
 
-- 36.查询每门功成绩最好的前两名
 
SELECT * 
FROM (SELECT sc.SId, sc.CId, sc.score, row_number() over (PARTITION BY sc.CId ORDER BY sc.score DESC)排名
FROM sc
ORDER BY sc.score DESC) A
WHERE 排名 <= 2
ORDER BY A.CId, A.排名
 
 
-- 37.统计每门课程的学生选修人数(超过 5 人的课程才统计)
 
SELECT * 
 
FROM (
 
SELECT sc.CId, count(sc.SId) as count_people
 
FROM sc
 
GROUP BY sc.CId) A
 
WHERE A.count_people > 5
 
 
 
 
SELECT sc.CId,COUNT(sc.CId)
 
FROM sc
 
GROUP BY sc.CId
 
HAVING COUNT(sc.CId)>5 ;
 
 
-- 38.检索至少选修两门课程的学生学号
 
SELECT sc.SId, COUNT(sc.SId)
 
FROM sc
 
GROUP BY sc.SId
 
HAVING COUNT(sc.SId) >= 2 
 
-- 39.查询各学生的年龄,只按年份来算
 
SELECT SId, Sname, (year(curdate())-year(Sage)) as age 
 
FROM student
 
ORDER BY age
 
 
-- 40.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
 
SELECT SId, Sname,timestampdiff(year,Sage,curdate())年龄
 
FROM student
 
ORDER BY 年龄;
 
-- 41. 查询本周过生日的学生
 
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');
 
 
-- 42.查询下周过生日的学生
 
set @day =9-dayofweek(curdate());
 
 
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');
 
-- 43.查询本月过生日的学生
 
SELECT *
 
FROM student
 
WHERE date_format(Sage,'%m')=date_format(curdate(),'%m');
 
 
-- 44.查询下月过生日的学生
 
SELECT *
 
FROM student
 
WHERE date_format(Sage,'%m')=date_format(date_add(curdate(),interval 1 month),'%m');
 


吮指原味鸡毛毛
关注

87


45

656


mysql经典50题
04-01
mysql经典50题。以及注释,经过实战运行及改善,可以直接用。挺有用的,对于sql入门及网申笔试来说。
sql语句练习50题(Mysql版)
热门推荐
风一样的勇士
 32万+
习题来源于网络,sql语句是自己写的。欢迎指正。 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4

Chemlez:第一题还要查询出学生基本信息,以学号和姓名为例:
-- 1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
SELECT t1.SId,st.`name`,t1.score '01',t2.score '02' FROM
(SELECT SC.SId,SC.score FROM SC WHERE SC.CId = '01') AS t1  -- 从分数表中查询出考01科目的学生id和对应的分数
INNER JOIN 
(SELECT SC.SId,SC.score FROM SC WHERE SC.CId = '02') AS t2  -- 从分数表中查询出考02科目的学生id和对应的分数
INNER JOIN
(SELECT s.Sname name,s.SId FROM Student s) AS st  -- 学生表 姓名和id的信息
ON 
t1.SId = t2.SId -- 将学生的01科目和02科目对应起来;
AND
t1.SId = st.SId -- 将学生信息和查询出来成绩信息做对应关系
WHERE 
t1.score > t2.score
5 月前回复

4

Anza7i:第4题有没有错呀,没有成绩显示NULL的话是不是该用LEFT JOIN1 年前回复

3

cjz5989回复:我感觉也是2 天前回复


山海自有归期回复:答案错了,应该用左连接14 天前回复


m0_58289046回复Rearrange:太对了,用left join,优先返回左表的值,那样才能看到右表的存在的空值1 月前回复


vcent_回复:我感觉也是left join2 月前回复


yohhen回复:查询所有学生,所以应该是left join5 月前回复

1

Rearrange回复:我感觉也是8 月前回复


qq_48366440:第九题: select * from student where SId in (select SId from sc group by SId having group_concat(cid order by CId)= ( select group_concat( CId order by CId ) str1 from sc where SId = '01' ) and SId != '01' );2 月前回复

2

qq_40800925:第18题犹豫MySql低版本不支持rank函数,我自己写了一段Sql,结果是对的。但是有个疑问。case when的第三个条件AND @cur:=1为什么不能是0,还望各位大佬指点
SELECT t1.CId,t1.score,t2.`Cname`,t1.rank FROM (
SELECT sc.`CId`,sc.`score`,(
    CASE WHEN @cid IS NULL AND @value:=sc.`score` AND @cid:=sc.`CId` THEN @cur:=@cur+1
         WHEN @cid IS NOT NULL AND @cid=sc.`CId` AND @value!=sc.`score`AND @cid:=sc.`CId` THEN @cur:=@cur+1
         WHEN @cid IS NOT NULL AND @cid!=sc.`CId` AND @value:=sc.`score` AND @cur:=1 AND @cid:=sc.`CId`  THEN @cur:=@cur
    END
) rank
FROM sc,(SELECT @cid:=NULL,@cur:=0,@value:=0) initValue
ORDER BY sc.`CId` DESC,sc.`score` DESC
) t1,Course t2
WHERE rank<=3 AND t1.CId=t2.`CId`;
5 月前回复

1

洋洋990:为什么只有44道题?7 月前回复

1

MYNAMEL回复:你在众多评论中一下子就吸引了我的目光,你想的没错,原因就是,楼主私藏了6道3 月前回复


vaixin1314:你好,我试了一下,第九题是不是sql错了,查到的结果不正确麻烦确认一下,还是我读题读错了?1 年前回复

1

江河..回复qq_39599516:这玩意你咋研究出来的呢真牛逼2 月前回复

1

chenchongxyn01回复qq_41603682:你的代码,我测试了,并做了些完善,主要修改是,1.排除01没有的课程,别的学生有的情况。2.NOT EXISTS 替换了NOT IN2 月前回复


chenchongxyn01回复weixin_45697741:使用count,有点剑走偏锋的意味儿!2 月前回复


qq_40566756回复:第九题给的答案是错的!2 月前回复


qq_48768739回复weixin_45697741:你这个思路是比较的课程数目,如果新加一门课,学号01的同学其中一门换成新加的那门课,查出来的结果就不对了4 月前回复


weixin_45697741回复:
select distinct student.*
from student
where student.sid<>'01' and student.sid in
    (select t2.sid
    from (select cid from sc where sid='01') as t1 left join
    (select cid,sid from sc) as t2 on t1.cid = t2.cid
    group by t2.sid
    having count(distinct(t2.cid)) = (select count(*) from sc where sid='01'))
5 月前回复


qq_41603682回复weixin_45372352:
SELECT *
 FROM student
 WHERE student.`SId` NOT IN (
    SELECT DISTINCT(tab11.sid) sss
    FROM
    sc  RIGHT JOIN (SELECT  student.`SId`,tab1.cid
    FROM student,(
    SELECT cid 
     FROM sc
     WHERE sid = "01"
    )tab1 ) tab11 ON sc.`SId` = tab11.sid AND sc.`CId` = tab11.cid
    WHERE sc.sid IS  NULL
 )
  AND  student.`SId` <> "01"
1 年前回复


qq_39599516回复:你这样写 随便加个另外的课程给06 07 你这结果就不对了1 年前回复


Yph_Jerry回复:你的思路很棒,通过学号来查询1 年前回复


vaixin1314回复weixin_45372352:嗯。这个后来写出来了,测试了多次应该没问题1 年前回复


weixin_45372352回复:是错的,你会不1 年前回复


琴仙咩豆丁:#查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null ) select student.Sid,student.Sname,tmp1.zongkeshu,tmp2.zongchengji from student LEFT JOIN ( select Sid, count(1) as zongkeshu from sc group by Sid) tmp1 on student.SId = tmp1.SId LEFT JOIN ( select Sid, sum(score) as zongchengji from sc group by Sid) tmp2 on student.SId = tmp2.SId2 天前回复


is__good:26题(供参考):SELECT s.SId, s.Sname, t.avgscore FROM Student s LEFT JOIN ( SELECT SC.SId, AVG( SC.score ) AS avgscore FROM SC GROUP BY SC.SId ) t ON s.SId = t.SId WHERE t.avgscore >= 85 GROUP BY s.SId, s.Sname, t.avgscore2 月前回复


chenchongxyn01:第九题,我的修改完善:
SELECT DISTINCT
  Student.*
FROM
  Student
WHERE Student.SId <> '01'
  AND NOT EXISTS /*不存在01有的课程,别的学生没有*/
  (SELECT
    1
  FROM
    (SELECT
      t1.SId,
      SC.SId AS SCId
    FROM
        (SELECT
          Student.SId,
          t.CId
        FROM
          Student,
          (SELECT
            SC.CId
          FROM
            SC
          WHERE SC.SId = '01') AS t) AS t1
        LEFT JOIN SC
          ON SC.SId = t1.SId
          AND SC.CId = t1.CId
      ) AS res
  WHERE res.SCId IS NULL
    AND res.SId = Student.`SId`)
AND NOT EXISTS( /*不存在01没有的课程,别的学生有*/
SELECT
  1
FROM
  SC,Course
WHERE NOT EXISTS
  (SELECT 1 FROM SC
  WHERE SC.SId = '01'
    AND Course.CId = SC.CId)
AND SC.`SId` = Student.`SId`
AND SC.`CId` = Course.`CId`
)
2 月前回复


雷鑫宇回复:可以用内连接或者外链接,避免一次嵌套子查询2 月前回复


chenchongxyn01回复雷鑫宇:我是用MySql测试的,没有用ORACLE测试过!也许语法是要有所改动的,另外也可能需要将嵌套的表名和字段名区分的更清楚些!2 月前回复


雷鑫宇回复:兄弟。不能套用超过3层2 月前回复


雷鑫宇回复润จุ๊บ:兄弟你这个也是错的 ,不能用,不是科目总数啊2 月前回复


chenchongxyn01回复润จุ๊บ:我是觉得用选中的科目数量是否相等,来判断有点剑走偏锋,如果数据一变化就有可能不适用了!2 月前回复


润จุ๊บ回复润จุ๊บ:
SELECT
       DISTINCT S.*
FROM STUDENT S
INNER JOIN SC
ON S.SID = SC .SID
WHERE SC.CID IN (SELECT SC.CID FROM SC WHERE SC.SID = '01')
GROUP BY SC.SID
HAVING COUNT(SC.CID) = (SELECT COUNT(SC.CID) FROM SC WHERE SC.SID = '01')
AND SC.SID != '01';
2 月前回复

1

润จุ๊บ回复:第九题我也觉得博主的答案是错的。我自己去数据表看发现该答案是错的。我的答案和你的是一样的。 SELECT DISTINCT S.* FROM STUDENT S INNER JOIN SC ON S.SID = SC .SID WHERE SC.CID IN (SELECT SC.CID FROM SC WHERE SC.SID = '01') GROUP BY SC.SID HAVING COUNT(SC.CID) = (SELECT COUNT(SC.CID) FROM SC WHERE SC.SID = '01') AND SC.SID != '01';2 月前回复


吉太030:课程表之后的创建表第一行没加分号哎2 月前回复

<12>
经典SQL练习题(MySQL版)_廖致君的博客_sql练习
10-28
网上有一篇关于SQL的经典文章,超经典SQL练习题,做完这些你的SQL就过关了,引用和分析它的人很多,于是今天复习SQL的时候找来练了练手。原作者用的是SQL Server 2008,我在这里用的是MySQL 8.0.11(二者语法差别不大),文本编辑器用的是...
MySQL练习题_一个小运维
11-15
8.简述MySQL配置文件默认读取顺序 /etc/my.cnf / etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 默认情况下,MySQL启动时,会依次读取以上配置文件,如果有重复选项,会以最后一个文件设置的为准。
50道MySQL经典练习题
12-14
这个是网上流传的50道SQL练习题,最近拿来练习,刚做完,这里把我做的答案给大家做个参考,如有错误,还请告知。 另外,做题的时候先不要看答案(答案不唯一,只要满足要求即可),要有自己的一个思考过程,这样做出来才能达到最好的训练效果。(感觉做这种题是会上瘾的……) 我使用的Mysql版本是5.7.19。SQL语句可能会因数据库系统的不同会有少许差异。 这里放上MySQL语法执行的先后顺序: 7:SELECT 查询列表 1:FROM 表 2:连接类型 JOIN 表2 3:ON 连接条件 4:WHERE 筛选条件 5:GROUP BY 分组 6:HAV
MySQL经典练习题及答案,常用SQL语句练习50题
qq_41936662的博客
 9万+
表名和字段–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程...
mysql经典50道练习题_猿来如此dj的博客_mysql 练习题
10-31
mysql经典50道练习题 Java的冒泡排序,快速排序,归并排序,计数排序,二分查找法 问题及描述: –1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别...
MySQL练习题student_score_gyqlaozide的博客
11-19
Mysql数据库练习题student,score表 student表score表1.创建表: create table student(id int(10) primary key unique auto_increment,name varchar(20) not null,sex varchar(4),birth year,department varchar(20) not null,address...
MySQL练习题 (练习表+题目+答案)
qq_42192701的博客
 4884
mysql练习题 (表+题目+答案) 一、创建所需要练习的表 CREATE TABLE J_TEACHER ( tno int NOT NULL PRIMARY KEY, tname varchar(20) NOT NULL ); INSERT INTO J_TEACHER(tno,tname)VALUES(1,‘张老师’); INSERT INTO J_TEACHER(tno,tname)VAL...
经典SQL练习题(MySQL版)
weixin_33834137的博客
 1万+
原文首发于简书于[2018.07.30] 网上有一篇关于SQL的经典文章,超经典SQL练习题,做完这些你的SQL就过关了,引用和分析它的人很多,于是今天复习SQL的时候找来练了练手。原作者用的是SQL Server 2008,我在这里用的是MySQL 8.0.11(二者语法差别不大),文本编辑器用的是Atom 1.28.2(不知道大家用什么,反正用At...
MySQL常见练习题_李俊的博客
7-21
MySQL常见练习题 把/etc/passwd文件的内容存储到teadb库下的usertab表里,并做如下配置: 1在name字段下方添加s_year字段 存放出生年份 默认值是1990 mysql> alter table usertab add s_year year default 1990 after name;...
mysql练习题合集_majichen95的博客
11-15
mysql练习题合集 表结构: 1、部门表:部门编号,部门名称,位置 createtabledept( deptnoint(10)primarykey, dnamevarchar(14), locvarchar(13) ); 2、薪资表:薪资等级、当前等级的最低薪资、当前等级的最高薪资...
图解SQL面试题:经典50题
wangprince2017
 1094
图解SQL面试题:经典50题 已知有如下4张表: 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程名称,教师号) 教师表:teacher(教师号,教师姓名) 根据以上信息按照下面要求写出对应的SQL语句。 ps:这些题考察SQL的编写能力,对于这类型的题目,需要你先把4张表之间的关联关系搞清楚了,最好的办法是自己在草稿纸上画出关联图,然后再编写对应的SQL语句就比较容易了。下图是我画的这4张表的关系...
MySQL经典练习50题
08-08
MySQL经典题库50题,无答案。MySQL经典题库50题,无答案。
50道sql练习题(附具体的sql)
qq_44163077的博客
 3506
问题及描述: –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.成绩...
MySQL经典50道练习题
Melo
 1万+
MySQL基础+JDBC编程教程:https://zhuanlan.zhihu.com/p/32651307 参考答案: https://blog.csdn.net/dehu_zhou/article/details/52881587 https://blog.csdn.net/huaxiawudi/article/details/82288044 其中部分代码进行了改写,技巧:每次只写最简单的语...
mysql练习题
08-02
MYSQL子查询、相关子查询、inner join、left|right join、cross join 、行列转换等高级查询练习题
MySQL等 SQL语句在线练习
大数据开发
 6万+
SQL语句在线练习 http://sample.jimstone.com.cn/xsql/ SQL语句测验 http://www.w3school.com.cn/quiz/quiz.asp?quiz=sql sql语句练习50题(Mysql版)  https://blog.csdn.net/fashion2014/article/details/78826299/ htt...
50道MYSQL练习题及答案
qq_45574891的博客
 2266
50道MYSQL练习题目前题目好像有好几个题目版本,本版本前的前18题相较于后半部分难度明显会有提升,部分答案并非最优选择,仅供参考。同时部分答案涉及GROUP BY若提示sql_mode=only_full_group_by的错误,原因为MYSQL5.7及以上版本开启了 only_full_group_by 模式,导致原有的GROUP BY语句报错,具体解决方法本文不做赘述。 数据表介绍 1.学...
MySQL面试50题和答案
李玉坤的博客
 1万+
1)Mysql中有哪几种锁? 1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 3.页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 2 )Mysql中有哪些不同的表格? 共有5种类型的表格: MyISAM Heap M...
MySql基础练习题100道(1-50)
weixin_45664854的博客
 5065
nisdkfjksdlfjkdslajfkdlsajfkdlsajfkdslaf
mysql 练习题及答案 50道
u014510892的博客
 3368
此50题参考出处,题目一样,代码有出入,因为题目比较有意思,都自己做了一次。 https://zhuanlan.zhihu.com/p/50662216   -- 1、查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号。 -- 方法1 select * from score a inner join score b on (a.s_id = b.s_id and a.c_id...
50道mysql笔试题目及答案_50道SQL练习题及答案(MySQL版)
weixin_34996026的博客
 2140
--1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数SELECT st.*, class1, class2 FROM student st JOIN(SELECT * FROM(SELECT SId s1, score class1 FROM sc WHERE CId = '01') c1,(SELECT SId s2, score class2 FROM sc WHERE ...
mysql 练习
最新发布
weixin_39990804的博客
 53
目录一、最爱考的sql笔试题1.1 创建表及数据1.2 笔试题1.2.1 查询每门课程的最高分、最低分、平均分1.2.2 查询每门课的最高分学生的信息1.2.3 查询每每门课的前三名1.2.4 删除自动编号不同其他信息相同的学生二、课程题2.1 查询每门课程成绩都大于80分学生的学号2.2 查询课程001的成绩大于课程002成绩的学号三、推测题3.1 已知表中推测sql3.2 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列3.3
初学mysql经典练习题及答案
浅笑古今的博客
 1万+
创建如下各表   班级表:class学生表:student教师表:teacher课程表:course成绩表:score创建各表的语句:class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset...
MySQL 经典练习 50 题(完美解答版)
————————————————
版权声明:本文为CSDN博主「吮指原味鸡毛毛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/original_recipe/article/details/91958663

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值