数据库实验四

--一、对xsgl数据库完成下列操作要求:

--1.将被全部学生都选修了的课程的总学分改为4学分。
update kc
set kc.学分=4
where kc.课程号 in (
	select cj.课程号
	from cj
	group by cj.课程号
	having count(cj.课程号)=(
		select count(xs.学号)
		from xs
	)
)

update kc
set kc.学分=4
where not exists
	(select *
	from xs
	where not exists(
		select *
		from cj
		where cj.课程号=kc.课程号 and cj.学号=xs.学号
	)
)

 
--2.从学生表删除没有选课的学生。
delete
from xs
where xs.学号 in (
	select xs1.学号
	from xs xs1
	left join cj
	on cj.学号=xs1.学号
	group by xs1.学号
	having count(cj.课程号)=0
)


--3.将每个学生的平均分,总分和选课门数插入到数据库中(学号,姓名,平均分,总分,选课门数)
create table score
	(学号 char(10),姓名 nchar(10),平均分 numeric(18,0),总分 numeric(18,0),选课门数 int)

insert
into score
select xs.学号,xs.姓名,avg(cj.成绩),sum(cj.成绩),count(cj.课程号)
from xs,cj
where xs.学号=cj.学号
group by xs.学号,xs.姓名

--4.创建每门课程的平均分和选课人数的视图(课程号,课程名,平均分,人数)
create view agv_course_score(课程号,课程名,平均分,人数)
as
select cj.课程号,课程名,avg(cj.成绩) 平均分,count(cj.学号) 人数
from cj,kc
where cj.课程号=kc.课程号
group by cj.课程号,课程名


--5.将李强同学从学生表删除(提示应该先删除李强同学的选课记录)
delete
from cj
where cj.学号 in (
	select cj.学号
	from cj,xs
	where cj.学号=xs.学号 and xs.姓名='李强'
)

delete
from xs
where xs.姓名='李强'



--6.插入一条选课记录(具体内容自己选)
insert
into cj
values('2006030307','A003',99)


--7.创建网络工程专业的学生的选课信息的视图,要求视图包含,学号,姓名,专业,课程号,课程名,成绩
create view network_cj (学号,姓名,专业,课程号,课程名,成绩)
as
select xs.学号,xs.姓名,xs.专业,kc.课程号,kc.课程名,cj.成绩
from xs,cj,kc
where xs.学号=cj.学号 and kc.课程号=cj.课程号 and xs.专业='网络工程'

--8.查询网络工程专业的各科的平均成绩,要求使用第7题创建的视图进行查询
select network_cj.课程号,avg(network_cj.成绩) 平均成绩
from network_cj
group by network_cj.课程号

--9.查询被信息管理专业的学生都选修了的课程的课程号,课程名
select kc.课程号,kc.课程名
from kc
where not exists(
	select *
	from xs
	where xs.专业='信息管理' and not exists(
	select *
	from cj
	where cj.学号=xs.学号 and kc.课程号=cj.课程号
	)
) 


--10.显示选修课程数最多的学号及选修课程数最少的学号,姓名(使用派生表实现)
select xs.姓名,xs.学号,count(*) 门数
from xs,cj,(select top 1 count(*)
			from cj
			group by cj.学号
			order by count(*) desc
			) ma(门数),(select top 1 count(*)
			from cj
			group by cj.学号
			order by count(*) asc 
			) mi(门数)
where xs.学号=cj.学号
group by  xs.姓名,xs.学号,ma.门数,mi.门数
having count(cj.课程号) in (ma.门数,mi.门数) 

--11.查询每个学生成绩高于自己的平均成绩的学号,姓名,课程号和成绩(使用派生表实现)
select xs.学号,xs.姓名,cj.课程号,cj.成绩
from xs,cj,(select 学号,avg(cj.成绩)
			from cj
			group by cj.学号
			) avg_score(学号,成绩)
where xs.学号=avg_score.学号 and xs.学号=cj.学号 and cj.成绩>avg_score.成绩

--12.自己验证with check option的作用。
create view network (学号,姓名,专业)
as
select xs.学号,xs.姓名,xs.专业
from xs
where xs.专业='网络工程'
with check option

insert into network_cj
values('2000','张三','计算机')


--13.创建一个网络工程系的学生基本信息的视图MA_STUDENT,在此视图的基础上,再定义一个该专业女生信息的视图,然后再删除MA_STUDENT,观察执行情况。
create view MA_STUDENT(学号,姓名,性别,专业)
as
select xs.学号,xs.姓名,xs.性别,xs.专业
from xs
where xs.专业='网络工程'

create view MA_female_STUDENT(学号,姓名,性别,专业)
as
select 学号,姓名,性别,专业
from  MA_STUDENT
where 性别='女'
 
drop view MA_STUDENT

--二、使用Northwind数据库完成下列操作

--1. 将员工lastname是: Peacock处理的订单中购买数量超过50的商品折扣改为七折
update [Order Details]
set Discount=0.3
where OrderID in (
	select [Order Details].OrderID
	from Employees,[Order Details],Orders
	where Orders.EmployeeID=Employees.EmployeeID and Employees.LastName='Peacock' and [Order Details].OrderID=Orders.OrderID
	group by [Order Details].OrderID
	having sum([Order Details].Quantity)>50
)

--2. 删除lastname是: Peacock处理的所有订单
delete 
from [Order Details]
where [Order Details].OrderID in (
	select OrderID
	from Employees,Orders
	where Employees.LastName='Peacock' and Employees.EmployeeID=Orders.EmployeeID
)

delete
from Orders
where Orders.EmployeeID in(
	select EmployeeID
	from Employees
	where Employees.LastName='Peacock'
)

--3. 将每个订单的订单编号,顾客编号,产品总数量,总金额插入到数据库中
create table newtable(订单编号 char(10),顾客编号 char(10),产品总数量 int,总金额 int)

insert
into newtable
select Orders.OrderID,Orders.CustomerID,sum(Quantity),sum(UnitPrice*Quantity*(1-discount))
from [Order Details],Orders
where [Order Details].OrderID=Orders.OrderID
group by Orders.OrderID,Orders.CustomerID


--4. 插入一个新的订单,要求该订单购买了商品编号为5,7,9的商品。(5号商品买了10个,7号买了20个,9号买了15个,都没有折扣)
insert
into Orders(CustomerID)
values('HANAR')

declare @orderid int
select @orderid=Orders.OrderID
from Orders
where Orders.CustomerID='HANAR'

declare @price5 int
select @price5=Products.UnitPrice
from Products
where ProductID=5

declare @price7 int
select @price7=Products.UnitPrice
from Products
where ProductID=7

declare @price9 int
select @price9=Products.UnitPrice
from Products
where ProductID=9

insert
into [Order Details]
values(@orderid,5,@price5,10,0)


insert
into [Order Details]
values(@orderid,7,@price7,20,0)

insert
into [Order Details]
values(@orderid,9,@price9,15,0)

--5. 将每年每个员工处理订单的数量和订单的总金额创建为视图
create view v1(EmployeeID,OrdersNum,Money)
as
select Orders.EmployeeID,sum(Orders.OrderID),sum(UnitPrice*Quantity*(1-discount))
from Orders,[Order Details]
where Orders.OrderID=[Order Details].OrderID
group by Orders.EmployeeID

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值