您的位置:首页 > 数据库

S01 - 001、学生_课程_成绩_教师27个常用sql

2019-06-14 17:02 1781 查看

0、本章学习目录大纲 - SQL语句练习

初学耗时:??h

注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

一、准备MySQL。
  1.1  下载MySQL。
  1.2  安装MySQL。
  1.3  配置环境变量。
  1.4  导入表 - 测试数据。

二、表关系梳理。
    2.1  学生表。
    2.2  课程表。
    2.3  教师表。
    2.4  成绩表。

三、开始28个常用sql
  3.1  查询"01"课程比"02"课程成绩高的学生的信息及课程分数。
  3.2  查询"01"课程比"02"课程成绩低的学生的信息及课程分数。
  3.3  查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩。
  3.4  查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩。
  3.5  查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩。
  3.6  查询"李"姓老师的数量。
  3.7  查询学过"张三"老师授课的同学的信息。
  3.8  查询没学过"张三"老师授课的同学的信息。
  3.9  查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息。
  3.10  查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息。
  3.11  查询没有学全所有课程的同学的信息。
  3.12  查询至少有一门课与学号为"01"的同学所学相同的同学的信息。
  3.13  查询和"01"号的同学学习的课程完全相同的其他同学的信息。
  3.14  查询没学过"张三"老师讲授的任一门课程的学生姓名。
  3.15  查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩。
  3.16  检索"01"课程分数小于60,按分数降序排列的学生信息。
  3.17  查询各科成绩最高分、最低分和平均分。
  3.18  查询学生的总成绩并进行排名。
  3.19  查询不同老师所教不同课程平均分从高到低显示。
  3.20  查询每门课程被选修的学生数。
  3.21  查询出只有两门课程的全部学生的学号和姓名。
  3.22  查询同名同性学生名单,并统计同名人数。
  3.23  查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩。
  3.24  查询课程名称为"数学",且分数低于60的学生姓名和分数。
  3.25  查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩。
  3.26  检索至少选修两门课程的学生学号。
  3.27  查询选修了全部课程的学生信息。


ギ 舒适区ゾ || ♂ 累觉无爱 ♀





一、准备工作

  1.1 ~  下载MySQL。

  1.2 ~  安装MySQL。

  1.3 ~  配置环境变量。

  1.4 ~  导入表 - 测试数据。

