--自定义函数
--自定义函数分为:标量函数和表值函数(内联表值函数和多语句表值函数)
--标量函数:只返回一个基础类型数据的值,这样的函数叫做标量函数
--表值函数:返回一个table类型的结果集
--标量函数语法
--create function 函数名
--([参数列表])
--returns 返回值类型
--as
--begin
-- ...函数体语句
-- return 返回值
--end
--练习:把根据性别,求全班数学平均分封装成一个函数
create function Fun_GetAvgMathByGender(@gender nvarchar(1))
returns float
as
begin
declare @count int
set @count=0
declare @sum int
set @sum=0
declare @bitgender bit
if(@gender='男')
begin
set @bitgender=1
end
else
begin
set @bitgender=0
end
select @count=count(1) from score join student on student.id=score.stuId where gender=@bitgender
select @sum=SUM(math) from score join student on student.id=score.stuId where gender=@bitgender
declare @average float
set @average=@sum/@count
return @average
end
--函数调用,函数名前要加dbo.
select dbo.Fun_getAvgMathByGender('男')
--注意:1.SQL中自定义函数必须有返回值
-- 2.在自定义函数中,不允许修改基表内容,也就是说不允许
-- 在函数中使用insert、update、delete语句
-- 3.如果参数列表中有多个参数,每个参数之间用,隔开
-- 4.函数调用,函数名前要加dbo.
--内联表值函数
--语法:
--create function 函数名
--([参数列表])
--reeturns table
--as
--return(一条select语句)
--练习:根据性别,查询所有该性别所有的学生的学号,姓名,年龄,班级名,班主任
create function Fun_getStudeentInfoByGender(@gender bit)
returns table
as
return (select stuNo,stuName,DATEDIFF(year,birthday,GETDATE()) as age,
clsName,clsTeacher
from student join Class on student.clsId=Class.Id where gender=@gender)
--1.内联表值函数return后边只能有一条select语句
--2.内联表值函数as后边不能跟begin...end
--3.调用内联表值函数是,需要向查询视图一样对待
select * from dbo.Fun_getStudeentInfoByGender(0)