一.数据库概念
1. 约束
多表查询sql语句面试题约束有几种?
主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。
2. 表连接
表的连接方式有几种?内外连接的差别?
内连接(inner join),外连接(outer join),交叉连接(cross join)。
内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中
两个表的所有行都将返回。
外连接又分为哪几种?
左(外)连接(left outer join /left join),右(外)连接(right outer join / right join),全外连接(full outer join / full join)
左(外)连接(left outer join /left join),右(外)连接(right outer join / right join),全外连接(full outer join / full join)
3. 索引
索引有几种?他们的区别是什么?
聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
聚簇索引的顺序就是数据的物理存储顺序,而非聚簇索引的索引顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。
索引有几种?他们的区别是什么?
聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
聚簇索引的顺序就是数据的物理存储顺序,而非聚簇索引的索引顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。
4. 存储过程
为什么要使用存储过程?
1.允许模块化程序设计。
为什么要使用存储过程?
1.允许模块化程序设计。
2.允许更快执行。
3.减少网络流量。
4.可作为安全机制使用。
3.减少网络流量。
4.可作为安全机制使用。
5. 事务
简单描述事务的概念和特性
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
简单描述事务的概念和特性
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
如何判断事务中语句是否出错?
利用@@error判断是否出错
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
如何判断事务中语句是否出错?
利用@@error判断是否出错
6. 数据库范式
数据库设计的一、二、三范式是什么?
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
数据库设计的一、二、三范式是什么?
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
7. 锁和死锁
为什么要引入锁
多个用户同时对数据库的并发操作时会带来丢失更新,脏读等数据不一致的问题。锁的分类
为什么要引入锁
多个用户同时对数据库的并发操作时会带来丢失更新,脏读等数据不一致的问题。锁的分类
1. 从数据库系统的角度来看:分为独占锁(即排它锁(X)),共享锁(S)和更新锁(U)
2. 从程序员的角度看:分为乐观锁和悲观锁。
死锁是怎么产生的?
死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。
如何避免死锁
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;如:在TRANSACTION语句中加入TRY…CATCH语句
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL Server事务的默认级别。不推荐强行加锁
2. 从程序员的角度看:分为乐观锁和悲观锁。
死锁是怎么产生的?
死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。
如何避免死锁
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;如:在TRANSACTION语句中加入TRY…CATCH语句
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL Server事务的默认级别。不推荐强行加锁
二.SQL SERVER
1、数据类型
列举SQL中几种常用的数据类型,并说明char(100),varchar(100), nvarchar(100)的差别?
Int,bit,varchar,nvarchar,datetime…
Char为定长,varchar和nvarchar为变长,nvarchar存储unicode, 为双字节,实际存储长度是200。
2、临时表和表变量
什么是临时表?
临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。
列举SQL中几种常用的数据类型,并说明char(100),varchar(100), nvarchar(100)的差别?
Int,bit,varchar,nvarchar,datetime…
Char为定长,varchar和nvarchar为变长,nvarchar存储unicode, 为双字节,实际存储长度是200。
2、临时表和表变量
什么是临时表?
临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。
临时表的分类?
临时表分为本地和全局两种。
本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除。
临时表和表变量有什么区别?
本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除。
临时表和表变量有什么区别?
1. 创建的时候,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。
2. 不能在表变量上创建显式的索引,只能创建PK和UNIQUE约束
3. 一旦申明表变量,就不能修改它的定义。
4. 表变量不是外部事务的组成部分。如果修改表变量的语句执行失败,则该语句的更改会被撤销。但是,如果语句是外部事务的一部分,外部事务回滚后,对表变量已经完成的更改将不可撤销。
3、视图、CTE
简述视图、CTE
视图:是由若干基本表或其他视图构成的表的定义。未建索引的视图中的数据没有物理表现形式。
简述视图、CTE
视图:是由若干基本表或其他视图构成的表的定义。未建索引的视图中的数据没有物理表现形式。
CTE:它允许使用模块化的方法开发解决方案。可简化开发过程并减少BUG和错误的出现。
4、备份和还原
数据库的备份有几种?
数据库的备份一般都会同时拥有三种:完全备份、差异备份、事务日志备份。
4、备份和还原
数据库的备份有几种?
数据库的备份一般都会同时拥有三种:完全备份、差异备份、事务日志备份。
5、系统库、视图、过程及方法
SQL Server系统自带的数据库有哪些?系统中各个数据库的用途是什么?
SQL Server系统自带的数据库有哪些?系统中各个数据库的用途是什么?
MASTER:核心数据库
主要配合完成数据库的权限,日志,登陆信息,设定,进程管理等数据库系统与操作系统级别的服务操作
MODEL:模版数据库
主要配合完成用户自定义数据库创建时提供各种模板
MSDB:自动化任务
主要完成一些定时,预操作比如发送邮件,提示等等等等。
TEMPDB:临时缓存
请列举一些数据库中常用的系统表?
Sysobjects,syscolumns,syscomments …
请列举一些数据库中常用的系统存储过程?
请列举一些数据库中常用的系统表?
Sysobjects,syscolumns,syscomments …
请列举一些数据库中常用的系统存储过程?
Sp_helptext, sp_who, sp_who2, sp_rename…
6、错误处理
说出错误处理的两种方式(sql2005)?
说出错误处理的两种方式(sql2005)?
atch
@@ERROR
7、性能优化
列举一些会影响数据库性能的因素。
有许多因素会影响数据库的性能表现,例如:操作系统,硬件方面的因素,如内存和磁盘空间,访问数据库的应用软件。除此之外,数据库本身的设计也是一个影响性能的重要因素。
有一个数据库200G大小,每天增加50M 允许用户随时访问,制定备份策略(详细说明)。
这种情况可以采用增量备份方式。每周日做一次全备份,周一到周六作增量备份(由于数据量较少,可以考虑每30分钟增量备份一次)。这样可以尽量减少性能消耗,而且如果transaction log丢失的情况下,可以保证最多丢失30分钟数据。
列举一些会影响数据库性能的因素。
有许多因素会影响数据库的性能表现,例如:操作系统,硬件方面的因素,如内存和磁盘空间,访问数据库的应用软件。除此之外,数据库本身的设计也是一个影响性能的重要因素。
有一个数据库200G大小,每天增加50M 允许用户随时访问,制定备份策略(详细说明)。
这种情况可以采用增量备份方式。每周日做一次全备份,周一到周六作增量备份(由于数据量较少,可以考虑每30分钟增量备份一次)。这样可以尽量减少性能消耗,而且如果transaction log丢失的情况下,可以保证最多丢失30分钟数据。
比较下列语句的性能优越性。(红为较优化方案)
1.常量优化
sal > 24000/12
sal > 24000/12
sal*12 > 24000
如果SQL语句包括第一种情况,优化器会简单地把它转变成sal > 2000。
如果SQL语句包括第一种情况,优化器会简单地把它转变成sal > 2000。
优化器不会简化跨越比较符的表达式,例如第二条语句,鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。否则没有办法优化,比如如果sal上有索引,第一可以使用,第二就难以使用。
2.操作符优化
IN、NOT IN 和 EXISTS、NOT EXISTS
select col1,col2,col3 from t1 where col2 not in (‘a’,’b’,’c’)
select col1,col2,col3 from t1 where not exists (select * from t1 where col2 = ‘a’ or col2 = ‘b’ or col2 = ‘c’)
用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,NOT IN操作符是强列不推荐使用的,因为它不能应用表的索引。相应的可用EXISTS和NOT EXISTS代替。
UNION 和 UNION ALL
2.操作符优化
IN、NOT IN 和 EXISTS、NOT EXISTS
select col1,col2,col3 from t1 where col2 not in (‘a’,’b’,’c’)
select col1,col2,col3 from t1 where not exists (select * from t1 where col2 = ‘a’ or col2 = ‘b’ or col2 = ‘c’)
用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,NOT IN操作符是强列不推荐使用的,因为它不能应用表的索引。相应的可用EXISTS和NOT EXISTS代替。
UNION 和 UNION ALL
假定tbl1 和tbl2 没有重复数据
select * from tbl1
select * from tbl1
union
select * from tbl2
select * from tbl1
union all
select * from tbl2
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。当不会产生重复的记录时采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
> 及 < 操作符(大于或小于操作符)
假定一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。
A>2与A>=3比较
因为A>2时,会先出为2的记录索引再进行比较,而A>=3时,则直接到=3的记录索引。
A>2与A>=3比较
因为A>2时,会先出为2的记录索引再进行比较,而A>=3时,则直接到=3的记录索引。
LIKE操作符
COL LIKE ‘%5400%’
COL LIKE’A5400%’ OR COL LIKE’B5400%’
COL LIKE ‘%5400%’
COL LIKE’A5400%’ OR COL LIKE’B5400%’
LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。COL LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成COL LIKE’A5400%’ OR COL LIKE’B5400%’ 则会利用表的索引进行两个范围的查询,性能肯定大大提高。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论