索引
(1)索引的概念:索引是数据库帮助数据库获取数据的数据结构,好比书的目录,加快数据库的查询速度。
(2)索引的分类:
①主键索引PRIMARY KEY:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。注意:一个表只能有一个主键
②唯一索引UNIQUE:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。可以通过ALTER TABLE table_name ADD UNIQUE (column)
③普通索引 INDEX:这是最基本的索引,它没有任何限制
④组合索引,指多个字段创建的索引,只有在查询条件中使用了创建索引的第一个字段,索引才会被使用
⑤上述几种可能在不同数据里叫法不一样,但是原理基本都是一样的(3)索引的作用:加快数据的查找速度,提高数据库的性能
(4)索引常识:

①索引是越多越好吗?每张表都必须加索引吗?
答:索引会占储存空间,使用错误的索引使用不当不仅不会提高系统性能还会造成资源浪费。不是每张表都需要加索引的,比如我们有一些表就几十条甚至几条数据直接查询的速度非常快,使用索引完全没有必要。所以不是索引越多越好也不是每张表都需要加索引
②怎么增加索引?
答:增加索引有2种办法,第一种在数据库的可视化界面找到对应需要加索引的表,点击展开,可以看到索引的项–右键新增索引–在弹出的界面输入索引的名称、选择是否唯一、选择是否聚合或是非聚合(聚合也叫组合)–添加需要添加索引的字段
第二种用语句增加索引:
CREATE INDEX 索引名 ON 表名(列名1,列名2,…),列如:CREATE INDEX name_index ON index_table(name),此为在index_table表上的name列上创建一个索引name_index也可以通过修改表来进行创建索引,语法为:ALTER TABLE tablename ADD INDEX [索引的名字] (列名)
③我们建好索引以后需要我们操作吗?
答:不需要,我们在表上把索引加上,至于怎么提高查询的效率,这就不是我们关心的了,数据库系统会在我们查询时自动使用索引的,具体怎么操作的网上有很多的文章可以看看,因表数据大而查询慢时我们就可以加上索引,然后什么二分法查数据啥的就交给数据库了,你只要正确的建了表索引,数据库查询时就会自动使用
④什么叫做重建索引
答:在我理解来看,其实我们创建的索引就是一物理键,我们创建在表上的索引,最终会同时存在在另一张表(索引表)上,而索引表和数据的物理地址相关联,这大概就是索引的本质,所谓的索引重建并不是重建我们添加到表上的索引,而是重新分配计算我们的索引表,将多余的索引碎片清理、整理,从而提高索引的执行效率(个人理解,不代表啥)
⑤索引会不会失效
答:索引在某些情况是会失效的,对于创建的组合索引,不是使用的第一部分就不会使用索引,比如我们给A、B2列加上了索引(注意顺序先A后B),select * from XX where B=YY,这样索引是不会生效的,但是如果为select * from XX where A=YY 这样索引就会生效,一般来说where中存在A数据库就会启用索引,哪怕是where B=YY AND A=ZZ,这样也会生效,因为数据会将这个写法改为where A=ZZ AND B=YY。其次就是对于like查询,以aaa%查询索引生效的,但是%aaa索引不生效的,最后是在where条件中使用or连接关键字、is null 、is not null以及in、not in等等都会让索引失效(因为会进行全表扫描,索引不起作用)

视图
视图
(1)视图概念:简单来说就是一个查询语句的封装,其结果可以看做是一 个临时表
(2)视图的作用:
①安全,不直接操作基表,避免必要的问题,保证数据的安全
②简化查询操作,比如一个比较复杂的查询不想每次都写很多语句, 就可以写个视图。
③快速获取数据,假如一个职员他只关心某部分数据,他就可以写个视图XX,下次直接写select * from XX,就可以很快的获取数据
(3)创建视图的语法:CREATE VIEW 视图名称(一般为这个格式:vw_c_Ybilldraftidx)

约束
约束的基本语法:
ALTER TABLE 表名 ADD CONSTRAINT 约束名字 约束的类型及条件
约束分类
(1)默认约束
答: 我们一般新建表字段是都喜欢加一个IS NOT NULL,而伴随约束的就是我们的默认值,这种我们叫做默认值约束,也就是如果出现IS NOT NULL,我们就给他指定一个值。
①新增默认约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名字 DEFAULT 默认值 FOR 添加约束的字段
②删除默认约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名字 DEFAULT 默认值 FOR 添加约束的字段
③修改默认约束
ALTER TABLE 表名 ALTER CONSTRAINT 约束名字 DEFAULT 默认值 FOR 添加约束的字段
(2)主键约束
答:主键约束:就是对一个列进行了约束,约束为非空、不重复
格式为:alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)
例子:alter table emp add constraint ppp primary key (id)
(3)check约束:
就是给一列的数据进行了限制比方说,年龄列的数据都要大于20的表名(emp) 列名(age)
格式:alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)
例子:alter table emp add constraint xxx check(age>20)
(4)unique约束:
这样的约束就是给列的数据追加的不重复的约束类型
格式:alter table 表名 add constraint 约束名称 约束类型(列名),比方说可以给ename列加个unique,让ename列的数据不重复
例子:alter table emp add constraint qwe unique(ename)
(5)外键约束

触发器
触发器:
(1)触发器概念:通过事务来触发某一操作
(2)触发器分类:
①After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用 Rollback Transaction语句来回滚本次的操作。
②Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。
(3)触发器常识:
①在SQL Server里,每个DML触发器都分配有两个特殊的表,一个是Inserted表,一个是Deleted表。它们两个存在于数据库服务器的内存中,是由系统管理的逻辑表,是两个临时表,而不是真正存储在数据库中的物理表。用户对这两个表只有读取的权限,没有修改的权限。
②Inserted和Deleted两个表的作用:
Inserted:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。
Deleted:对于更新记录操作来说,删除表里存放的是被更新记录;对于删除记录操作来说,删除表里存入的是被删除的旧记录。
例子:

ALTER TRIGGER [dbo].[delOrderdrfdetail] ON [dbo].[OrderBill]
 FOR delete
 AS
 delete from OrderDraft where orgsmb_id in (select smb_id from deleted)


AFTER跟FOR相同,不可在视图上定义AFTER触发器,更多时候写的都是for

储存过程
储存过程
–写好储存过程后是怎么将数据库执行的结果返回到客户端的?
答:①我们不要被return给误导了,我们执行存储过程客户端控件直接调用的是数据的储存过程,如exec ts_e_StockCheckMx 0,0,0,0,0,0,’’,‘2020-11-04’,2,’’,0,0,这样然后将结果直接解析给客户端展示的
–什么是储存过程
②储存过程就是一堆查询语句,跟视图差不多,只不过视图不带参数,而储存过程带参数而已,然后结合if else 以及各种分支机构语句、
查询语句等构成
–存储过程的基本知识
①新建一个储存过程

create procedure ts_e_StockCheckMx
 (
 @参数名字 数据类型
 )
 ②as的用法规则,表示定义完成开始正文,不写程序报错
 ③
 LEFT JOIN 当有多张表时的逻辑关系是怎么样的?
 SELECT * FROM A
 LEFT JOIN B
 ON A.1=B.1
 LEFT JOIN C
 ON A.2=C.1


最后的结果为A+A与B的交集+A与C的交集,执行顺序从上往下
如果第一条数据为inner JOIN 那么表A将会变为A与B的交集而不是单纯的A了
但如果为left JOIN 那么A依旧为A