一、实验目的:
(1)熟练掌握数据库创建、表和视图的创建、数据的插入、修改、删除、查询操作、数据完整性、触发器的创建、执行操作。
(2)掌握SQL语句常见语法错误的调试方法。
二、实验内容:
按照下列要求操作,并截取相应的结果图。要求所有的查询必须有结果,如果没有符合条件的记录,请插入符合条件的记录,再次截取相应的结果图。
综合练习
1、使用Transact- SQL语句建立一个图书读者数据库,数据库名为TSGL。
2、在图书管理数据库TSGL中创建三个表:图书信息表(tblBooks)、读者信息表(tblReaders)和借阅信息表(tblLending),表中各列的要求如下:
图书信息表tblBooks
字段名称 字段类型 说明
BookID 字符串,长度为20 图书唯一的编号,主键
Bname 字符串,长度为50 图书的名称,唯一性
Author 可变字符串,长度为30 图书编著者的名称
Press 可变字符串,长度为30 图书的出版社
Price money 图书的定价
读者信息表tblReaders
字段名称 字段类型 说明
ReaderID 字符串,长度为10 读者唯一编号,主键
Rname 字符串,长度为8 读者姓名,非空值
Sex 字符串,长度为2 读者性别,默认取值为男,取值只能为男或女
Department 可变字符串,长度为30 读者所在部门
Phone 字符串,长度为8 读者办公电话
借阅信息表tblLending
字段名称 字段类型 说明
ReaderID 字符串,长度为10 读者编号,外键,读者信息表
BookID 字符串,长度为20 图书编号,外键,图书信息表
Borrowdate DATE 借出日期,非空值
Returndate DATE 归还日期,归还日期晚于借出日期
主键(ReaderID , BookID)
图书信息表tblBooks:
BookID Bname Author Press Price
TP311.138DFG 网络数据库实用教程 石大鑫 机械工业出版社 23.00
TP311.138SQ SQL Server 2012实用教程 董建斌 机械工业出版社 25.00
TP311.138SQZA SQL Server实训 郑启芬 清华大学出版社 18.00
TP311.138WJ 数据库程序设计 刘韵华 电子工业出版社 38.00
TP311.138XZQ SQL Server 2012数据库系统管理 赵志清 人民邮电出版社 45.00
TP393.4LZX ASP.NET案例开发 陈正熙 机械工业出版社 45.00
读者信息表tblReaders:
ReaderID Rname Sex Department Phone
R200801001 王平 男 应用技术系 88907508
R200801002 张丽萍 女 软件技术系 88907522
R200801003 王辉 男 应用技术系
R200801004 李建伟 男 软件技术系 88907522
R200801005 程炎 女 软件技术系
R200801006 李丽 女 应用技术系
借阅信息表tblLending:
ReaderID BookID Borrowdate Returndate
R200801001 TP311.138SQ 2008-08-23 2008-11-20
R200801001 TP311.138SQZA 2008-08-12 2008-11-09
R200801001 TP393.4LZX 2008-09-06 2008-12-03
R200801002 TP311.138WJ 2008-08-23 2008-11-20
R200801005 TP311.138SQ 2008-08-23 2008-11-20
R200801005 TP311.138XZQ 2008-09-18
================================================
CREATE DATABASE TSGL
USE TSGL
CREATE TABLE tblBooks
(BookID CHAR(20) PRIMARY KEY,
Bname CHAR(50) UNIQUE,
Author VARCHAR(30),
Press VARCHAR(30),
Price MONEY );
INSERT INTO tblBooks
VALUES (‘TP311.138DFG’, ‘网络数据库实用教程’, ‘石大鑫’,‘机械工业出版社’,‘23.00’),
(‘TP311.138SQ’, ‘SQL Server 2012实用教程’, ‘董建斌’,‘机械工业出版社’,‘25.00’),
(‘TP311.138SQZA’,‘SQL Server实训’, ‘郑启芬’,‘清华大学出版社’,‘18.00’),
(‘TP311.138WJ’, ‘数据库程序设计’, ‘刘韵华’,‘电子工业出版社’,‘38.00’),
(‘TP311.138XZQ’, ‘SQL Server 2012数据库系统管理’,‘赵志清’,‘人民邮电出版社’,‘45.00’),
(‘TP393.4LZX’, ‘ASP.NET案例开发’, ‘陈正熙’, ‘机械工业出版社’,‘45.00’);
CREATE TABLE tblReaders(
ReaderID CHAR(10)PRIMARY KEY,
Rname CHAR(8)NOT NULL,
Sex CHAR(2) CHECK (Sex IN (‘男’,‘女’)),
Department VARCHAR(30),
Phone CHAR(8)
);
INSERT INTO tblReaders
VALUES (‘R200801001’,‘王平’,‘男’,‘应用技术系’,‘88907508’),
(‘R200801002’,‘张丽萍’,‘女’,‘软件技术系’,‘88907522’),
(‘R200801003’,‘王辉’,‘男’,‘应用技术系’,NULL),
(‘R200801004’,‘李建伟’,‘男’,‘软件技术系’,‘88907522’),
(‘R200801005’,‘程炎’,‘女’,‘软件技术系’,NULL),
(‘R200801006’,‘李丽’,‘女’,‘应用技术系’,NULL);
CREATE TABLE tblLending(
ReaderID CHAR(10),
BookID CHAR(20),
Borrowdate DATE,
Returndate DATE,
PRIMARY KEY (ReaderID,BookID),
FOREIGN KEY (ReaderID) REFERENCES tblReaders(ReaderID),
FOREIGN KEY (BookID) REFERENCES tblBooks(BookID)
);
INSERT INTO tblLending
VALUES (‘R200801001’,‘TP311.138SQ’,‘2008-08-23’,‘2008-11-20’),
(‘R200801001’,‘TP311.138SQZA’,‘2008-08-12’,‘2008-11-09’),
(‘R200801001’,‘TP393.4LZX’,‘2008-09-06’,‘2008-12-03’),
(‘R200801002’,‘TP311.138WJ’,‘2008-08-23’,‘2008-11-20’),
(‘R200801005’,‘TP311.138SQ’,‘2008-08-23’,‘2008-11-20’),
(‘R200801005’,‘TP311.138XZQ’,‘2008-09-18’,NULL);
SELECTFROM tblBooks
SELECTFROM tblReaders
SELECT*FROM tblLending
–3、向读者表加入一个新读者,读者的信息为:读者号‘R200801010’,姓名“王小平”,性别“女”。
INSERT INTO tblReaders
VALUES (‘R200801010’,‘王小平’,‘女’,NULL,NULL)
–4、向借阅表插入一个借阅记录,表示读者“王小平”借阅了一本书,图书号为‘TP311.138WJ’,借出日期为当天的日期,归还日期为空值。
INSERT INTO tblLending
VALUES (‘R200801010’,‘TP311.138WJ’,GETDATE(),NULL)
–5、读者“王小平”在借出上述图书10天之后归还该书。
UPDATE tblLending
SET Returndate=getdate()+10
WHERE ReaderID=‘R200801010’
AND BookID=‘TP311.138WJ’
SELECT * FROM tblLending
--6、当读者“王小平”按期归还图书时,删除上述借阅记录。
DELETE FROM tblLending
WHERE ReaderID=(SELECT ReaderID
FROM tblReaders
WHERE Rname=‘王小平’)
–7、将所有“机械工业出版社”的图书加价10%
SELECT * FROM tblBooks
UPDATE tblBooks
SET Price=Price*1.1
WHERE Press=‘机械工业出版社’
–8、删除价格大于100元的图书。
DELETE FROM tblBooks
WHERE Price>100
–9、查询全部图书的信息,其中单价打8折,并设置该列的别名为‘打折价’。
SELECT BookID,Bname,Author,Press ,Price*0.8 ‘打折价’
FROM tblBooks
–10、查询出版的图书信息,查询结果按照图书的定价降序排列。
SELECT * FROM tblBooks
ORDER BY Price DESC
–11、 查询全部图书的图书号、书名、作者、出版社和单价。
SELECT BookID,Bname,Author,Press,Price
FROM tblBooks;
–12、 查询全部图书的信息,其中单价打8.5折,并设置该列的别名为‘打折价’。
SELECT BookID,Bname,Author,Press,Price*0.85 ‘打折价’
FROM tblBooks
SELECT * FROM tblBooks
–13、 显示所有被借阅图书的图书号,并去掉重复行。
SELECT BOOKID
FROM tblLending
GROUP BY BookID
–14、 查询所有单价在20~40之间的图书信息。
SELECT * FROM tblBooks
WHERE Price BETWEEN 20 AND 40
--15、 查询所有单价不在20~40之间的图书信息。
SELECT * FROM tblBooks
WHERE Price NOT BETWEEN 20 AND 40
–16、 查询机械工业出版社、电子工业出版社、人民邮电出版社的图书信息。
SELECT *
FROM tblBooks
WHERE Press IN (‘机械工业出版社’,‘电子工业出版社’,‘人民邮电出版社’)
–17、 查询既不是机械工业出版社,也不是电子工业出版社的图书信息。
SELECT *
FROM tblBooks
WHERE Press NOT IN (‘机械工业出版社’,‘电子工业出版社’)
–18、 查询姓名的第二个字符是‘丽’并且只有两个字符的读者号及姓名。
SELECT READERID ,RNAME
FROM tblReaders
WHERE RNAME LIKE ‘_丽’
–19、 查询所有姓‘李’并且全名为三个汉字的读者号及姓名。
SELECT READERID ,RNAME
FROM tblReaders
WHERE RNAME LIKE ‘李%’ AND RNAME NOT LIKE ‘李_’
–20、查询所有姓‘程’或姓‘李’的读者号及姓名。
SELECT READERID ,RNAME
FROM tblReaders
WHERE RNAME LIKE ‘程%’ OR RNAME LIKE ‘李%’
–21、查询所有不姓‘程’或‘李’的读者号及姓名。
SELECT READERID ,RNAME
FROM tblReaders
WHERE RNAME NOT LIKE ‘程%’ AND RNAME NOT LIKE ‘李%’
–22、查询无归还日期的借阅信息。
SELECT * FROM tblLending
WHERE Returndate is null
–23、查询有归还日期的借阅信息。
SELECT * FROM tblLending
WHERE Returndate is not null
–24、查询单价在20~40之间的机械工业出版社出版的图书名及单价。
SELECT Bname,Price
FROM tblBooks
WHERE Press=‘机械工业出版社’
AND Price>20
AND Price<40
–25、查询图书的总本数。
SELECT COUNT(*)
FROM tblBooks
–26、查询被借阅图书的总本数。
SELECT COUNT(DISTINCT BookID)
FROM tblLending
–27、查询机械工业出版社出版的图书的最高价、最低价、平均价格。
SELECT MAX(Price) ‘最高价’,MIN(Price) ‘最低价’,AVG(Price) ‘平均价格’
FROM tblBooks
WHERE Press=‘机械工业出版社’
–28、查询每个出版社的名称及其出版图书的总量。
SELECT Press,COUNT(*) ‘出版图书的总量’
FROM tblBooks
GROUP BY Press
–29、查询借阅图书数超过2本的读者号、借阅总本数,并按借阅总本数从大到小排序。
SELECT READERID,COUNT() ‘借阅总本数’
FROM tblLending
GROUP BY READERID
HAVING COUNT()>2
ORDER BY COUNT(*) DESC;
–30、查询与‘张丽萍’的办公电话相同的读者的姓名。
SELECT Rname
FROM tblReaders
WHERE Phone=(SELECT Phone
FROM tblReaders
WHERE Rname=‘张丽萍’)
–31、查询被借阅图书的基本信息及其被借阅情况。
SELECT * FROM tblBooks,tblLending
WHERE tblBooks.BookID=tblLending.BookID
–32、查询读者的读者号、姓名、借阅的图书名、借出日期及归还日期。
SELECT tblReaders.ReaderID,tblReaders.RNAME,tblBooks.BNAME,tblLending.Borrowdate,tblLending.Returndate
FROM tblLending,tblReaders,tblBooks
WHERE tblReaders.ReaderID=tblLending.ReaderID
AND tblBooks.BookID=tblLending.BookID
–33、查询借阅了机械工业出版社出版,并且书名中包含“SQL Server 2012”字符串的图书的读者,并显示读者号、姓名、书名、出版社、借出日期及归还日期。
SELECT TBLLENDING.READERID,RNAME,BNAME,PRESS,Borrowdate,Returndate
FROM tblReaders,tblLending,tblBooks
WHERE tblLending.BookID=tblBooks.BookID
AND tblLending.ReaderID=tblReaders.ReaderID
AND PRESS=‘机械工业出版社’
AND BNAME LIKE ‘%SQL Server 2012%’
–34、查询至少借阅过1本机械工业出版社出版的图书的读者号及借阅本数,并按借阅本数多少降序排列。
SELECT TBLLENDING.READERID,COUNT() ‘借阅本数’
FROM tblLending,tblBooks
WHERE tblLending.BookID=tblBooks.BookID AND PRESS=‘机械工业出版社’
GROUP BY READERID
HAVING COUNT()>=1
ORDER BY COUNT(*) DESC
–35、查询所有图书的借阅情况,要求包括被借阅了的图书和没被借阅的图书,显示他们的图书号、书名、读者姓名及借出日期。
SELECT tblBooks.BookID,Bname,Rname,Borrowdate
FROM tblBooks LEFT OUTER JOIN
(tblLending LEFT OUTER JOIN tblReaders ON (tblLending.ReaderID=tblReaders.ReaderID) )
ON (tblBooks.BookID= tblLending.BookID)
SELECT tblBooks.BOOKID,BNAME,RNAME,BORROWDATE
FROM tblLending,tblReaders,tblBooks
WHERE tblLending.ReaderID=tblReaders.ReaderID
AND tblLending.BookID=tblBooks.BookID
UNION
SELECT tblBooks.BOOKID,BNAME,NULL,NULL
FROM tblBooks
WHERE tblBooks.BookID NOT IN(SELECT BOOKID FROM tblLending)
–36、创建一个名为vwTotalCount的视图,用于查询每个读者编号、读者姓名及其借阅图书的本数。
CREATE VIEW vwTotalCount
AS
SELECT tblReaders.READERID,RNAME,COUNT(*) ‘本数’
FROM tblReaders,tblLending
WHERE tblLending.ReaderID=tblReaders.ReaderID
GROUP BY tblReaders.READERID,RNAME
SELECT * FROM vwTotalCount
–37、创建视图“VBorrowInfo”,显示书名Bname、作者Author、出版社Press、定价Price、读者编号ReaderID、读者姓名Rname、借书日期Borrowdate和还书日期Returndate。
CREATE VIEW VBorrowInfo
AS
SELECT Bname,Author,Press,Price,tblReaders.ReaderID,Rname,Borrowdate,Returndate
FROM tblBooks,tblReaders,tblLending
WHERE tblReaders.ReaderID=tblLending.ReaderID
AND tblBooks.BookID=tblLending.BookID
SELECT * FROM VBorrowInfo
–38、在数据库TSGL中创建一个与借阅信息表tblLending结构相同的表tblLending_bak,当删除借阅信息表tblLending中的记录时,自动将删除的记录存放到表tblLending_bak中。
CREATE TABLE tblLending_bak(
ReaderID CHAR(10),
BookID CHAR(20),
Borrowdate DATE,
Returndate DATE,
PRIMARY KEY (ReaderID,BookID),
FOREIGN KEY (ReaderID) REFERENCES tblReaders(ReaderID),
FOREIGN KEY (BookID) REFERENCES tblBooks(BookID)
);
CREATE TRIGGER DELETBL ON tblLending
FOR DELETE
AS
INSERT INTO tblLending_bak
SELECT * FROM deleted
DELETE FROM tblLending
WHERE ReaderID=‘R200801001’
AND BookID= ‘TP311.138SQ’
SELECT * FROM tblLending
SELECT * FROM tblLending_bak
–39、在数据库TSGL中基于读者信息表tblReaders创建一个触发器,针对INSERT 、DELETE、 UPDATE 操作,当执行INSERT、UPDATE 时,将inserted表中的数据打印出来,执行DELETE 、UPDATE 时,将deleted表中数据打印出来。
CREATE TRIGGER IDU ON tblReaders
FOR INSERT,DELETE,UPDATE
AS BEGIN
IF EXISTS (SELECT * FROM inserted)
BEGIN
SELECT * FROM inserted
END
IF EXISTS (SELECT * FROM deleted)
BEGIN
SELECT * FROM deleted
END
IF EXISTS (SELECT * FROM inserted)
AND EXISTS (SELECT * FROM deleted)
BEGIN
SELECT * FROM inserted
SELECT * FROM deleted
END
END
INSERT INTO tblReaders
VALUES (‘R200801007’,‘王燕’,‘女’,‘应用技术系’,‘NULL’)
DELETE tblReaders WHERE ReaderID=‘R200801007’
UPDATE tblReaders
SET Rname=‘王鹏’
WHERE ReaderID=‘R200801001’
SELECT * FROM tblReaders