如果有什么丢失的基础点或者描述的有错误的地方欢迎评论或者私信
这里原谅小编没有写超链接,但是可以打开目录点击同样快速访问
以后CSDN可能也不怎么更新了(个人原因),这段时间和蓝桥杯的群里以及CSDN大佬们的日常唠嗑让我获益匪浅,真的就是优秀的人连唠嗑都是在学习
1. 触发器的作用?
触发器是一个特殊的存储过程,当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器可以调用存储过程。
触发器的语句
Create Trigger[owner.]触发器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL语句(块)
End
触发器的限制:
一个表最多只能有三个触发器,insert,update,delete
每个触发器只能用于一个表
不能对视图、临时表创建触发器
Truncate table能删除表,但不能触发触发器
不能将触发器用于系统表
常见的触发器有三种:分别应用于Insert,Update,Delete事件。
2. 什么是存储过程?用什么来调用?
存储过程其实就是一个sql的方法(你就当成Java(或者C#等等)自己写的方法,调用存储过程其实就是调用方法)
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
可以用一个“execute 存储过程名 参数”命令来调用存储过程。
-------------创建名为GetUserAccount的存储过程----------------
create Procedure GetUserAccountRe2
@UserName nchar(20), //这是输入的值
@UserID int output //这是输出的值
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
select * from UserAccount
return @@rowcount //返回的值
go
-------------执行上面的存储过程----------------
exec GetUserAccountRe2 '7',null //运行的时候,因为第二个参数是输出的,所以传入一个null就可以
3.索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
索引的作用:创建索引能够大大的提高系统的性能
优点:
①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
②大大加快数据的检索速度,这也是创建索引的最主要原因
③加快表与表之间的连接,在实现数据的参考完整性方面特别有意义
④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
①创建索引和维护索引需要时间,这种时间随着数据量的增加而增加
②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大
③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。
索引是创建在数据库的表中的列上。因此,在创建索引的时候,要考虑哪些列上适合加索引,那些列上不适合加索引。
4. 主键和索引的区别?
1.主键时为了标识数据库记录唯一性,且非空,主键是一个特殊索引;
2.数据表中只允许有一个主键,但是可以有多个索引;
3.使用主键数据库会自动创建主索引,非主键也可以创建索引,提高查询效率;
4.索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描;
5. 一个表中可以有多个唯一性索引,但只能有一个主键 主键列不允许空值,而唯一性索引列允许空值
5. 什么是内存泄漏?
一般指的堆内存泄漏。当应用程序用关键字new等创建对象时(实例化对象的时候),就从堆中为它分配一块内存(我们所使用的变量是在栈里面分配一块),使用完后由于某种原因程序未释放或无法释放,造成系统内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。
6. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
首先,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。
其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。
最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
7. 什么是事务?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
事务的四大特性:
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
(只有一种结果,不是全写入数据库,就是全都没写入数据库)
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
8. 什么是锁?
在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
这里举个例子,你用着筷子就不能用刀子和叉子,你只能拿一个,鱼和熊掌不可兼得
9. 什么叫视图?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是由一个表或者多个表的行或列的子集,我们可以把某些表连接起来,合成一个新的虚拟表就是视图。
它使得我们获取数据更容易,相比多表查询。
10. 视图创建和使用语法?
1.首先判断是否存在 View_EdsProd是视图名
if exists (select * from sysobjects where name = 'View_EdsProd')
drop view View_EdsProd
Go
- 创建视图 Tab_EdsProd是一个表名
create view View_EdsProd as select * from Tab_EdsProd where Mid>1(条件) go
- 使用视图
select * from View_EdsProd
11. 游标是什么?
游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览需要的数据。
在创建游标时,最需要考虑的事情是,“是否有办法避免使用游标?” 因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写; 如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。
12. 你能向我简要叙述一下SQL Server 中使用的一些数据库对象吗?
表、索引、视图、存储过程、触发器、用户定义函数、数据库关系图、全文索引。
13. NULL是什么意思?
NULL(空)这个值表示UNKNOWN(未知):它不表示“”(空字符串)。不能把任何值与一个 UNKNOWN值进行比较,都会生产一个NULL值。您必须使用IS NULL操作符。
14. 什么是索引,有哪些索引,具体怎么用?
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。
索引分为聚集索引和非聚集索引。
在数据库系统中建立索引主要有以下作用:
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
15. SQL Server 里有什么类型的索引?
在SQL Server里,它们有两种形式:聚集索引和非聚集索引。(其实好像还有一个唯一,但这里不是重点讨论的这个)
聚集索引好比字典,我们按照拼音查字,因为后面的正文就是按照拼音分布的
按照一定规则排列的目录称为"聚集索引"。
聚集索引在索引的叶级保存数据。每个表格只会有一个聚集索引。(因为正文只能按照一种格式排列,所以只能有一个)
非聚集索引好比,查字的时候我们按照部首查字法,先找部首,再去检字部找字,有些检字部挨着的,但是正文不挨着,正文并不是这种方式排列的。这就是非聚集索引
非聚集索引在索引的叶级有一个行标识符。
每个表格有多个非聚集索引(这里就因为我们的排列与正文的排列没有直接相同,所以我们可以有很多种)。
总结了何时使用聚集索引或非聚集索引。
动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序 应 应
返回某范围内的数据 应 不应
一个或极少不同值 不应 不应
小数目的不同值 应 不应
大数目的不同值 不应 应
频繁更新的列 不应 应
外键列 应 应
主键列 应 应
频繁修改索引列 不应 应
16. 什么是主键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的,非空。
17. 什么是外键?
外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。
18. 什么是触发器?
触发器是一种专用类型的存储过程,它被捆绑到SQL Server 的表格或者视图上。
当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。具体不明白请看第一个
19. SQL Server 有什么不同类型的触发器?
有INSTEAD-OF和AFTER两种触发器。例如,如果有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是执行更新语句则不会执行操作。AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
(INSTEAD-OF是先运行触发器,触发器如果不让运行sql就不能运行,AFTER是先对表进行操作[增删改],然后再去运行触发器)
20. 您如何确保一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
第一个答案是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只允许有已经在另一表格里的某个字段里定义了的值。通常是另外一个表格的主键。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。
21. 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
22. 你可以用什么来确保表格里的字段只接受特定范围里的值?
可以使用Check约束,它在数据库表格里定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,可能会在某些情况下影响到性能。
23. 概述存储过程及其优缺点。
存储过程是一个预编译的sql语句 ,编译后可多次使用
优势:响应时间上来说有优势,可以给我们带来运行效率提高的好处,且使用存储过程的系统更加稳定
缺点:维护性较差(可移植性差(就是换数据库SQL server换mysql等等),更改输入的参数或者返回值繁琐),相对于简单sql,存储过程并没有什么优势,并且在进行调试时比较困难
24. 什么是相关子查询?如何使用这些查询?
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会请求外部查询的值,从而形成一个类似于循环的状况。
多表连接查询的效率要高于相关子查询,因为子查询走的是笛卡尔积
多表连接查询可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
25. 什么是SQL注入式攻击?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。比如:攻击者在用户名字和密码输入框中输入"‘或’1’='1"之类的内容。最后得到的SQL命令可能变成:SELECT * from Users WHERe login = ‘’ or ‘1’=‘1’ AND password = ‘’ or ‘1’=‘1’。这时,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
26. 如何防范SQL注入式攻击?
只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。
⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。
第二:删除用户输入内容中的所有连字符。
第三:对于用来执行查询的数据库帐户,限制其权限。
⑵ 用存储过程来执行所有的查询(可以把输入的当作参数带入存储过程,避免直接使用sql,可先进行过滤)。
⑶ 限制表单或查询字符串输入的长度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。
⑸ 将用户登录名称、密码等数据加密保存。
⑹ 检查提取数据的查询所返回的记录数量。
为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。
设置陷阱账号:
设置两个帐号,一个是普通管理员帐号,一个是防注入的帐号。将防注入的账号设置的很象管理员,如 admin,以制造假象吸引软件的检测,而密码是大于千字以上的中文字符,迫使软件分析账号的时候进入全负荷状态甚至资源耗尽而死机。
27. 默认的系统数据库有哪些?
1)master数据库(主);2)tempdb数据库(临时);3)model 数据库(模板);4)msdb数据库(计划任务);
28. 默认创建一个数据库,会生成哪些文件?
1)主文件(.mdf),2)日志文件(.ldf),无次要文件(.ndf)。
29. 创建数据库时,能不能把数据文件和日志文件分开?
可以分开,起到优化作用。把数据文件放到高速读写区,把日志文件放到低速读写区。
30. 什么是索引覆盖(Index Covering)查询?
索引覆盖(Index Covering)查询是指数据可以只通过索引获取,而不用接触表。
31. 存储过程和触发器的区别?
触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关
32. 存储过程和函数的区别?
存储过程是用户定义的一系列SQL语句的集合,而函数通常是数据库已定义的方法,具体区别如下:
1.对于存储过程来说可以返回参数,而函数只能返回值或者表对象.
2.函数必须有返回值,存储过程可有可无
3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用.
33. 聚集索引和非聚集索引区别
聚集索引,数据按索引顺序存储,中子结点存储真实的物理数据
非聚集索引,存储指向真正数据行的指针
34. 索引的优缺点,什么时候使用索引,什么时候不能使用索引?
索引最大的好处是提高查询速度,
缺点是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。
35. 数据库的优化
1.创建适当的索引
2.对sql语句优化
使用exists或not exists代替in或not in
使用存储过程
用union替换or(适用于索引列)
where代替having,having 检索完所有记录,才进行过滤
使用select top或set rowcount来限制操作的行
避免嵌套查询
对多个字段进行等值查询时,联合索引
36. 数据库的主从复制
默认异步复制,容易造成主库数据和从库不一致
一个数据库为Master,一个数据库为slave,通过Binlog日志来实现
slave两个线程,一个线程去读master binlog日志,写到自己的中继日志
一个线程解析日志,执行sql
master启动一个线程,给slave传递binlog日志
半同步复制
只有把master发送的binlog日志写到slave的中继日志,这时主库才返回操作完成的反馈,性能有一定降低
并行复制
slave 多个线程去请求binlog日志
37. long_query怎么解决
设置参数,开启慢日志功能,得到耗时超过一定时间的sql
(1)slow_query_log 这句是开启记录慢查询功能,slow_query_log=0关闭;slow_query_log=1开启(这个1可以不写)
(2)long_query_time = 1 这句是记录超过1秒的SQL执行语句
38. varchar和char的使用场景
用来存储字符
varchar适用字符长度经常变的
char适用字符长度固定的
39. 数据库连接池的作用
维护一定数量的连接,减少创建连接的时间
更快的响应时间
统一的管理
40. 分库分表,主从复制,读写分离
读写分离,读从库,写主库
spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。
41. 数据库三范式
1NF 属性不可分
2NF 非主键属性,完全依赖于主键属性
3NF 非主键属性无传递依赖
42. 数据库中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条记录
43. 有哪些锁,select时怎么加排它锁
乐观锁,悲观锁,排它锁,共享锁,更新锁,表锁,行级锁。
乐观锁:乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。
悲观锁:悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制
排它锁: 可以防止并发事务对资源进行访问。
共享锁: 允许并发事务在封闭式并发控制下读取资源。
更新锁:是共享锁和排他锁的结合。
行级锁:单独的一行记录加锁
表锁:锁住整个表,可以同时读,写不行
在Select语句中加for update是给相应的行增加排他锁。Select出来的数据别的事务不能读取,不能修改、不能删除。
44. 死锁怎么解决
找到进程号,kill 进程
产生死锁的原因:
一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。
产生死锁的必要条件是:
1、互斥条件;
2、不可剥夺条件(不可抢占);
3、部分分配;
4、循环等待。
根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施:
1、采用资源静态分配策略,破坏"部分分配"条件;
2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件;
3、采用资源有序分配法,破坏"环路"条件。
解除死锁常常采用下面两种方法:1、资源剥夺法;2、撤消进程法
45. 最左匹配原则
最左匹配原则是针对索引的
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,查询条件where name=’xxx’ and age=xx 这时的话,就利用到索引了。因为创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的age字段进行排序。其实就相当于实现了类似 order by name age这样一种排序规则。所以:第一个name字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个age字段进行条件判断是用不到索引的,当然,可能会出现上面的使用index类型的索引。这就是所谓的为什么要强调最左匹配原则的原因。
46. SqlServer是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的.
SQL Server 数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。
47. sqlserver数据库中常用的聚合函数有哪些?
Max(),Avg(),Count(),Min(),Sum()。
中文:最大值,平均值,数据条数,最小值,总和。
48. 数据库主键、外键、约束、索引的作用是什么?有几种连表查询方式?
主键、外键及约束的作用:保证数据的完整性
索引的作用:索引是一个数据结构,用来快速访问数据库表格或者视图里的数据,加快数据库的搜索引擎对数据的检索效率
方式:左连接、右连接、内连接、自连接
49. 除了sqlserver存储过程实现分页,还有什么实现方法?
利用select top 和select not in进行分页
利用select top 和 select max(列)
利用Row_number()给数据行加上索引
利用临时表及Row_number
使用Offset/Fetch Next实现分页(链接)