SqlServer 高频面试题
主键、外键、超键、候选键的区别和用途
解答
主键是表中唯一标识一条记录的字段,不能包含NULL,一个表只能有一个主键。外键是表中指向另一表主键的字段,用于维护数据的引用完整性。超键是能够唯一标识表中记录的属性集,可能包含多个字段,而候选键是最小的超键,即不包含多余元素的超键,通常选择候选键作为主键。
为什么使用自增列作为主键?
解答
自增列作为主键可以简化数据的插入操作,避免因插入非顺序的主键值导致的索引分裂和碎片化,从而提高数据库性能。自增列也易于分配和管理,且不会与其他记录的主键冲突。
触发器的作用是什么?
解答
触发器是一种特殊的存储过程,它在特定数据库操作(如INSERT、UPDATE、DELETE)执行之前或之后自动触发执行。触发器可以用于维护数据完整性、实施复杂的业务规则、自动更新表中的数据等。
什么是存储过程?使用什么来调用?
解答
存储过程是一组为了执行特定任务而预编译的SQL语句。它们可以提高性能,因为只需编译一次,之后可以重复调用。存储过程可以通过SQL命令直接调用,也可以被应用程序通过特定的API调用来执行。
存储过程的优缺点有哪些?
解答
存储过程的优点包括提高性能(预编译)、减少网络传输、增强安全性(需要特定权限才能执行)、便于代码复用。缺点包括移植性差,因为它们通常与特定的数据库系统紧密相关。
存储过程与函数的区别是什么?
解答
存储过程是一系列为了完成特定功能的SQL语句集合,可以通过参数传递数据,并且可以有多个返回值。函数通常返回一个单一的数据值,并且在使用时作为表达式的一部分。存储过程使用更灵活,而函数则更适用于需要返回特定数据结构的场景。
视图是什么?游标是什么?
解答
视图是基于SQL查询的虚拟表,它像实际的表一样可以进行查询和更新操作,但是不存储数据,而是在查询视图时动态生成结果。游标是一种数据库对象,用于逐行处理查询结果集,常用于需要对结果集进行循环处理的场景。
视图的优缺点有哪些?
解答
视图的优点包括简化复杂的查询、提高数据安全性、实现数据逻辑抽象。缺点包括可能影响性能(尤其是在复杂的视图上执行查询时),以及在某些情况下限制了数据的更新操作。
drop、truncate、delete的区别是什么?
解答
DROP用于彻底删除表及其数据和依赖的约束、触发器、索引等。TRUNCATE快速删除表中的所有行,但保留表结构和其元数据、索引等。DELETE用于根据WHERE条件删除行,可以触发相关的删除触发器,并且可以回滚。
什么是临时表?临时表什么时候删除?
解答
临时表是在当前会话或事务中创建的表,仅对当前会话可见。当会话结束或事务提交时,临时表及其数据会自动删除。
非关系型数据库和关系型数据库的区别和优势比较是什么?
解答
非关系型数据库(NoSQL)和关系型数据库在数据模型、查询方式、扩展性等方面有本质区别。非关系型数据库通常提供更高的扩展性和灵活性,适合处理大规模分布式数据。关系型数据库则在数据一致性、复杂查询和事务管理方面表现更好。
数据库范式是什么?如何根据某个场景设计数据表?
解答
数据库范式是一套用于指导数据库设计的规范,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等,目的是减少数据冗余和提高数据完整性。设计数据表时,应根据业务需求和数据关系来确定表结构,确保满足相应的范式要求。
内连接、外连接、交叉连接、笛卡尔积等的区别是什么?
解答
内连接只返回两个表中匹配的行;外连接(左外连接、右外连接)会返回一个表的全部行,另一个表中匹配的行,不匹配的行用NULL填充;交叉连接返回两个表的笛卡尔积,即每行与另一个表中每行的组合;笛卡尔积是两个集合所有可能的组合。
varchar和char的使用场景是什么?
解答
VARCHAR适用于长度可变的数据,如用户输入的评论或描述,因为它可以根据实际内容长度存储,节省空间。CHAR适用于长度固定的数据,如性别或国家代码,因为它可以提供更快的存取速度,但会使用固定长度的存储空间。
SQL语言分类有哪些?
解答
SQL语言主要分为数据查询语言(DQL),数据操纵语言(DML),数据定义语言(DDL)和数据控制语言(DCL)。DQL用于查询数据,如SELECT;DML用于数据的增删改,如INSERT、UPDATE、DELETE;DDL用于数据库对象的定义,如CREATE、ALTER、DROP;DCL用于控制数据库访问权限,如GRANT、REVOKE。
like '%xxx%'和'xxx%'的区别是什么?
解答
LIKE '%xxx%'表示匹配包含xxx的任意字符串,无论xxx出现在哪一部分。LIKE 'xxx%'表示匹配以xxx结尾的字符串。两者在模糊匹配时使用不同的通配符,%代表任意字符出现任意次数,而_仅代表单个字符。
count(*)、count(1)、count(column)的区别是什么?
解答
COUNT()用于计算表中的总行数,包括NULL值。COUNT(1)是COUNT()的等价操作,用于计算行数。COUNT(column)用于计算特定列中非NULL值的数量。
最左前缀原则是什么?
解答
最左前缀原则是索引创建和使用的一个重要原则,它指的是在多列索引中,数据库查询优化器只会使用索引的最左部分列。这意味着如果查询条件没有使用到索引的第一个列,那么即使后面的列被使用到,索引也可能不会被利用。
索引的作用是什么?它的优点和缺点有哪些?
解答
索引的作用是加快数据检索速度,排序和分组数据,以及保证数据的唯一性。优点包括提高查询速度、加速表连接、支持数据的排序和分组。缺点包括增加存储空间、降低数据更新(INSERT、UPDATE、DELETE)的速度,以及维护索引本身需要额外的开销。
什么样的字段适合建索引?
解答
适合建索引的字段包括经常需要搜索的列、作为主键的列、经常用于连接的列、经常需要进行范围搜索的列、经常需要排序的列,以及经常使用在WHERE子句中的列。
聚集索引和非聚集索引的区别是什么?
解答
聚集索引决定了表中数据的物理存储顺序,使得相关列的数据在物理上连续存放,查询效率较高,但修改数据时可能较慢。非聚集索引指定了表中数据的逻辑顺序,但物理存储顺序与索引可能不一致,通常用于频繁更新的数据列。
SQL注入式攻击是什么?
解答
SQL注入式攻击是一种网络安全攻击手段,攻击者通过在Web表单输入域或页面请求的查询字符串中插入恶意SQL命令,欺骗服务器执行这些命令,从而获取、篡改或删除数据库中的数据。
如何防范SQL注入式攻击?
解答
防范SQL注入式攻击的方法包括:对用户输入进行过滤和验证,替换或转义特殊字符;使用预处理语句(参数化查询);限制数据库权限,使用最小权限原则;使用存储过程;以及在服务器端进行输入验证等。
内存泄漏是什么?
解答
内存泄漏是指在程序运行过程中,由于未能适当释放不再使用的内存,导致随着程序的持续运行,可用内存逐渐减少的现象。在动态内存分配的语言中,如C或C++,如果使用new分配了内存,却忘记使用delete释放,就可能发生内存泄漏。
维护数据库的完整性和一致性,使用触发器还是自写业务逻辑?
解答
维护数据库的完整性和一致性,通常首选使用数据库提供的约束,如CHECK、PRIMARY KEY、FOREIGN KEY等。其次是使用触发器,因为它们可以自动执行,确保数据的完整性和一致性,无论哪种业务逻辑访问数据库。最后考虑自写业务逻辑,但这种方法编程复杂,效率较低。
什么是事务?什么是锁?
解答
事务是一系列操作,它们作为一个整体被执行,以确保数据的完整性。如果事务中的任何操作失败,整个事务将回滚到执行前的状态。锁是数据库管理系统用来保证事务的隔离性和并发控制的一种机制,它可以防止多个事务同时修改同一数据,从而避免数据冲突。
过多索引对数据库性能的影响
解答
过多的索引虽然可以提高查询速度,但在数据的插入、更新和删除操作时,数据库引擎需要更多的时间来维护这些索引,这可能会导致性能下降。因此,需要在索引创建时进行权衡,以确保数据库操作的整体性能。
相关子查询是什么?如何使用这些查询?
解答
相关子查询是一种特殊类型的子查询,它在查询中使用外部查询的值。这种子查询通常用于WHERE或HAVING子句中,可以基于外部查询的结果来动态地定义查询条件。
操作会使⽤到TempDB
解答
TempDB是SQL Server的一个系统数据库,用于存储临时数据,如临时表和表变量。许多操作,包括创建表时的临时数据、执行某些类型的JOIN操作、使用游标以及存储过程和批处理中的一些操作,都可能会用到TempDB。
如果TempDB异常变大,可能的原因是什么,该如何处理?
解答
TempDB异常变大可能是由于大量使用临时表或返回的记录集过大造成的。处理方法包括优化查询以减少返回的数据量,使用分批处理,或者调整TempDB的大小和配置。
Index有哪些类型,它们的区别和实现原理是什么,索引有什么优点和缺点
解答
索引类型主要包括聚集索引和非聚集索引。聚集索引决定了表中数据的物理存储顺序,非聚集索引则不改变数据的物理存储顺序。索引的优点包括提高查询速度、确保数据的唯一性和排序。缺点是增加了存储空间和维护成本,降低了数据更新的速度。
Job信息可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息
解答
Job信息可以通过SQL Server的msdb数据库中的表,如sysjobs和sysjobhistory获取。系统正在运行的语句可以通过动态管理视图如sys.dm_exec_requests获取。要获取某个T-SQL语句的IO和Time等信息,可以使用SQL Server Profiler或相关的动态管理视图。
确保字段只接受特定范围内的值
解答
可以通过在字段上设置CHECK约束来确保只接受特定范围内的值。CHECK约束允许定义字段值的范围或条件,确保插入或更新数据时满足这些条件。