SQL 数据库 面试题 总结

一  存储过程的优点

存储过程(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 )

用第三个表达式替换第一个表达式中出现的所有第二个表达式

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(SQL 数据库 面试题 总结)