drop database mytest
create database MyTest
use Mytest
--1、问题描述:
--已知关系模式:
--S (SNO,SNAME)学生关系。SNO 为学号,SNAME 为姓名
--C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
--SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
create table s(sno int, sname varchar(10))
insert into s values(100,'张三')
insert into s values(101,'李四')
insert into s values(102,'王五')
insert into s values(103,'赵六')
insert into s values(104,'田七')
insert into s values(105,'王八')
insert into s values(106,'王八2')
go
create table c(cno int, cname varchar(10),cteacher varchar(10))
insert into c values(1,'c语言','李明')
insert into c values(2,'sql','李果')
go
create table sc(sno int,cno int,scgrade int)
insert into sc values(100,1,50)
insert into sc values(100,2,55)
insert into sc values(101,2,87)
insert into sc values(102,1,50)
insert into sc values(102,2,55)
insert into sc values(103,1,80)
insert into sc values(103,2,55)
insert into sc values(104,1,90)
insert into sc values(105,1,85)
insert into sc values(106,1,85)
insert into sc values(106,2,20)
go
select * from s
select * from c
select * from sc
--1.找出没有选修过“李明”老师讲授
--课程的所有学生姓名
--分析
--1)先查询出李明老师的编号
--2)在查询出学过李明老师的学生编号
--3)在查询出没有学过李明老师的学生
select sname from s where sno not in(
select sno from sc where cno in(
select cno from c where cteacher = '李明'))
--2.列出有二门以上(含两门)
--不及格课程的学生姓名及其平均成绩
--分析
--1)先查询出两门不及格课程以上的学生编号
--2)在做连接查询
--3)在根据学生编号查询出学生姓名用avg聚合函数统计出平均成绩 使用group by 进行分组
select sname,avg(sc.scgrade) from s s inner join sc
on s.sno = sc.sno
where sc.sno in (select sno from sc
where scgrade <60
group by sno
having count(*)>=2)
group by sname
--3.列出既学过“1”号课程,又学过“2”号课程
--的所有学生姓名
--分析
--1)先根据 课程编号1 和课程编号2查询学过1号和2号的学生编号
--2)在根据 学生编号查询学生姓名
select sname from s where sno in(
select sno from sc where cno = 1 and sno in(
select sno from sc where cno = 2))
--4.列出“1”号课成绩比
--“2”号同学该门课成绩高的所有学生的学号
--分析
--1)先查询出2号同学的该门的学生成绩
--2)2号同学的成绩对 所有学生的一号成绩对比进行筛选
select * from sc where cno = 1 and scgrade >(
select scgrade from sc where sno = 101and cno = 1)
--5.列出“1”号课成绩比“2”号课成绩
--高的所有学生的学号
--及其“1”号课和“2”号课的成绩
--分析
--1)先查询出同一名“2”号课成绩
--2)在查询出一号成绩进行对比
select sc1.scgrade,(select scgrade from sc sc where sc.sno = sc1.sno and sc.cno = 2
)
from sc sc1 where cno = 1 and scgrade >(
select scgrade from sc sc2 where cno = 2 and sc1.sno = sc2.sno
)
--2、问题描述:
--为管理岗位业务培训信息,建立3个表:
--S (Sno,SName,SDept,SAge) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
--C (Cno,CName ) C#,CN 分别代表课程编号、课程名称
--SC ( Sno,Cno,Grade ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
-- 学生信息表
--字段分别代表:学号、学员姓名、所属单位、学员年龄
create table stu(Sno int,SName varchar(10), SDept varchar(50) ,SAge int )
insert into stu values(1,'小明','税务局',26)
insert into stu values(2,'小王','铁路局',27)
insert into stu values(3,'小和','电力局',28)
insert into stu values(4,'小宝','文化局',29)
go
--课程信息表
--字段分别代表:课程编号、课程名称
create table cc(Cno char(2), CName varchar(20))
insert into cc values('c1','计算机原理')
insert into cc values('c2','经济学原理')
insert into cc values('c3','税收基础')
insert into cc values('c4','C语言基础')
insert into cc values('c5','中国刑法')
insert into cc values('c6','心理学')
insert into cc values('c7','会计学')
go
--选课信息表
--字段分别代表代表学号、所选修的课程编号、学习成绩
create table scc(Sno int, Cno char(2) , Grade int)
insert into scc values(1,'c1',60)
insert into scc values(1,'c2',70)
insert into scc values(1,'c3',80)
insert into scc values(1,'c4',90)
insert into scc values(1,'c5',100)
insert into scc values(1,'c6',65)
insert into scc values(2,'c2',65)
insert into scc values(3,'c1',60)
insert into scc values(3,'c2',70)
insert into scc values(3,'c3',80)
insert into scc values(3,'c4',90)
insert into scc values(3,'c5',100)
insert into scc values(3,'c6',65)
insert into scc values(3,'c7',70)
go
select * from stu
select * from cc
select * from scc
go
--要求实现如下5个处理:
--1. 使用标准SQL嵌套语句查询选
--修了课程名称为’税收基础’的学员学号和姓名
--分析
--1)先查询税收基础的编号
--2)在根据该编号查询出修过的学员编号
--3)在根据该学员编号查询到学员信息
select
from stu where Sno in(
select Sno from scc where Cno = (
select Cno from cc where CName = '税收基础'
))
-- 2. 使用标准SQL嵌套语句
--查询选修课程编号为’C2’的学员姓名和所属单位
--分析
--1)根据课程名查询到修改c2的学生编号
--2)在根据该学员编号查询到学生的对应信息
select SName,SDept from stu where Sno in(
select Sno from scc where Cno = 'C2')
--3. 使用标准SQL嵌套语句
--查询不选修课程编号为’C5’的学员姓名和所属单位
--分析
--1)根据课程查出对应修过C5的学生编号
--2)在根据该学生编号 查询没有修改过的学生
select SName,SDept from stu where Sno != all(
select Sno from scc where cno = 'C5')
-- 4. 使用标准SQL嵌套语句
--查询选修全部课程的学员姓名和所属单位
--分析
--1)根据 分组 使用聚合函数统计出 每个学生的次数
--2)在根据 课程统计出课程的门数,然后进行对比查询到学生编号
--3)在根据该学生编号 获取对应信息
select SName,SDept from stu where sno in(
select Sno from scc
group by Sno
having count(*) = (select count(*) from cc))
-- 5. 查询选修了课程的学员人数
--分析
--1)根据 去重复编号 查询出学过课程的人数
select count(distinct sno) from scc
--6. 查询选修课程超过5门的学员学号和所属单位
--分析
--1)根据 分组 使用聚合函数统计出 每个学生的次数
--2)在根据 课程统计出课程的门数,然后进行对比查询到学生编号
--3)在根据该学生编号 获取对应信息
select SName,SDept from stu where sno in(
select Sno from scc
group by Sno
having count(*) >5)