常规技术面试题(数据库)
* <> <> <> 触发器的作用?
它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。
* 什么是存储过程?用什么来调用? <>
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯
SQL语句执行要快。可以用一个“execute 存储过程名 参数”命令来调用存储过程。
* 索引的作用?和它的优点缺点是什么?。 <>
数据库的搜索引擎可以利用它加速对数据的检索。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。
缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
* 主键和索引的区别? <>
1.主键时为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引;
2.数据表中只允许有一个主键,但是可以有多个索引;
3.使用主键数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率;
4.索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描;
5.唯一索引则标识该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。
* 什么是内存泄漏? <>
一般我们所说的内存泄漏指的是堆内存的泄漏。当应用程序用关键字new
等创建对象时,就从堆中为它分配一块内存,使用完后由于某种原因程序未释放或无法释放,造成系统内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。
* 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? <>
我是这样做的,尽可能使用约束,如check,
主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
* 什么是事务? <>
事务就是被绑定在一起作为一个逻辑工作单元的SQL
语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过
ACID测试,即原子性,一致性,隔离性和持久性。
* 什么是锁? <>
在所有的DBMS
中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
* 什么叫视图? <>
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是由一个表或者多个表的行或列的子集。它使得我们获取数据更容易,相比多表查询。
* 视图创建和使用语法?
1.首先判断是否存在
if exists (select * from sysobjects where name = '视图名')
drop view View_EdsProd
Go
2. 创建视图
create view View_EdsProd as select * from Tab_EdsProd where Mid>1(条件) go
3. 使用视图
select *from View_EdsProd
* 游标是什么? <>
游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览需要的数据。
* 你能向我简要叙述一下SQL Server <>中使用的一些数据库对象吗?
表、索引、视图、存储过程、触发器、用户定义函数、数据库关系图、全文索引。
* NULL <>是什么意思?
NULL(空)这个值表示UNKNOWN(未知):它不表示“”(空字符串)。不能把任何值与一个 UNKNOWN值进行比较,都会生产一个NULL值。您必须使用
IS NULL操作符。
* 什么是索引,有哪些索引,具体怎么用? <>
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL
Server可以快速有效地查找与键值关联的行。
索引分为聚集索引和非聚集索引。
在数据库系统中建立索引主要有以下作用:
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
* SQL Server <>里有什么类型的索引?
在SQL Server里,它们有两种形式:
聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。每个表格有多个非聚集索引。
* 什么是主键? <>
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。
* 什么是外键? <>
外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(可能是同一个表格)
里的一系列相连的字段。那么这些相连的字段就是外键。
* 什么是触发器? <>
触发器是一种专用类型的存储过程,它被捆绑到SQL Server 的表格或者视图上。
* SQL Server <>有什么不同类型的触发器?
有INSTEAD-OF和AFTER两种触发器。例如,如果有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行更新语句,那么
INSTEAD-OF-UPDATE触发器里的代码会执行,而不是执行更新语句则不会执行操作。AFTER触发器要在DML
语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
* 您如何确保一个带有名为Fld1 <>字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
第一个答案是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只允许有已经在另一表格里的某个字段里定义了的值。通常是另外一个表格的主键。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。
* 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑? <>
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
* 你可以用什么来确保表格里的字段只接受特定范围里的值? <>
可以使用Check约束,它在数据库表格里定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,可能会在某些情况下影响到性能。
* 概述存储过程及其优缺点。
存储过程是一个预编译的sql语句 ,编译后可多次使用
优势:响应时间上来说有优势,可以给我们带来运行效率提高的好处,且使用存储过程的系统更加稳定
缺点:维护性较差,相对于简单sql,存储过程并没有什么优势,并且在进行调试时比较困难
* 什么是相关子查询? <>如何使用这些查询?
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会请求外部查询的值,从而形成一个类似于循环的状况。
* 什么是SQL <>注入式攻击?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL
命令。比如:攻击者在用户名字和密码输入框中输入"'或'1'='1"之类的内容。最后得到的SQL命令可能变成:SELECT * from Users WHERE
login = '' or '1'='1' AND password = '' or '1'='1'
。这时,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
* 如何防范SQL <>注入式攻击?
只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。
⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。
第二:删除用户输入内容中的所有连字符。
第三:对于用来执行查询的数据库帐户,限制其权限。
⑵ 用存储过程来执行所有的查询。
⑶ 限制表单或查询字符串输入的长度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。
⑸ 将用户登录名称、密码等数据加密保存。
⑹ 检查提取数据的查询所返回的记录数量。
* 默认的系统数据库有哪些? <>
1)master数据库(主);2)tempdb数据库(临时);3)model 数据库(模板);4)msdb数据库(计划任务);
* 默认创建一个数据库,会生成哪些文件? <>
1)主文件(.mdf),2)日志文件(.ldf),无次要文件(.ndf)。
* 创建数据库时,能不能把数据文件和日志文件分开? <>
可以分开,起到优化作用。把数据文件放到高速读写区,把日志文件放到低速读写区。
* 什么是索引覆盖(Index Covering) <>查询?
索引覆盖(Index Covering)查询是指数据可以只通过索引获取,而不用接触表。
* 存储过程和触发器的区别? <>
触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关
* 存储过程和函数的区别? <>
存储过程是用户定义的一系列SQL语句的集合,,而函数通常是数据库已定义的方法,具体区别如下:
1.对于存储过程来说可以返回参数,而函数只能返回值或者表对象.
2.函数必须有返回值,存储过程可有可无
3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用.
* 聚集索引和非聚集索引区别 <>
聚集索引,数据按索引顺序存储,中子结点存储真实的物理数据
非聚集索引,存储指向真正数据行的指针
* 索引的优缺点,什么时候使用索引,什么时候不能使用索引? <>
索引最大的好处是提高查询速度,
缺点是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。
* 数据库的优化 <>
1.创建适当的索引
2.对sql语句优化
使用exists或not exists代替in或not in
使用存储过程
用union替换or(适用于索引列)
where代替having,having 检索完所有记录,才进行过滤
使用select top或set rowcount来限制操作的行
避免嵌套查询
对多个字段进行等值查询时,联合索引
* 数据库的主从复制 <>
默认异步复制,容易造成主库数据和从库不一致
一个数据库为Master,一个数据库为slave,通过Binlog日志来实现
slave两个线程,一个线程去读master binlog日志,写到自己的中继日志
一个线程解析日志,执行sql
master启动一个线程,给slave传递binlog日志
半同步复制
只有把master发送的binlog日志写到slave的中继日志,这时主库才返回操作完成的反馈,性能有一定降低
并行复制
slave 多个线程去请求binlog日志
* long_query <>怎么解决
设置参数,开启慢日志功能,得到耗时超过一定时间的sql
(1)slow_query_log 这句是开启记录慢查询功能,slow_query_log=0关闭;slow_query_log=1开启(这个1可以不写)
(2)long_query_time = 1 这句是记录超过1秒的SQL执行语句
* varchar <>和char的使用场景
用来存储字符
varchar适用字符长度经常变的
char适用字符长度固定的
* 数据库连接池的作用 <>
维护一定数量的连接,减少创建连接的时间
更快的响应时间
统一的管理
* 分库分表,主从复制,读写分离 <>
读写分离,读从库,写主库
spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。
* 数据库三范式 <>
1NF 属性不可分
2NF 非主键属性,完全依赖于主键属性
3NF 非主键属性无传递依赖
* 数据库中join <>的inner join, outer join, cross join
以A,B两张表为例 A left join B
选出A的所有记录,B表中没有的以null 代替
right join 同理
inner join
A,B的所有记录都选出,没有的记录以null代替
cross join (笛卡尔积)
A中的每一条记录和B中的每一条记录生成一条记录
例如A中有4条,B中有4条,cross join 就有16条记录
* 有哪些锁,select <>时怎么加排它锁
乐观锁,悲观锁,排它锁,共享锁,更新锁,表锁,行级锁。
乐观锁:乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。
悲观锁:悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制
排它锁: 可以防止并发事务对资源进行访问。
共享锁: 允许并发事务在封闭式并发控制下读取资源。
更新锁:是共享锁和排他锁的结合。
行级锁:单独的一行记录加锁
表锁:锁住整个表,可以同时读,写不行
在Select语句中加for update是给相应的行增加排他锁。Select出来的数据别的事务不能读取,不能修改、不能删除。
* 死锁怎么解决 <>
找到进程号,kill 进程
产生死锁的原因:
一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。
产生死锁的必要条件是:
1、互斥条件;
2、不可剥夺条件(不可抢占);
3、部分分配;
4、循环等待。
根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施:
1、采用资源静态分配策略,破坏"部分分配"条件;
2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件;
3、采用资源有序分配法,破坏"环路"条件。
解除死锁常常采用下面两种方法:1、资源剥夺法;2、撤消进程法
* 最左匹配原则 <>
最左匹配原则是针对索引的
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,这里我们可以简单的理解为先是对name
字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,查询条件where name=’xxx’ and age=xx
这时的话,就利用到索引了。因为创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name
字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的age字段进行排序。其实就相当于实现了类似 order by name age
这样一种排序规则。所以:第一个name字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个age
字段进行条件判断是用不到索引的,当然,可能会出现上面的使用index类型的索引。这就是所谓的为什么要强调最左匹配原则的原因。
* SqlServer <>是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的.
SQL Server 数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。
* sqlserver数据库中常用的聚合函数有哪些?
Max(),Avg(),Count(),Min(),Sum()。
中文:最大值,平均值,数据条数,最小值,总和。
* 数据库主键、外键、约束、索引的作用是什么?有几种连表查询方式?
主键、外键及约束的作用:保证数据的完整性
索引的作用:索引是一个数据结构,用来快速访问数据库表格或者视图里的数据,加快数据库的搜索引擎对数据的检索效率
方式:左连接、右连接、内连接、自连接
* 除了sqlserver存储过程实现分页,还有什么实现方法?
利用select top 和select not in进行分页
利用select top 和 select max(列)
利用Row_number()给数据行加上索引
利用临时表及Row_number