SQL习题.docx
《SQL习题.docx》由会员分享,可在线阅读,更多相关《SQL习题.docx(11页珍藏版)》请在冰豆网上搜索。
![SQL习题.docx](https://file1.bdocx.com/fileroot1/2023-4/17/1f8710de-aabd-434f-8c6f-80c2fd2e4dc5/1f8710de-aabd-434f-8c6f-80c2fd2e4dc51.gif)
SQL习题
SQL习题
商品销售数据库
Article(商品号char(4),商品名char(16),单价Numeric(8,2),库存量int)
Customer(顾客号char(4),顾客名char(8),性别char
(2),年龄int)
OrderItem(顾客号char(4),商品号char(4),数量int,日期date)
1.用SQL建立三个表,须指出该表的实体完整性和参照完整性,对性别和年龄指出用户自定义的约束条件。
(性别分成男女,年龄从10到100)。
顾客表的数据用插入语句输入数据,其它两表可用任意方式输入数据。
createtableOrderItem(顾客号char(4),商品号char(4),日期datetime,数量smallint,
primarykey(顾客号,商品号,日期),
foreignkey(商品号)referencesArticle(商品号),
foreignkey(顾客号)referencesCustommer(顾客号));
2.检索定购商品号为‘0001’的顾客号和顾客名。
selectdistinct顾客号fromOrderItem
where商品号='0001'or商品号='0002';
3.检索定购商品号为‘0001’或‘0002’的顾客号。
selectdistinct顾客号fromOrderItem
where商品号='0001'or商品号='0002';
4.检索至少定购商品号为‘0001’和‘0002’的顾客号。
(用交的方法)
select 顾客号fromOrderItemwhere商品号='0001'and顾客号in
(select顾客号fromOrderItemwhere商品号='0002');
5.检索至少定购商品号为‘0001’和‘0002’的顾客号。
(用自表连接方法)
selectX.顾客号fromOrderItemX,OrderItemY
whereX.顾客号=Y.顾客号andX.商品号='0001'andY.商品号='0002';
6.检索没定购商品的顾客号和顾客名。
select顾客号,顾客名fromCustommerwhere顾客号notin
(select顾客号fromOrderItem);
7.检索一次定购商品号‘0001’商品数量最多的顾客号和顾客名。
select顾客号,顾客名fromCustommerwhere顾客号in
(select顾客号fromOrderItemwhere商品号='0001'and数量=
(selectMAX(数量)fromOrderItemwhere商品号='0001'));
8.检索男顾客的人数和平均年龄。
selectcount(*)人数,avg(年龄)平均年龄fromCustommerwhere性别='男';
9.检索至少订购了一种商品的顾客数。
selectcount(distinct顾客号)fromOrderItem;
10.检索订购了商品的人次数。
selectcount(顾客号)fromOrderItem;
selectcount(distinct顾客号)fromOrderItem;
11.检索顾客张三订购商品的总数量及每次购买最多数量和最少数量之差。
select sum(数量),MAX(数量)-MIN(数量)fromOrderItem,Custommer
whereOrderItem.顾客号=Custommer.顾客号and顾客名='张三';
12.检索至少订购了3单商品的顾客号和顾客名及他们定购的商品次数和商品总数量,并按商品总数量降序排序。
selectCustommer.顾客号,顾客名,count(*),Sum(数量)fromOrderItem,Custommer
whereOrderItem.顾客号=Custommer.顾客号 groupbyCustommer.顾客号,顾客名
havingcount(*)>3orderby4desc;
13.检索年龄在30至40岁的顾客所购买的商品名及商品单价。
select商品名,单价fromCustommer,Article,OrderItem
whereCustommer.顾客号=OrderItem.顾客号andArticle.商品号=OrderItem.商品号
and年龄between30and40;
14.创建一个视图GM,字段包括:
顾客号,顾客名和定购的商品名,日期和金额(金额=数量*单价)。
指定用内连接方式做。
createviewGMas
selectCustommer.顾客号,顾客名,商品名,日期,单价*数量as金额
fromCustommer,Article,OrderItem
whereCustommer.顾客号=OrderItem.顾客号andArticle.商品号=OrderItem.商品号
createviewGM1as
selectCustommer.顾客号,顾客名,商品名,日期,单价*数量as金额
from(CustommerinnerjoinOrderItemonCustommer.顾客号=OrderItem.顾客号)
innerjoinArticleon Article.商品号=OrderItem.商品号
15.检索购买的商品的单价至少有一次高于或等于1000元的顾客号和顾客名。
selectCustommer.顾客号,顾客名
fromCustommer,OrderItem,Article
where Custommer.顾客号=OrderItem.顾客号and Article.商品号=OrderItem.商品号
and单价>1000
16.检索购买的购买价都高于或等于1000元的顾客号和顾客名。
selectCustommer.顾客号,顾客名fromCustommerwhere顾客号in
(select顾客号fromOrderItemwhere顾客号notin
(select顾客号fromOrderItem,Article
whereOrderItem.商品号=Article.商品号and单价<=1000))
17.检索女顾客购买的商品号,商品名和数量合计。
selectArticle.商品号,商品名,sum(数量)fromCustommer,Article,OrderItem
whereOrderItem.顾客号=Custommer.顾客号andOrderItem.商品号=Article.商品号
and性别='女'
groupbyArticle.商品号,商品名
18.检索所有的顾客号和顾客名以及它们所购买的商品号。
(包括没买商品的顾客)
selectCustommer.顾客号,顾客名,商品号
fromCustommerleftjoinOrderItemonCustommer.顾客号=OrderItem.顾客号
19.检索这样的顾客号,顾客名,他们定购了所有的商品(除法)
selectCustommer.顾客号,顾客名fromCustommerwherenotexists
(select*fromArticlewherenotexists
(select*fromOrderItem
whereOrderItem.顾客号=Custommer.顾客号andOrderItem.商品号=Article.商品号))
20.检索这样的顾客号,他们至少订购了顾客号为“0002”所订购的所有商品(除法)
selectdistinct顾客号fromOrderItemXwherenotexists
(select*fromOrderItemYwhere顾客号='0002'andnotexists
(select*fromOrderItemZwhereZ.顾客号=X.顾客号andZ.商品号=Y.商品号))
21.向Article表插入一条纪录。
删除无人购买的商品。
(检验一下刚插入的记录是否已被删除)
deletefromArticlewhere商品号notin
(select商品号fromOrderItem)
22.降低已售出的数量总合超过10件的商品单价为原价的95%。
updateArticleset单价=单价*0.95where商品号in
(select商品号fromOrderItemgroupby商品号havingsum(数量)>10)
23.建立断言:
顾客的年龄必须大于18岁。
CreateASSERTIONA1check
(notexists(select*fromCustommerwhere年龄<=18))
24.把修改商品单价的权限授给用户Wang,用户Wang可以转授该权限。
Grantupdate(单价)onArticletoWangwithgrantoption
25.把修改商品单价的权限用户Wang收回,转授出去的也级联收回。
revokeupdate(单价)onArticlefromWang cascade
SQL练习题一
问题描述:
已知关系模式:
CARD(CNO,NAME,CLASS)
借书卡关系。
CNO卡号,NAME姓名,CLASS班级
BOOKS(BNO,BNAME,AUTHOR,PRICE,QUANTITY)
图书关系。
BNO书号,BNAME书名,AUTHOR作者,PRICE单价,QUANTITY库存册数
BORROW(CNO,BNO,RDATE)
借书记录关系。
CNO借书卡号,BNO书号,RDATE还书日期
说明:
限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下12个处理:
1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和外码参照完整性约束。
2.找出借书超过5本的读者,输出借书卡号及所借图书册数。
3.查询借阅了"水浒"一书的读者,输出姓名及班级。
4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
5.查询书名包括"网络"关键词的图书,输出书号、书名、作者。
6.查询现有图书中价格最高的图书,输出书名及作者。
7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
8.将"C01"班同学所借图书的库存册数都增加100本。
9.从BOOKS表中删除当前无人借阅的图书记录。
10.建立一个视图,显示"C01"班学生的借书信息(只要求显示姓名和书名)。
11.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
12.对CARD表做如下修改:
a.将NAME最大列宽增加到10个字符(假定原为6个字符)。
b.为该表增加1列NAME(系名),可变长,最大20个字符。
------------------------------------------------------------------
1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束
--实现代码:
CREATETABLEBORROW(
CNOintFOREIGNKEYREFERENCESCARD(CNO),
BNOintFOREIGNKEYREFERENCESBOOKS(BNO),
RDATEdatetime,
PRIMARYKEY(CNO,BNO))
2.找出借书超过5本的读者,输出借书卡号及所借图书册数
--实现代码:
SELECTCNO,借图书册数=COUNT(*)
FROMBORROW
GROUPBYCNO
HAVINGCOUNT(*)>5
3.查询借阅了"水浒"一书的读者,输出姓名及班级
--实现代码:
SELECT*FROMCARDc
WHEREEXISTS(
SELECT*FROMBORROWa,BOOKSb
WHEREa.BNO=b.BNO
ANDb.BNAME=N'水浒'
ANDa.CNO=c.CNO)
4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期
--实现代码:
SELECT*FROMBORROW
WHERERDATE5.查询书名包括"网络"关键词的图书,输出书号、书名、作者
--实现代码:
SELECTBNO,BNAME,AUTHORFROMBOOKS
WHEREBNAMELIKEN'%网络%'
6.查询现有图书中价格最高的图书,输出书名及作者
--实现代码:
SELECTBNO,BNAME,AUTHORFROMBOOKS
WHEREPRICE=(
SELECTMAX(PRICE)FROMBOOKS)
7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出
--实现代码:
SELECTa.CNO
FROMBORROWa,BOOKSb
WHEREa.BNO=b.BNOANDb.BNAME=N'计算方法'
ANDNOTEXISTS(
SELECT*FROMBORROWaa,BOOKSbb
WHEREaa.BNO=bb.BNO
ANDbb.BNAME=N'计算方法习题集'
ANDaa.CNO=a.CNO)
ORDERBYa.CNODESC
8.将"C01"班同学所借图书的还期都延长一周
--实现代码:
UPDATEbSETRDATE=DATEADD(Day,7,b.RDATE)
FROMCARDa,BORROWb
WHEREa.CNO=b.CNO
ANDa.CLASS=N'C01'
9.从BOOKS表中删除当前无人借阅的图书记录
--实现代码:
DELETEAFROMBOOKSa
WHERENOTEXISTS(
SELECT*FROMBORROW
WHEREBNO=a.BNO)
10.如果经常按书名查询图书信息,请建立合适的索引
--实现代码:
CREATECLUSTEREDINDEXIDX_BOOKS_BNAMEONBOOKS(BNAME)
11.在BORROW表上建立一个触发器,完成如下功能:
如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)
--实现代码:
CREATETRIGGERTR_SAVEONBORROW
FORINSERT,UPDATE
AS
IF@@ROWCOUNT>0
INSERTBORROW_SAVESELECTi.*
FROMINSERTEDi,BOOKSb
WHEREi.BNO=b.BNO
ANDb.BNAME=N'数据库技术及应用'
12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)
--实现代码:
CREATEVIEWV_VIEW
AS
SELECTa.NAME,b.BNAME
FROMBORROWab,CARDa,BOOKSb
WHEREab.CNO=a.CNO
ANDab.BNO=b.BNO
ANDa.CLASS=N'力01'
13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出
--实现代码:
SELECTa.CNO
FROMBORROWa,BOOKSb
WHEREa.BNO=b.BNO
ANDb.BNAMEIN(N'计算方法',N'组合数学')
GROUPBYa.CNO
HAVINGCOUNT(*)=2
ORDERBYa.CNODESC
14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句
--实现代码:
ALTERTABLEBOOKSADDPRIMARYKEY(BNO)
15.1将NAME最大列宽增加到10个字符(假定原为6个字符)
--实现代码:
ALTERTABLECARDALTERCOLUMNNAMEvarchar(10)
15.2为该表增加1列NAME(系名),可变长,最大20个字符
--实现代码:
ALTERTABLECARDADD系名varchar(20)