sql基础
存储过程一般用在实现复杂的功能,数据操纵方面。
存储过程:一段有名子的代码块,对单表或多表的增删改查,用时进行调用
只返回单一记录集的存储过程 --> 没有输入输出的存储过程 --> 有返回值的存储过程 --> 有输入参数和输出参数的存储过程 --> 同时具有返回值、输入参数、输出参数的存储过程 --> 同时返回参数和记录集的存储过程 --> 返回多个记录集的存储过程
return @@rowcount为执行存储过程影响的行数,执行的结果是不仅插入了一条数据,还返回了一个值即 return value =1
--------------创建存储过程-----------------
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
--------------调用存储过程-----------------
EXECUTE Procedure_name '' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
--------------删除存储过程-----------------
drop procedure procedure_name --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
游标作用:
1.定位到结果集中的某一行。
2.对当前位置的数据进行读写。
3.可以对结果集中的数据单独操作,而不是整行执行相同的操作。
4.是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。
declare @ID int
declare @Oid int
declare @Login varchar(50)
--定义一个游标
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打开游标
open user_cur
while @@fetch_status=0
begin
--读取游标
fetch next from user_cur into @ID,@Oid,@Login
print @ID
--print @Login
end
close user_cur
--释放游标
deallocate user_cur
视图:视图是一张虚拟表,他所存储的不是实际数据,而是查询语句
创建:create view vw_city
as
select cityName from city
查询:select * from vw_city
局部变量:
局部变量的声明(一个@)
declare @n int --声明变量关键字为declare 然后@加变量名 后面是变量类型
declare @s varchar(36)
局部变量的赋值
set @s='f4'
set @n=@n+1 --变量的赋值有两种方法,一种是通过set,一种是select 如果变量不附初始值则默认为null,null参与计算的结果还是null,这一行的@n就等于null
select @n=age from students --如过变量通过select赋值,这里可能在表中查到很多age结果,这里只赋值查询出来的最后一个age结果,如果set使用这种方法会出错。
set @n=(select age from Students where ID='1')--亦可以这样给他赋值
全局变量:
select @@ERROR --返回最后执行的 Transact-SQL 语句的错误代码(integer)(如果最后一条语句不出错,就一直是0)
select @@IDENTITY --返回最后插入的标识值
条件语句:
if(条件表达式)
begin
语句...
end
else
begin
语句...
end
循环语句:
while
begin
语句....
break/continue
end
事务(去不了终点,回到原点)
如果你要一起执行多条语句,如果有一条失败你就可以让他们全部都撤销执行。
---bank表为转账表,MeMoney字段为我的账余额,HeMoney为朋友的账户余额,这个事务完成的是我给朋友转账
begin tran
declare @ersum int --定义这个局部变量为了记载这个事务过程中是否会出错,如果出错则最终将得不到为0的值,也就完成了我们判断这个事务是否出错过
set @ersum=0
update bank set MeMoney=MeMoney-1000 where ID=me ---从我卡里扣掉1000
set @ersum=@ersum+@@ERROR --如果不出错这里还是0,如果错了,这里将不是0
update bank set HeMoney=HeMoney+100 where ID=he ---给我朋友卡里加上1000
set @ersum=@ersum+@@ERROR --如果这里的结果是0将表明没有出错
if(@ersum<>0) --true有错,false没错
begin
rollback tran ---回滚事务
end
else
begin
commit tran --执行事务
end
触发器:
数据库中的表有所改动(添删改)是会触发一中事件
--这个例子是,删除Tb1里面的数据,把删除的数据同时备份到Tb1Bak表中
create trigger tri_bak on Tb1 --声明一个tri_bak ,如果Tb1表中的数据变化触发这个触发器
after delete ---删除完成后执行下面的操作
as
insert into Tb1Bak select * from deleted ---这里的deleted是系统自动生成的表,存放为上一次的数据库表中删除的数据。
时间函数:
--getdate 获取当前时间
select getdate()
--dateadd 原有时间加: 2013-02-17 13:20:16 此时间加12个月
select dateadd(MONTH,12,'2013-02-17 13:20:16') --返回:2014-02-17 13:20:16.000 (参数month可以改为 day,year等日期加相应的值)
--datediff 两个时间的差 (后面-前面=返回值)
select datediff(day,'2013-02-01','2013-02-18') --返回:17 (参数day可以改为 month,year等日期加相应的值)
--datepart 获取日期的某个部分整数
select DATEPART(month, '2013-2-17') --返回 2 (参数month可以改为 day,year等日期加相应的值)
--datename 获取指定部位的字符串
select datename(weekday, '2013-2-17') --返回 星期日 (参数weekday可以改为 day,year等日期加相应的值)
--day(), month(),year() 获取指定部位的字符串
select day('2013-2-15') --返回15
格式转换:
select CONVERT(varchar, getdate(), 120 ) --返回 2013-02-17 13:37:54
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') --返回 20130217133828
select CONVERT(varchar(12) , getdate(), 111 ) --返回 2013/02/17
select CONVERT(varchar(12) , getdate(), 112 ) --返回 20130217
select CONVERT(varchar(12) , getdate(), 102 ) --返回 2013.02.17
缩写:Year Yy···
查询执行顺序:
--查询组合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--连表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
(1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
(1-P)<left_table> pivot (<pivot_specification>) as <alias>
(1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查询条件
(2)where <where_pridicate>
--分组
(3)group by <group_by_specification>
--分组条件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>