15)查询教师工号(TeacherCode)为“01010109”的教师是否已预订教材,若已预订则显示所订教材的数量;否则显示:“该教师没有预订教材”。
DECLARE @cn smallint,@text varchar(100)
SELECT @cn=(SELECT StuBookNum+TeaBookNum FROM T_BookOrder
WHERE TeacherCode='01010109') IF @cn>0
SET @text='该教师预订教材数量'+str(@cn) ELSE
SET @text='该教师没有预订教材' SELECT @text
4.使用联接关键字(JOIN――ON)建立查询 1)查询所有教师姓名(TeacherName)及所属学院名称(AcadName)。(提示:本题使用INNER JOIN完成查询)
SELECT TeacherName, AcadName
FROM T_Teacher INNER JOIN T_Academy ON T_Teacher.AcadCode= T_Academy.AcadCode ORDER BY T_Teacher.AcadCode
2)查询所有学院名称(AcadName)及每个学院的教师姓名(TeacherName)。(提示:本题使用LEFT OUTER JOIN完成查询)
SELECT AcadName,TeacherName
FROM T_Academy LEFT OUTER JOIN T_Teacher ON T_Academy.AcadCode=T_Teacher.AcadCode
3)查询所有教师姓名(TeacherName)及所订教材代号(BookCode)。(提示:本题使用RIGHT OUTER JOIN完成查询)
SELECT TeacherName,BookCode
FROM T_BookOrder RIGHT OUTER JOIN T_Teacher ON T_BookOrder.TeacherCode=T_Teacher.TeacherCode
4)查询所有已订教材的教师姓名(TeacherName)、教材代号(BookCode)及教材名称(BookName)。(提示:本题使用嵌套的INNER JOIN完成查询)
SELECT TeacherName,T_BookOrder.BookCode,BookName From T_Teacher INNER JOIN
(T_BookOrder INNER JOIN T_BookInfo
ON T_BookOrder.BookCode=T_BookInfo.BookCode) ON T_Teacher.TeacherCode=T_BookOrder.TeacherCode
5.使用SELECT语句复制数据表
1)将T_BookOrder表中的教师编号(TeacherCode)、教材代号(BookCode)、学生用书量(StuBookNum)、教师用书量(TeaBookNum)字段及对应的书名(BookName)复制到新表NewTable1中。
SELECT TeacherCode,T_BookOrder.BookCode,BookName,StuBookNum,TeaBookNum INTO NewTable1
FROM T_BookInfo ,T_BookOrder
WHERE T_BookInfo.BookCode=T_BookOrder.BookCode 或:
SELECT BookName,T_BookOrder.BookCode,StuBookNum,TeaBookNum INTO NewTable1
FROM T_BookOrder INNER JOIN T_BookInfo ON T_BookOrder.BookCode=T_BookInfo.BookCode
2)将T_Teacher表中的教师姓名(TeacherName)、性别(Sex)字段及每个教师所属的学院名称(AcadName)复制到新表NewTable2中。
SELECT TeacherName, Sex, AcadName INTO NewTable2
FROM T_Teacher ,T_Academy
WHERE T_Teacher.AcadCode= T_Academy .AcadCode 或:
SELECT TeacherName, Sex, AcadName INTO NewTable2
FROM T_Teacher INNER JOIN T_Academy ON T_Teacher.AcadCode= T_Academy.AcadCode
6.使用DELECT语句练习删除操作
1)删除NewTable1表中学生用书量(StuBookNum)和教师用书量(TeaBookNum)之和低于60的记录。
DELETE FROM NewTable1 WHERE StuBookNum+TeaBookNum<60
2)删除NewTable2表中姓“王”和姓“杨”的记录。
DELETE FROM NewTable2
WHERE LEFT(TeacherName,1)='王'OR LEFT(TeacherName,1)='杨' 或:
DELETE FROM NewTable2
WHERE TeacherName LIKE '王%' OR TeacherName LIKE '杨%'
3)删除NewTable1中“体育部”教师的订书记录。
DELETE FROM NewTable1
WHERE TeacherCode IN (SELECT T_Teacher.TeacherCode From T_Teacher INNER JOIN T_Academy ON T_Teacher.AcadCode=T_Academy.AcadCode Where AcadName='体育部' )
7.使用INSERT语句练习插入操作
1)在NewTable2表中添加一条记录,姓名:吴清、性别:女、学院名称:计算机科学与技
术学院。
INSERT INTO NewTable2(TeacherName,Sex,AcadName) VALUES('吴清','女','计算机科学与技术学院')
2)将T_Teacher表中姓“王”和姓“杨”的记录添加到NewTable2表中。
INSERT INTO NewTable2
SELECT TeacherName,Sex,AcadName
FROM T_Teacher INNER JOIN T_Academy ON T_Teacher.AcadCode=T_Academy.AcadCode
WHERE LEFT(TeacherName,1)='王' OR LEFT(TeacherName,1)='杨'
8.使用UPDATE语句修改数据
1)将2000年以前(不包括2000年)入校的、职称为助教的教师职称(TitleCode)往上提一级。
UPDATE T_Teacher SET Title='讲师'
WHERE Title='助教' AND YEAR(EnterDate)<2000
2)修改订书数量。要求:所有学院名称中包含汉字“工”的学院所属的教师所订的学生定书量减少3本、教师定书量增加3本。
UPDATE T_BookOrder
SET StuBookNum=StuBookNum-3,TeaBookNum=TeaBookNum+3 WHERE TeacherCode IN
(SELECT T_BookOrder.TeacherCode
FROM T_BookOrder,T_Academy,T_Teacher
WHERE T_BookOrder.TeacherCode= T_Teacher.TeacherCode
AND T_Teacher.AcadCode= T_Academy.AcadCode AND AcadName LIKE '%工%' )
3)将订书量超过300本的教材库存量增加500本。
UPDATE T_BookInfo SET StockNum=500
WHERE BookCode IN (SELECT BookCode FROM T_BookOrder )
10.3 实验三 SQL Server的视图、存储过程和触发器
一.实验目的
本实验主要了解SQL Server视图、存储过程和触发器的基本概念和使用方法。通过本实验,读者将学会在企业管理器中创建、修改、执行和删除存储过程的操作以及在查询分析器中执行的T-SQL语句;掌握触发器的创建、修改和删除的操作方法和T-SQL语句。掌握视图的创建、修改和删除的操作方法和T-SQL语句。
二.实验环境
? Microsoft SQL Server 2000 企业管理器和Microsoft SQL Server 2000 查询分析器 ? Book数据库
三.实验内容
1.创建存储过程proc_book1,查询指定学院的教师预订教材的情况。要求显示教材名称(T_BookInfo.BookName)、教师姓名(T_Teacher.TeacherName)和教材数量(T_BookOrder.StuBookNum+T_BookOrder.TeaBookNum)。 (1)查询条件为:学院代码
CREATE PROC proc_book1 @acode char(6) AS
SELECT BookName, TeacherName,StuBookNum+TeaBookNum AS 数量 FROM T_Teacher INNER JOIN (T_BookOrder INNER JOIN T_BookInfo ON T_BookOrder.BookCode= T_BookInfo.BookCode) ON T_Teacher.TeacherCode=T_BookOrder.TeacherCode WHERE T_Teacher.AcadCode=@acode
--执行存储过程proc_book1,查询学院代号为'02'的教师预订教材的信息。 EXEC proc_book1 '02' 或:
EXEC proc_book1 @scode='02'
(2)查询条件为:学院名称
CREATE PROC proc_book1_2 @aname varchar(50) AS
SELECT BookName, TeacherName,StuBookNum+TeaBookNum AS 数量 FROM T_Academy,T_Teacher,T_BookOrder,T_BookInfo WHERE T_Academy.AcadCode=T_Teacher.AcadCode
AND T_Teacher.TeacherCode=T_BookOrder.TeacherCode AND T_BookInfo.BookCode=T_BookOrder.BookCode AND T_Academy.AcadName=@aname
--执行存储过程proc_book1_2,查询学院名称为'人文学院'的教师预订教材的信息。 EXEC proc_book1_2 '人文学院' 或
EXEC proc_book1_2 @scode='人文学院'
2.创建存储过程proc_book2,查询指定教材的预订数量。
统计条件为:教材代码
CREATE PROCEDURE proc_book2 @tcode char(20) AS
SELECT SUM(StuBookNum)+SUM(TeaBookNum) FROM T_BookOrder GROUP BY BookCode HAVING BookCode=@tcode
--执行存储过程proc_book2,统计教材代号为'010004'的预订信息。 exec proc_book2 '100001'
3.创建添加教材信息的存储过程proc_book3。
CREATE PROCEDURE proc_book3 (@bookcode char(6),@bookname varchar(40), @publishercode varchar(2),@author varchar(40), @publisherdate datetime,@price money, @isbncode char(20),@stocknum smallint, @booksort char(20)) AS BEGIN
INSERT INTO T_BookInfo
VALUES(@bookcode,@bookname,@publishercode,@author, @publisherdate,@price, @isbncode,@stocknum,@booksort) END
--执行存储过程proc_book3
EXEC proc_book3 '500001','信息系统管理技术','31','谭浩强','2007-05-11',30,'760211008',30,'计算机'
4.创建存储过程proc_book4,查询指定教材名称和出版社名称的教材所对应的教材代号和库存。
CREATE PROCEDURE proc_book4
@bookname varchar(40),@publisher varchar(40),
@bookcode char(6) OUTPUT,@stocknum smallint OUTPUT AS
SELECT @bookcode=BookCode,@stocknum=StockNum FROM T_BookInfo INNER JOIN T_Publisher
ON T_Publisher.PublisherCode=T_BookInfo.PublisherCode WHERE T_Publisher.Publisher=@publisher AND BookName=@bookname
--执行存储过程proc_book4
DECLARE @bookcode char(6),@stocknum smallint
EXEC proc_book4 'C语言程序设计','电子工业出版社',@bookcode OUTPUT,@stocknum OUTPUT PRINT '该教材的代号'+CAST(@bookcode AS char(6)) PRINT '该教材的库存'+STR(@stocknum)
5.创建触发器tri_book1,在对T_Teacher表进行插入、修改和删除记录时,都会自动显示表中的内容。
CREATE TRIGGER tri_book1 ON T_Teacher
FOR INSERT,UPDATE,DELETE AS