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