《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
1.SQL Server 2012提供的日期和時間函數有哪些?
答:getdate、dateadd、datediff、datename、day、month、year
2.SQL Server 2012提供的類型轉換函數有哪些?其語法格式分別是什么?
答:cast和convert
3.SQL Server 2012支持的用戶自定義函數有幾種?每一種函數的函數體是什么?返回值是什么?
答:標量函數、內聯表值函數、多語句表值函數。
標量函數的函數體是可以是一系列SQL語句,返回值是一個標量值;
內聯表值函數的函數體的一條查詢語句,返回值是查詢語句的執行結果(表);
多語句表值函數的函數體是一系列SQL語句,返回值是一個表。
4.利用系統提供的函數,完成下列操作:
(1)計算從2000年1月1日到當前日期的天數、月份數及年數。
答:select datediff(day,‘2000-1-1’,getdate()) 天數,
datediff(month,‘2000-1-1’,getdate()) 月份數,
datediff(year,‘2000-1-1’,getdate()) 年數
(2)分別計算系統當前日期加上40天和減去40天后的新日期。
答:select dateadd(day,40,getdate()) 加40天,
dateadd(day,-40,getdate()) 減40天
(3)得到“You are a student”字符串中從11開始,長度為7的子串。
答:select substring(‘You are a student’,11,7)
(4)分別計算“You are a student”和“我們是學生”字符串中字符的個數。
答:select len(‘You are a student’),len(‘我們是學生’)
(5)分別得到字符串“I am a teacher and you are students” 中左邊14個和右邊16個字符組成的字符串。
答:select left(‘I am a teacher and you are students’,14),
right(‘I am a teacher and you are students’,16)
5.游標的作用是什么?其包含的內容是什么?
答:游標提供了對查詢結果集的定位操作功能。其包含內容是查詢結果集。
6.如何判斷游標當前行指針指到了游標結果集之外?
答:使用@@fetch_status全局變量。
7.使用游標需要幾個步驟?分別是什么?其中哪個步驟是真正產生游標結果集?
答:五個主要。步驟,定義游標、打開游標、處理數據、關閉游標、釋放游標資源。打開游標。
8.關閉游標和釋放游標在功能上的差別是什么?
答:關閉游標并不真實釋放游標占用的資源,也就是游標的定義還存在,還可以通過open語句再次打開該游標進行處理。釋放游標是釋放了與該游標有關的一切資源。
上機練習
1.創建滿足下述要求的用戶自定義標量函數。
(1)查詢指定學生已經得到的修課總學分(考試及格的課程才能拿到學分),學號為輸入參數,總學分為函數返回結果。并寫出利用此函數查詢9512101學生的姓名、所修的課程名、課程學分、考試成績以及拿到的總學分的SQL語句。
答:
CREATE FUNCTION dbo.f_Sum_Credit(@sno char(7))
RETURNS int
AS
BEGIN
DECLARE @x int
SELECT @x = sum(credit) FROM SC join course c on c.cno = sc.cno
WHERE SNO = @sno and grade >= 60
RETURN @x
END
調用:
SELECT Sname, cname,credit, dbo.f_Sum_Credit(s.Sno) AS 總學分
FROM Student s join sc on s.sno = sc.sno
join course c on c.cno = sc.cno
WHERE s.Sno = ‘9512101’
(2)查詢指定系在指定課程(課程號)的考試平均成績。
答:
CREATE FUNCTION dbo.f_Avg_Grade(@dept varchar(20),@cno varchar(10))
RETURNS int
AS
BEGIN
DECLARE @x int
SELECT @x = avg(grade) FROM SC join student s on s.sno = sc.sno
where sdept = @dept and cno = @cno
RETURN @x
END
(3)查詢指定系的男生中選課門數超過指定門數的學生人數。
答:
CREATE FUNCTION dbo.f_rs(@dept varchar(20),@cnt int)
RETURNS int
AS
BEGIN
DECLARE @x int
SET @x = (select count() from student
where sdept = @dept and ssex = ‘男’
and sno in (
select sno from sc group by sno having count() > @cnt ))
RETURN @x
END
2.創建滿足下述要求的用戶自定義內聯表值函數。
(1)查詢選課門數在指定范圍內的學生的姓名、所在系和所選的課程。
答:
CREATE FUNCTION dbo.f_count(@x int)
RETURNS TABLE
AS
RETURN (
SELECT Sname, sdept, cno
FROM Student S JOIN SC ON S.Sno = SC.Sno
WHERE s.sno in (
select sno from sc
group by sno
having count(*) > @x ))
(2)查詢指定系的學生考試成績大于等于90的學生的姓名、所在系、課程名和考試成績。并寫出利用此函數查詢計算機系學生考試情況的SQL語句,只列出學生姓名、課程名和考試成績。
答:
CREATE FUNCTION dbo.f_dept(@dept varchar(20))
RETURNS TABLE
AS
RETURN (
SELECT Sname, sdept, cname,grade
FROM Student S JOIN SC ON S.Sno = SC.Sno
join course c on c.cno = sc.cno
WHERE sdept = @dept and grade >= 90 )
調用:
SELECT sname,cname,grade FROM dbo.f_dept(‘計算機系’)
3.創建滿足下述要求的用戶自定義多語句表值函數。
(1)查詢指定系年齡最大的前2名學生的姓名和年齡,包括并列的情況。
答:
CREATE FUNCTION f_TopAge(@dept varchar(20))
RETURNS @retSType table(
Sname char(10),
Sage int )
AS
BEGIN
INSERT INTO @retSType
SELECT top 2 with ties Sname, Ssex
FROM Student
WHERE Sdept = @dept
order by sage desc
RETURN
END
(2)查詢指定學生(姓名)的考試情況,列出姓名、所在系、修的課程名和考試情況,其中考試情況列的取值為:如果成績大于等于90,則為“優”;如果成績在8089,則為“良好”;如果成績在7079,則為“一般”;如果成績在60~69,則為“不太好”;如果成績小于60,則為“很糟糕”。并寫出利用此函數查詢李勇的考試情況的SQL語句。
答:
CREATE FUNCTION f_Exam(@name varchar(20))
RETURNS @retSType table(
Sname char(10),
Sdept varchar(20),
Cname varchar(20),
grade varchar(8) )
AS
BEGIN
INSERT INTO @retSType
SELECT Sname, Sdept,Cname,case
when grade >= 90 then ‘優’
when grade between 80 and 89 then ‘良好’
when grade between 70 and 79 then ‘一般’
when grade between 60 and 69 then ‘不太好’
else ‘很糟糕’
end
FROM Student s join sc on s.sno = sc.sno
join course c on c.cno = sc.cno
WHERE Sname = @name
RETURN
END
調用:
SELECT * FROM f_Exam(‘李勇’)
4.創建滿足下述要求的游標。
(1)查詢VB課程的考試情況,并按如下形式顯示結果數據:
選了VB課程的學生情況:
姓名 所在系 成績
李勇 計算機系 86
劉晨 計算機系 78
吳賓 信息系 75
張海 信息系 68
答:
declare @sname char(10),@dept char(14),@grade int
declare c1 SCROLL cursor for
select sname,sdept,grade
from student s join sc on s.sno = sc.sno
join course c on c.cno = sc.cno
where cname = ‘vb’
order by grade desc
open c1
print ’ 姓名 所在系 VB成績’
print ‘-----------------------------’
fetch next from c1 into @sname ,@dept ,@grade
while @@FETCH_STATUS = 0
begin
print @sname + @dept + cast(@grade as char(3))
fetch next from c1 into @sname ,@dept ,@grade
End
close c1
deallocate c1
(2)統計每個系的男生人數和女生人數,并按如下形式顯示結果數據。
系名 性別 人數
計算機系 男 2
計算機系 女 1
數學系 男 1
數學系 女 1
信息系 男 2
信息系 女 1
答:
declare @dept char(13),@sex char(8),@cnt int
declare c1 cursor for
select sdept,ssex,count(*) from student
group by sdept,ssex
order by sdept
print ‘系名 性別 人數’
print ‘=======================’
open c1
fetch next from c1 into @dept,@sex,@cnt
while @@FETCH_STATUS = 0
begin
print @dept + @sex + cast(@cnt as char(4))
fetch next from c1 into @dept,@sex,@cnt
end
close c1
deallocate c1
(3)列出每個系的學生信息,要求首先列出一個系的系名,然后在該系名下列出本系學生的姓名和性別;再列出下一個系名,然后在此系名下再列出該系的學生姓名和性別;以此類推,直至列出全部系。要求按如下形式顯示結果數據:
計算機系學生:
李勇 男
劉晨 男
王敏 計算機系
數學系學生:
錢小平 數學系
王大力 數學系
信息系學生:
張立 信息系
吳賓 信息系
張海 信息系
答:
declare @sname char(10),@sex char(4),@dept char(20)
declare c1 cursor for select distinct sdept from student
open c1
fetch next from c1 into @dept
while @@FETCH_STATUS = 0
begin
print rtrim(@dept) + ‘學生:’
declare c2 cursor for
select sname,ssex from student where sdept = @dept
open c2
fetch next from c2 into @sname ,@sex
while @@FETCH_STATUS = 0
begin
print @sname + @sex
fetch next from c2 into @sname ,@sex
end
close c2
deallocate c2
print ‘==============’
fetch next from c1 into @dept
end
close c1
deallocate c1
總結
以上是生活随笔為你收集整理的《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《数据库原理与应用》(第三版)第11章
- 下一篇: 《数据库原理与应用》(第三版)第13章