一 存储过程的优点
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
优点:
1.模块化编程
2.有很强的灵活性,可以用流控制语句编写,可以完成复杂的判断和复杂的运算。
3.在首次运行时被编译,生成执行计划,可以改善性能,在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
4.可以降低网络的通信量
5.通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
6.可维护性高,可以只修改存储过程,不修改程序。
7.可以重复使用
二 数据库范式
范式是符合某一种级别的关系模式的集合。
第一范式:数据库中的每一列都是不可分割的数据项。
第二范式:数据库中的每一行都可唯一区分。(即实体属性完全依赖于主关键字)
第三范式:一个表中不包含已在其他表中包含的非主关键字的信息。(即实体属性不依赖于其他非主属性)。否则会出现数据冗余。
三 触发器
触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。
目的是强化约束,维护数据的一致性和完整性。
触发器与普通存储过程的不同之处在于:触发器的执行是由事件触发的,而普通存储过程是由命令调用执行的。
SQL Server提供了两种触发器选项:
1.DML触发器 当数据库服务器中发生数据操作语言(DML)事件时要执行的操作。
DML事件包括对表或视图发出的update,insert,delete语句。
DML触发器用于在数据被修改时强制执行业务规则,以及扩展SQL server约束,默认值和规则的完整性检查。
2.DDL触发器 2005新增触发器类型,在相应数据定义语言(DDL)语句是触发。
可以用于在数据库中执行管理任务。
例如,审核以及规范数据库操作。
create alter drop时触发。
四 为维护数据的完整性,喜欢用触发器还是自写业务逻辑?
1.约束,check,主键约束,外键约束,非空字段。
2.触发器
3.自写业务逻辑
五 事务和锁
事务是包含一组数据库操作的逻辑工作单元,用于保证数据的一致性和可恢复性。是不可分割的整体,要么一起被执行,要么回滚到执行事务之前的状态。
BEGIN TRANSACTION
COMMIT
ROLLBACK
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
独立性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
当事务要对指定的数据块进行读取,修改或删除操作时,需要确定这些数据块不会同时被其他事务所修改。有多种级别和模式。
共享锁,独占锁,更新锁,意向锁,架构锁,大容量更新锁。
六 脏读 脏数据
脏读指一个事务读取其他事务正在更新的数据,如果第二个事务的更新过程尚未完成,则第一个事务所读取到的只是一个过程中的数据,而并非真实的数据。
脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。
七 模糊查询
SQL提供了四种匹配模式:
1. % 表示任意0个或多个字符。如下语句:Select * FROM user Where name LIKE '%三%'; 将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来。%三:表示左匹配。三%:表示右匹配。
%三%:表示模糊查询。
2. _ 表示任意单个字符。语句: Select * FROM user Where name LIKE '_三_';只找出“唐三藏”。这样name为三个字且中间一个字是“三”的; Select * FROM user Where name LIKE '三__'; 只找出“三脚猫”这样name为三个字且第一个字是“三”的;
3. [ ] 表示括号内所列字符中的一个(类似与正则表达式)。语句:Select * FROM user Where name LIKE '[张李王]三'; 将找出“张三”、“李三”、“王三”(而不是“张李王三”); 如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e“。Select * FROM user Where name LIKE '老[1-9]';将找出“老1”、“老2”、……、“老9”;如要找“-”字符请将其放在首位:'张三[-1-9]';
4. [^ ] 表示不在括号所列之内的单个字符。语句:Select * FROM user Where name LIKE '[^张李王]三';将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;Select * FROM user Where name LIKE '老[^1-4]'; 将排除“老1”到“老4”寻找“老5”、“老6”、……、“老9”。
最后是重点!由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”、“';”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数: function sqlencode(str) str=replace(str,"';","';';") str=replace(str,"[","[[]") ';此句一定要在最先 str=replace(str,"_","[_]") str=replace(str,"%","[%]") sqlencode=str end function 在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:如Select * FROM user Where name LIKE '老[^1-4]';上面《'》老[^1-4]《'》是要有单引号的,别忘了,我经常忘!
八 CHARINDEX
CHARINDEX函数的作用:
返回字符或者字符串在另一个字符串中的起始位置。
CHARINDEX函数语法:
CHARINDEX ( expression1 , expression2 [ , start_location ] )
expression1:要查找的字符串
expression2:待查找的字符串
start_location:开始查找的位置
九 时间日期函数
1. 当前系统日期、时间
select getdate()
2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
3. datediff 返回跨两个指定日期的日期和时间边界数。
select datediff(day,'2004-09-01','2004-09-18') --返回:17
4. datepart 返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(month, '2004-10-15') --返回 10
5. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, '2004-10-15') --返回:星期五
6. day(), month(),year() --可以与datepart对照一下
select
当前日期=convert(varchar(10),getdate(),120)
,当前时间=convert(varchar(8),getdate(),114)
select datename(dw,'2004-10-15')
select 本年第多少周=datename(week,'2004-10-15')
,今天是周几=datename(weekday,'2004-10-15')
十 SQL中replace函数
REPLACE ( string_expression , string_pattern , string_replacement )
用第三个表达式替换第一个表达式中出现的所有第二个表达式