sql数据库习题
看了你的题,首先几个表需要说明一下Out_Goods和In_Goods在定义表时少了Sh_address列,列的属性参考Provider表中的Address
问题解答:
问题1、自定义一个函数,计算供货商编号为PD001所提供产品的平均价格,如果平均价格〉70,则输出“价格适中”;如果平均价格<=70,则输出价格较低。
CREATE FUNCTION [dbo].[fn_calc_avg_price]
(
@PID char(10) = 'PD001'-----------货商编号,此处默认值为PD001
)
RETURNS varchar(50) AS
BEGIN
DECLARE @vchPriceDesc varchar(50)
DECLARE @mnyPriceAvg money
SELECT @mnyPriceAvg = AVG(PPrice)
FROM Proct WHERE PID = @PID
IF (@mnyPriceAvg > 70) SET @vchPriceDesc = '价格适中'
IF (@mnyPriceAvg <= 70) SET @vchPriceDesc = '价格较低'
RETURN @vchPriceDesc
END
问题2、创建一个内联表值函数,返回一个时间段内的出货信息,要求包括出货商品名称、供货商名称、出货价格、出货数量、出货日期。
CREATE FUNCTION [dbo].[fn_get_out_goods_info]
(
@dtBeginTime datetime, --------------------------时间段的起始时间
@dtEndTime datetime --------------------------时间段的终止时间
)
RETURNS @TempTable table
(
out_proct_name varchar(20),
out_provider_name varchar(20),
out_proct_price money,
out_proct_num int,
out_date datetime
)
AS
BEGIN
INSERT INTO @TempTable
SELECT
Proct.PName,
Provider.ProviderName,
Out_Goods.OutPrice,
Out_Goods.OutNum,
Out_Goods.OutDate
FROM
Proct, Provider, Out_Goods
WHERE
Provider.ProviderId = Out_Goods.ProviderId
AND Proct.PId = Out_Goods.PId
AND Out_Goods.OutDate <= @dtEndTime
AND Out_Goods.OutDate >= @dtBeginTime
RETURN
END
问题3、创建一个after触发器,当Provider 供货商信息表中的ProviderId发生更改时,同时更改In_Goods进货信息表和Out_Goods出货信息表ProviderId字段的值。
CREATE TRIGGER [trig_update_proID]
ON [dbo].[Provider]
AFTER UPDATE
AS
IF UPDATE(ProviderID)
BEGIN
UPDATE In_Goods SET ProviderID = (SELECT ProviderID FROM INSERTED) WHERE ProviderID = (SELECT ProviderID FROM DELETED)
UPDATE Out_Goods SET ProviderID = (SELECT ProviderID FROM INSERTED) WHERE ProviderID = (SELECT ProviderID FROM DELETED)
END
问题4、定义一个存储过程,要求使用游标,计算某段时间内售出产品的平均价格。
坦白的说,其实没必要使用游标,既然用了,那就顺便用下WHILE循环好了
CREATE PROCEDURE [dbo].[sp_calc_part_sales_price]
(
@dtBeginTime datetime,
@dtEndTime datetime
)
AS
DECLARE @mnyTotalPrice money
DECLARE @mnyCurPrice money
DECLARE @nCount int SELECT @nCount = 0
DECLARE cursPrice CURSOR LOCAL
FOR SELECT OutPrice FROM Out_Goods WHERE Out_Goods.OutDate <= @dtEndTime AND Out_Goods.OutDate >= @dtBeginTime
OPEN cursPrice
FETCH NEXT FROM cursPrice INTO @mnyCurPrice
WHILE @@FETCH_STATUS=0
BEGIN
SET @nCount = @nCount + 1
SET @mnyTotalPrice = @mnyTotalPrice + @mnyCurPrice
FETCH NEXT FROM cursPrice INTO @mnyCurPrice
END
IF @nCount = 0 SELECT 0 AS '平均价格'
IF @nCount > 0 SELECT @mnyTotalPrice/@nCount AS '平均价格'
OK,就这样吧,如果有不明白或者我写错的地方,再联系,Good Luck!
2. SQL数据库练习题
1. SQL Server 2000是典型的关系型数据库产品。 ( 1 )
2. 在一台计算机上可以同时运行多个版本的SQL Server。 ( 1 )
3. 在SQL Server中日志文件是维护数据库完整性的重要工具。 ( 0 )
4. 在定义数据表时,定义某列为标识列的关键字是Identity。 ( 1 )
5. 浮点数据类型的优点是能够存储范围非常大的数字,但容易发生误差。 ( 0 )
6. 数据库完整性的目的是为了防止错误信息输入和输出。 ( 0 )
7. 在Update语句中,一次可以更新多个表。 ( 0)
8. 尽量使用Select * ,可以加快查询速度。 ( 0 )
9. 在SQL Server 2000中表示注释可以用类似C语言的/*...*/和//。 ( 0 )
10. 在SQL Server中,RTRIM函数删除字符串右边的空白字符。 ( 1 )
11. 一个表只能有一个聚集索引(簇索引)。 ( 1 )
12. SQL查询语言中,如果没有指定排序方式,则默认是升序方式。 ( 1 )
13. 在SQL Server 2000中ntext类型的字段不能进行排序操作。 ( 0 )
14. 在SQL Server 2000中bit类型的字段不能建立索引。 ( 1 )
15. 在被定义为唯一索引的列上的数据不能有重复的值。 ( 1 )
16. 在被定义为唯一索引的列上的数据不允许空。 ( 0可以的但是只能有一个null值 )
17. 在SQL Server中,每张表都应该建立一个索引,以提高查询速度。 ( 0 )
18. 视图在SQL Server中是一张虚拟表。 ( 1 )
19. 当一个视图由2个以上基本表构成时,不能进行删除视图中的数据。 ( 0 )
20. 在SQL Server中,触发器是一种特殊的存储过程。 ( 1 )
21. 由于存储过程是解释执行,所以每次执行时都要检查是否有语法错误。 ( 0 )
22. 可以在用户正在使用的数据库上执行数据库恢复操作。 ( 0 )
1表示正确
3. 数据库,SQL查询题目
--基础题
--1.查询读者最喜爱的3种图书分类号,即借阅表中出现最多的3类图书分类号
SELECT TOP 3 [分类号] FROM [图书] JOIN [借阅] ON [图书].[图书编号]=[借阅].[图书编号]
GROUP BY [分类号] ORDER BY COUNT(*) DESC
--附加题
--1.查询小于20岁的读者最喜欢的3类图书
SELECT TOP 3 [书名] FROM [读者] JOIN [借阅] ON [读者].[借书证号]=[借阅].[借书证号]
JOIN [图书] ON [图书].[图书编号]=[借阅].[图书编号]
WHERE [年龄]<20 GROUP BY [书名] ORDER BY COUNT(*) DESC
--2.查询至少借阅了 宁静 所借图书(书名相同)的人的姓名
SELECT [姓名] FROM [读者] WHERE [姓名]<>'宁静' AND [借书证号] IN(SELECT [借书证号] FROM [借阅]
WHERE [图书编号] IN(SELECT [图书编号] FROM [读者] JOIN [借阅] ON [读者].[借书证号]=[借阅].[借书证号] WHERE [姓名]='宁静'))
--3.查询借阅了多于3本书且每本书价均高于60的读者的借书证号
SELECT [借书证号]
FROM [借阅] JOIN [图书] ON [图书].[图书编号]=[借阅].[图书编号]
WHERE [单价]>60 GROUP BY [借书证号] HAVING COUNT(*)>3
GO
--4.假定读者表中所有人姓名均不多于4个汉字,请建立一个查询语句,要求根据名字中任意1个或两个或3个或4个汉字,即可找到该读者的详细信息(即完全模糊查询)
CREATE PROCEDURE CX
@XM VARCHAR(8) AS
IF LEN(@XM)=1 SELECT * FROM [读者] WHERE @XM LIKE '['+RTRIM([姓名])+']'
ELSE IF LEN(@XM)=2 SELECT * FROM [读者] WHERE LEFT(@XM,1) LIKE '['+RTRIM([姓名])+']' AND RIGHT(@XM,1) LIKE '['+RTRIM([姓名])+']'
ELSE IF LEN(@XM)=3 SELECT * FROM [读者] WHERE LEFT(@XM,1) LIKE '['+RTRIM([姓名])+']' AND SUBSTRING(@XM,2,1) LIKE '['+RTRIM([姓名])+']' AND RIGHT(@XM,1) LIKE '['+RTRIM([姓名])+']'
ELSE IF LEN(@XM)=4 SELECT * FROM [读者] WHERE LEFT(@XM,1) LIKE '['+RTRIM([姓名])+']' AND SUBSTRING(@XM,2,1) LIKE '['+RTRIM([姓名])+']' AND SUBSTRING(@XM,3,1) LIKE '['+RTRIM([姓名])+']' AND RIGHT(@XM,1) LIKE '['+RTRIM([姓名])+']'
GO
4. sql数据库一道试题帮忙做做
---1) 创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话
CREATE TABLE student
(
[id] [int] IDENTITY(1,1) NOT NULL,
[student_id] [nvarchar](50) NULL,
[studen_name] [nvarchar](50) NULL,
[age] [int] NULL ,
[sex] [nvarchar](5) NULL,
[address] [nvarchar](200) NULL,
[tel] [nvarchar](20) NULL
)
--2) 修改学生表的结构,添加一列信息,学历 ecation
alter table student add ecation nvarchar(10) NULL
--3) 修改学生表的结构,删除一列信息,家庭住址
alter table student drop column address
--5) 修改学生表的数据,将电话号码以11开头的学员的学历改为“大专”
update student set ecation='大专' where tel like '11%'
--6) 删除学生表的数据,姓名以C开头,性别为‘男’的记录删除
delete student where studen_name like 'C%' and sex='男'
--7) 查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号示出来
select studen_name,student_id from student
where age<12 and ecation='大专'
--8) 查询学生表的数据,查询所有信息,列出前25%的记录
select TOP 25 PERCENT * from student
--9) 查询出所有学生的姓名,性别,年龄降序排列
select studen_name,sex,age from studen order by age desc
--10) 按照性别分组查询所有的平均年龄
select avg(age) as age from studen group by sex