create table Student(SID varchar(10),Sname nvarchar(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 nvarchar(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 nvarchar(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'<
307f7
/span> , 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);

此处没有建立外键关联,因为可以提升效率。



谁说我没对象?当我Java白学的?

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


二、表关系梳理

  2.1 ~  学生表。

Student(SID,Sname,Sage,Ssex)
SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

  2.2 ~  课程表。

Course(CID,Cname,TID)
CID 课程编号,Cname 课程名称,TID 教师编号

  2.3 ~  教师表。

Teacher(TID,Tname)
TID 教师编号,Tname 教师姓名

  2.4 ~  成绩表。

SC(SID,CID,score)
SID 学生编号,CID 课程编号,score 分数


谁说我没对象?当我Java白学的?

- - - - - - - - - - - - - - - - - - - - - - - - - - - -




三、开始50个常用sql


  3.1 ~ 查询"01"课程比"02"课程成绩高的学生的信息及课程分数。

    3.1.1 .   查询同时存在"01"课程和"02"课程的情况。
select a.* , b.score 课程01的分数,c.score 课程02的分数 from Student a , SC b , SC c
where a.SID = b.SID and a.SID = c.SID and b.CID = '01' and c.CID = '02' and b.score > c.score
    3.1.2 .   查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)。
select a.* , b.score 课程01的分数,c.score 课程02的分数 from Student a
left join SC b on a.SID = b.SID and b.CID = '01'
left join SC c on a.SID = c.SID and c.CID = '02'
where b.score > ifnull(c.score,0)

  3.2 ~ 查询"01"课程比"02"课程成绩低的学生的信息及课程分数。

    3.2.1 .   查询同时存在"01"课程和"02"课程的情况。
select a.* , b.score  课程01的分数 ,c.score  课程02的分数  from Student a , SC b , SC c
where a.SID = b.SID and a.SID = c.SID and b.CID = '01' and c.CID = '02' and b.score < c.score
    3.2.2 .   查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况。
select a.* , b.score  课程01的分数 ,c.score  课程02的分数  from Student a
left join SC b on a.SID = b.SID and b.CID = '01'
left join SC c on a.SID = c.SID and c.CID = '02'
where ifnull(b.score,0) < c.score

  3.3 ~ 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩。

select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.SID = b.SID
group by a.SID , a.Sname
having cast(avg(b.score) as decimal(18,2)) >= 60
order by a.SID

  3.4 ~ 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩。

    3.4.1 .   查询在sc表存在成绩的学生信息的SQL语句。
select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.SID = b.SID
group by a.SID , a.Sname
having cast(avg(b.score) as decimal(18,2)) < 60
order by a.SID
    3.4.2 .   查询在sc表中不存在成绩的学生信息的SQL语句。
select a.SID , a.Sname , ifnull(cast(avg(b.score) as decimal(18,2)),0) avg_score
from Student a left join sc b
on a.SID = b.SID
group by a.SID , a.Sname
having ifnull(cast(avg(b.score) as decimal(18,2)),0) < 60
order by a.SID

  3.5 ~  查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩。

    3.5.1 .   查询所有有成绩的SQL。
select a.SID  学生编号 , a.Sname  学生姓名 , count(b.CID) 选课总数, sum(score)  所有课程的总成绩
from Student a , SC b
where a.SID = b.SID
group by a.SID,a.Sname
order by a.SID
    3.5.2 .   查询所有(包括有成绩和无成绩)的SQL。
select a.SID  学生编号 , a.Sname  学生姓名 , count(b.CID) 选课总数, sum(score)  所有课程的总成绩
from Student a left join SC b
on a.SID = b.SID
group by a.SID,a.Sname
order by a.SID

  3.6 ~  查询"李"姓老师的数量。

    3.6.1 .   方法(1)。
select count(Tname)  李姓老师的数量  from Teacher where Tname like '李%'
    3.6.2 .   方法(2)。
select count(Tname)  李姓老师的数量  from Teacher where left(Tname,1) = '李'

  3.7 ~  查询学过"张三"老师授课的同学的信息。

select distinct Student.* from Student , SC , Course , Teacher
where Student.SID = SC.SID and SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '张三'
order by Student.SID

  3.8 ~  查询没学过"张三"老师授课的同学的信息。

select m.* from Student m where SID not in (select distinct SC.SID from SC , Course , Teacher where SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '张三') order by m.SID

  3.9 ~  查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息。

    3.9.1 .   方法(1)。
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
    3.9.2 .   方法(2)。
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '02' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '01') order by Student.SID
    3.9.3 .   方法(3)。
select m.* from Student m where SID in
(
select SID from
(
select distinct SID from SC where CID = '01'
union all
select distinct SID from SC where CID = '02'
) t group by SID having count(1) = 2
)
order by m.SID

  3.10 ~  查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息。

    3.10.1 .   方法(1)。
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and not exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
    3.10.2 .   方法(2)。
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and Student.SID not in (Select SC_2.SID from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID

  3.11 ~  查询没有学全所有课程的同学的信息。

    3.11.1 .   未计算全没学的学员信息。
select Student.*
from Student , SC
where Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
    3.11.2 .   计算全没学的学员信息。
select Student.*
from Student left join SC
on Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)

  3.12 ~ 查询至少有一门课与学号为"01"的同学所学相同的同学的信息。

select distinct Student.* from Student , SC where Student.SID = SC.SID and SC.CID in (select CID from SC where SID = '01') and Student.SID <> '01'

  3.13 ~ 查询和"01"号的同学学习的课程完全相同的其他同学的信息。

select Student.* from Student where SID in
(select distinct SC.SID from SC where SID <> '01' and SC.CID in (select distinct CID from SC where SID = '01')
group by SC.SID having count(1) = (select count(1) from SC where SID='01'))

  3.14 ~ 查询没学过"张三"老师讲授的任一门课程的学生姓名。

select student.* from student where student.SID not in
(select distinct sc.SID from sc , course , teacher where sc.CID = course.CID and course.TID = teacher.TID and teacher.tname = '张三')
order by student.SID

  3.15 ~ 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩。

select student.SID , student.sname , cast(avg(score) as decimal(18,2)) avg_score from student , sc
where student.SID = SC.SID and student.SID in (select SID from SC where score < 60 group by SID having count(1) >= 2)
group by student.SID , student.sname

  3.16 ~ 检索"01"课程分数小于60,按分数降序排列的学生信息。

select student.* , sc.CID , sc.score from student , sc
where student.SID = SC.SID and sc.score < 60 and sc.CID = '01'
order by sc.score desc

  3.17 ~ 查询各科成绩最高分、最低分和平均分。

    3.17.1 .   方法(1)。
select m.CID  课程编号 , m.Cname  课程名称 ,
max(n.score)  最高分 ,
min(n.score)  最低分 ,
cast(avg(n.score) as decimal(18,2))  平均分 ,
cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  及格率 ,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  中等率 ,
cast((select count(1) from SC where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优良率 ,
cast((select count(1) from SC where CID = m.CID and score >= 90)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优秀率
from Course m , SC n
where m.CID = n.CID
group by m.CID , m.Cname
order by m.CID
    3.17.2 .   方法(2)。
select m.CID  课程编号 , m.Cname  课程名称 ,
(select max(score) from SC where CID = m.CID)  最高分 ,
(select min(score) from SC where CID = m.CID)  最低分 ,
(select cast(avg(score) as decimal(18,2)) from SC where CID = m.CID)  平均分 ,
cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  及格率,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  中等率 ,
cast((select count(1) from SC where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优良率 ,
cast((select count(1) from SC where CID = m.CID and score >= 90)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优秀率
from Course m
order by m.CID

  3.18 ~ 查询学生的总成绩并进行排名。

select m.SID  学生编号  ,
m.Sname  学生姓名  ,
isnull(sum(score),0)  总成绩
from Student m left join SC n on m.SID = n.SID
group by m.SID , m.Sname
order by  总成绩  desc

  3.19 ~ 查询不同老师所教不同课程平均分从高到低显示。

select m.TID , m.Tname , cast(avg(o.score) as decimal(18,2)) avg_score
from Teacher m , Course n , SC o
where m.TID = n.TID and n.CID = o.CID
group by m.TID , m.Tname
order by avg_score desc

  3.20 ~ 查询每门课程被选修的学生数。

select Cid , count(SID) 学生数  from sc group by CID

  3.21 ~ 查询出只有两门课程的全部学生的学号和姓名。

select Student.SID , Student.Sname
from Student , SC
where Student.SID = SC.SID
group by Student.SID , Student.Sname
having count(SC.CID) = 2
order by Student.SID

  3.22 ~ 查询同名同性学生名单,并统计同名人数。

注:需再添加一条同名同姓的学生才可以看到展示效果。

select Sname  学生姓名 , count(*)  人数  from Student group by Sname having count(*) > 1

  3.23 ~ 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩。

select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.SID = b.SID
group by a.SID , a.Sname
having cast(avg(b.score) as decimal(18,2)) >= 85
order by a.SID

  3.24 ~ 查询课程名称为"数学",且分数低于60的学生姓名和分数。

select sname , score
from Student , SC , Course
where SC.SID = Student.SID and SC.CID = Course.CID and Course.Cname = N'数学' and score < 60

  3.25 ~ 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩。

    3.25.1 .   方法(1)。
select m.* from SC m ,(select CID , score from SC group by CID , score having count(1) > 1) n
where m.CID= n.CID and m.score = n.score order by m.CID , m.score , m.SID
    3.25.2 .   方法(2)。
select m.* from SC m where exists (select 1 from (select CID , score from SC group by CID , score having count(1) > 1) n
where m.CID= n.CID and m.score = n.score) order by m.CID , m.score , m.SID

  3.26 ~ 检索至少选修两门课程的学生学号。

select student.SID , student.Sname
from student , SC
where student.SID = SC.SID
group by student.SID , student.Sname
having count(1) >= 2
order by student.SID

  3.27 ~ 查询选修了全部课程的学生信息。

此方法是根据数量来完成。

select student.* from student where SID in
(select SID from sc group by SID having count(1) = (select count(1) from course))


谁说我没对象?当我Java白学的?

- - - - - - - - - - - - - - - - - - - - - - - - - - - -



^ 至此,学生_课程_成绩_教师27个常用sql完成。


- - - - - - - - - - - - - - - - - - - - - - - - - - - -


※ 世间诱惑何其多,坚定始终不动摇。

根据TCP/IP协议栈的分层来看HTTP协议工作在哪一层?


A、数据链路层
B、网络层
C、传输层
D、应用层

D



谁说我没对象?当我Java白学的?

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!



谁说我没对象?当我Java白学的?


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: