SQL server练习

时间:2022-05-08 02:54:09

1、本题用到下面三个关系表:                            

CARD(CNO,NAME,CLASS)   

说明:card:借书卡 cno:卡号 name:姓名class: 班级

BOOKS(BNO, BNAME, AUTHOR, PRICE, QUANTITY)   

说明:books:图书  bno:书号  bname:书名  author:作者  price:单价  quantity:库存册数

BORROW(CNO, BNO, RDATE)  

说明:borrow:借书记录  cno:借书卡号  bno:书号  rdate: 还书日期

备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

按要求查询数据:

(1)    找出借书超过5本的读者,输出借书卡号及所借图书册数。

select cno,count(bno) as 册数 from BORROW group by cno having count(bno)>5        

(2)查询过期未还图书,输出借阅者(卡号)、书号及还书日期。

select cno as 卡号,bno as 书号,rdate as 还书日期 from borrow where borrow.rdate<GETDATE()      

(2)    查询书名包括“网络”关键词的图书,输出书号、书名、作者。

select bno,bname,author from books where bname like %网络%

 (4)查询现有图书中价格最高的图书,输出书名及作者。

select bname,author from books where price=(select MAX(price) from books)     

2、有一个[学生课程]数据库,数据库中包括三个表:

学生表:Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,记为:Student(Sno,Sname,Ssex,Sage,Sdept),Sno 为关键字。

课程表:Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,记为: Course(Cno,Cname,Cpno,Ccredit) Cno为关键字。

成绩表:SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记为: SG(Sno,Cno,Grade) (SNO, CNO) 为关键字。

用SQL语言实现下列功能:

(1)    建立学生表[Student],其中学号属性不能为空,并且其值是唯一的。

create table Student

(

Sno char(5) primary key,

Sname char(10),

Ssex  char(2) default  check (Ssex in (,)),

Sage int,

Sdept varchar(10)

)

(2)    查询考试成绩有不及格的学生的学号。

select distinct Sno from SG where Grade<60

(3)    将学号为05001学生的年龄改为22岁。

update T_Student set Sage=22 where Sno=05001

(4)    计算1号课程的学生平均成绩。   

select AVG(Grade) from SG group by Cno having Cno=1 

(5)    创建存储过程[getDetailByName],通过输入参数学生姓名(如 “张三”),筛选出该学生的基本信息,对不存在此学生姓名的输入值,打印信息“不存在此学生”。

create proc getDetailByName

@name char(10)

as

if exists(select * from Student where Sname=@name)

  begin

      select * from Student where Sname=@name

  end

else

begin

        print 不存在此学生

    end

exec getDetailByName xxx

3、现有关系数据库如下:

数据库名:教师数据库

教师表(编号,姓名,性别,民族,职称,身份证号)

课程表(课号,名称)

任课表(ID,教师编号,课号,课时数)

用SQL语言实现下列功能:

(1) 创建上述三张表,   要求使用:主键(教师表.编号,课程表.课号)、外键(任课表.教师编号,任课表.课号)、默认(民族)、非空(民族,姓名)、唯一(身份证号)、检查(性别、课时数),自动编号(ID)

create table 教师表

(

    编号 char(10) primary key,

    姓名 char(10) not null,

    性别 char(2) default  check (性别 in (,)),

    民族 char(10) default  not null,

    职称 char(10),

    身份证号 char(20) unique

)
create table 课程表

(

    课号 char(10) primary key,

    名称 char(20) not null

)
create table 任课表

(

    ID int identity(1,1),

    教师编号 char(10) references 教师表(编号),

    课号 char(10) references 课程表(课号),

    课时数 int not null check(课时数 between 0 and 200)

)

 (2) 将下列课程信息添加到课程表的代码

        课号      课程名称

        100001    SQL Server数据库

        100002    数据结构

        100003    VB程序设计

SET IDENTITY_INSERT 课程表 ON

insert into 课程表(课号,名称) values(100001,SQL Server数据库)

insert into 课程表(课号,名称) values(100002,数据结构)

insert into 课程表(课号,名称) values(100003,VB程序设计)

(3)    创建任课表视图,查询教师编号,姓名,课号,课程名称与课时数信息。创建内嵌表值函数,检索所有上“SQL Server数据库”这门课程的老师姓名;

create view V_TeacherInfo

as

select

t.编号,t.姓名,course.课号,course.名称,class.课时数

from 任课表 as class

join 课程表 as course on class.课号=course.课号

join 教师表 as t on class.教师编号=t.编号
create function fn_CourseTeacher

(@course char(200))

returns table

as

return

  (select 课程表.名称,教师表.姓名 from 任课表

   join 教师表 on 任课表.教师编号=教师表.编号

   join 课程表 on 课程表.课号=任课表.课号

   where 课程表.名称=@course

  )

go

select * from dbo.fn_CourseTeacher(SQL Server数据库)

(4) 创建存储过程,计算某教师代课总课时,并将值返回。

执行:计算“郭老师”的总课时。

create proc proc_TeachTime

@name char(10),@time int output

as

select @time=sum(任课表.课时数) from 任课表

join 教师表 on 任课表.教师编号=@name

go

declare @time int

exec proc_TeachTime 郭老师,@time output

print @time