学习sqlserver的存储过程、触发器、函数
数据库存储结构学习
T-sql的一些语法
declare @arg char(8) 声明 变量(变量以@开头) 类型
set @arg='123' 给变量赋值
set @arg=(select ID from user) 给变量赋值
sqlserver的insert、update、delete注意事项
insert:插入一条数据时,会生成一个临时表inserted
update:更新一条数据时,没有临时表updated,有临时表inserted
delete:删除一条数据时,会生成一个临时表deleted
select中的条件语句示例:当性别用1,0表示时,查询结果中的性别使用【男】【女】显示
select
case
when sex=1 then '男'
when sex=0 then '女'
end,
max(age),avg(age)
from emp
group by sex
having sex=0
简单总结【存储结构】【触发器】【函数】的作用
1、存储结构:在数据库中定义好方法(由sql语句构成),在需要的地方直接 exec 调用。优点:sql语句复用,自定义查询方法逻辑
2、触发器:当执行【增删查改】时自动触发的sql语句
3、函数:执行一些自定义小功能,例如judge(age)函数,返回字符串【青年】还是【老年】,类似max、avg函数
存储过程
存储过程在【数据库】下的【可编程性】【存储过程】创建
作用:在数据库层面创建方法,执行SQL语句,实现自定义高级查询功能。例如:只写一条语句,当有参数【学生姓名】时,查单条;当没有参数【学生姓名】时,查所有。
调用:exec 【存储过程】【参数】
存储结构基础语法
-- 目的:调用存储结构,输入【姓名参数】查找学生的【ID,学生姓名,年龄】信息并返回
use library
drop PROCEDURE queryAll2
GO
CREATE PROCEDURE queryAll2 @name char(8)=NULL-- 添加方法参数并设默认值
-- 添加全局参数
AS
BEGIN
SET NOCOUNT ON;
if @name is not NULL
-- Insert statements for procedure here
SELECT ID,学生姓名,年龄 from 学生表 where 学生姓名=@name
else
SELECT ID,学生姓名,年龄 from 学生表
END
GO
-- 调用存储结构
exec queryAll2 -- 或者
EXEC queryAll2'ls'
带输入输出参数的存储结构
-- 目的:调用存储结构,只传入一个【性别】参数,输出性别为【男】或【女】学生的【平均年龄】和【最大年龄】
use library
GO -- GO的作用:隔离sql语句,表示事务可以提交
drop PROCEDURE queryAll3
GO
CREATE PROCEDURE queryAll3
@sex char(8), -- 添加方法参数
@AVGage float OUTPUT,
@MAXage float OUTPUT
AS
BEGIN
select @AVGage=AVG(年龄) from 学生表 where 性别=@sex
select @MAXage=MAX(年龄) from 学生表 where 性别=@sex
END
GO
-- 执行使用存储结构
declare @sex char(8),@out_AVGage float,@out_MAXage float -- 连续声明三个变量
set @sex='男' -- 给输入参数赋值
exec queryAll3 @sex,@out_AVGage output,@out_MAXage output -- 执行输入输出方法,有output
select @sex as 性别,@out_AVGage as 平均年龄,@out_MAXage as 最大年龄
目的:判断表、存储结构、触发器是否存在,如果存在则删除
GO
if exists(select * from sysObjects where name='queryAll3')
begin
drop PROCEDURE queryAll3
select'已删除'
end
GO
SQL日期运算
dateadd 在向指定日期加上天数,返回新的 datetime 值
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
datediff 返回两个日期天数差值
select datediff(day,'2004-09-01','2004-09-18') --返回:17
触发器
触发器在表下面【触发器】创建
作用:当执行insert、update、delete操作时,触发事件执行额外操作,例如插入一条数据时,同时生成一条插入历史记录
调用:自动触发
执行时间和方式
例如:AFTER insert 在插入数据后执行
instead of delete 替代delete语句,执行delete操作时进入该事件
-- 目的:当有人借书添加记录时,判断书是否存在,并自动记录借书时间和还书时间
SET ANSI_NULLS ON -- select * from table where arg!=NULL查不出结果
GO
-- sql关键字允许通过加‘’的形式做变量
-- select 'name' 与 select name 的结果相同,off时,select 'name'显示不出数据
SET QUOTED_IDENTIFIER ON
GO
if exists(select * from sysObjects where name='borrowbook')
drop TRIGGER borrowbook
Go
CREATE TRIGGER addstudent
ON borrow
AFTER insert
AS
BEGIN
SET NOCOUNT ON; -- 开启返回影响条数
declare @BID int,@bookID int,@borrowDate date,@returnDate date
set @BID=(select ID from inserted)
set @bookID=(select bookID from inserted)
set @borrowDate=GETDATE()
set @returnDate=dateadd(day,90,@borrowDate)
if exists(select * from book where ID=@bookID)
begin
update borrow set returnDate=@returnDate where ID=@BID
end
else
begin
rollback
print('图书不存在')
end
END
GO
-- 调用
insert into borrow(bookID,name) values(9,'zs') -- 插入借书数据,参数【书名】、【借书人】
用户自定义函数
作用:自定义类似sum、Max、avg、dateadd的函数
创建:通过【数据库】【可编程性】【函数】【标量值函数】创建
-- 基础模板
CREATE FUNCTION 函数名 --创建标量函数
[({@形参名 数据类型}[,...n])] --括号内输入参数
RETURNS 数据类型 --定义返回标量值的数据类型
[WITH 选项]
AS
BEGIN
T-SQL语句 --函数体
RETURN 标量表达式
--返回RETURNS子句中定义的数据类型的单个数据值
END
示例(知识:1、不区分大小写2、begin end相当于{}隔离语句3、Go开启事务4、如何删除【函数】)
-- 目的:调用judge(age)函数,返回字符串'少年''青年''中年''老年'
if exists(select * from sys.objects where name = 'judge')
drop FUNCTION dbo.judge -- 删除定义的函数
use library
Go
-- 基础模板
create FUNCTION dbo.judge(@age int) --创建标量函数
RETURNS nvarchar(50) --定义返回标量值的数据类型
AS
BEGIN
declare @result nvarchar(50)
if @age > 17
set @result='青年'
else if @age > 30
set @result='中年'
else if @age > 60
set @result='老年'
else
set @result='少年'
RETURN @result
END
GO
-- 使用函数
select name,age,sex,dbo.judge(age) from emp