diff --git "a/36\351\273\204\345\230\211\346\227\272/20220829tuchuan.md.txt" "b/36\351\273\204\345\230\211\346\227\272/20220829tuchuan.md.txt" new file mode 100644 index 0000000000000000000000000000000000000000..e9bb10c57a02a4e57355389cfe64a2db05796723 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220829tuchuan.md.txt" @@ -0,0 +1 @@ +1.图床 diff --git "a/36\351\273\204\345\230\211\346\227\272/20220902-\347\263\273\347\273\237\345\222\214\344\270\211\350\214\203\345\274\217.md" "b/36\351\273\204\345\230\211\346\227\272/20220902-\347\263\273\347\273\237\345\222\214\344\270\211\350\214\203\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..45d6920232eec339c18a7efe4ecaca945ace1996 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220902-\347\263\273\347\273\237\345\222\214\344\270\211\350\214\203\345\274\217.md" @@ -0,0 +1,33 @@ +``` + + +Windows重装++++++++++++++++++++国庆节后检查,至于怎么检查嘛😂😂😂😂😂😂😂😂 +``` + + + + + + + + + +# 范式1 + +一个表总必须得有一个主键,这个主键不能够轻易的改变。 网络:确保每列的原子性。所有字段都是不可分割的原子。 + +##### -------------------------------------------------------------------------- + + + +# 范式2 + +除了满足范式1以外。其它字段必须和主键有联系。 网络:确保表中数据都和表主键有关。 + +-------------------------------------------------------------------------- + +# 范式3 + +确保每列数据都和主键直接相关而不是间接相关。 + +# \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220904\345\244\215\344\271\240sql.md.txt" "b/36\351\273\204\345\230\211\346\227\272/20220904\345\244\215\344\271\240sql.md.txt" new file mode 100644 index 0000000000000000000000000000000000000000..6e56d64d7fba23d0fdd0a1e161b0298de36c0ba8 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220904\345\244\215\344\271\240sql.md.txt" @@ -0,0 +1,54 @@ +SQL Server +概念 +数据:表示信息的文字和符号 +数据库管路系统DBMS:操纵和管理数据库的软件,用于创建、使用和维护数据库 +数据库:用来储存数据的仓库 +数据库系统:数据库系统主要由以上三部分组成 +数据库的基本组成 +表:关系 +行:记录 +列:也叫属性,字段 +关系型数据库 +关系型数据库:关系型数据库是依据关系模型来创建的数据库。关系型数据可以很好地存储一些关系模型的数据,比如一个老师对应多个学生的数据(“多对多”),一本书对应多个作者(“一对多”),一本书对应一个出版日期(“一对一”) +Mysql(目前使用最多的一种数据库、功能性较弱) +MariaDB +SqlServer(最适合入门的数据库) +PostgreSQL(功能最强大的开源数据库) +Oracle (最成功的商业数据库,同时在走下坡路) +Access(桌面数据库) +Sqlite(桌面数据库) +达梦 +金仓 +DB2 +Sybase +非关系型数据库 +非关系型数据库:关系型数据库通过外键关联来建立表与表之间的关系,非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。 +MongoDb (文档型数据库,操作或者api最像关系型数据库的非关系型数据库) +Redis (键值对数据库,内存数据库,速度极快,多用于高并发,秒杀,高缓存场景) +Hbase (列存储型数据库,多用于大数据领域) +查询语句 +基础语句 +查询:select * from XXX +平均值:avg +最大值:max +最小值:min +记数:count +类似于、像:like +前几条记录:top +位于什么区间:between...and... +去重:distinct +总和:sum +投影查询:选择返回的数据集的字段的集合 +多表查询:一次查询多个表 +连接查询:通过join 关键来从多个表中获取信息 +内连接:inner join +外连接:outer join、left join、right left +子查询:子查询常用where子句和from子句后边 select * from (select * form s1 where id = 1) +并集查询:union(查并集,自动消除重复行)union all : 不消除重复行 +交集查询:intersect +差集查询:except +更新:update XXX set yyy = a1,zzz= b2 where id= 1 +插入:insert into XXX() values(),() +删除:delete XXX where id = x +分页查询:方法一:select * from StudentInfo order by stuid offset 查第m页:n*(m-1) rows fetch next 每页n条 rows only +方法二:n:每页几条, m:第几页 -- select top N * from 表名 where 主键 not in (select top n*(M-1) 主键 from 表名) \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220905-\344\270\211\350\214\203\345\274\217.md" "b/36\351\273\204\345\230\211\346\227\272/20220905-\344\270\211\350\214\203\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..8b2fb822f2c6cdef5a5defe867204ce38a4009f8 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220905-\344\270\211\350\214\203\345\274\217.md" @@ -0,0 +1,9 @@ +Windows重装 +Windows10的镜像:next.itellyou.cn +一个8G的U盘 建议品牌U盘:闪迪、金士顿、三星、惠普、联想 +一台还比较新的电脑 +制作安装盘的工具 +三范式 +第一范式:表里面有主键 +第二范式:表里除主键以外的 都必须直接或者间接与主键有关系 +第三范式:同第二范式,只不过更苛刻,必须与主键直接有关联 或 有关系 \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220906-\346\225\260\346\215\256\345\272\223\347\232\204\344\270\211\347\247\215\345\205\263\347\263\273.md" "b/36\351\273\204\345\230\211\346\227\272/20220906-\346\225\260\346\215\256\345\272\223\347\232\204\344\270\211\347\247\215\345\205\263\347\263\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..8013ecdc8c529a36c1badaa62dda0cdd2195e13a --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220906-\346\225\260\346\215\256\345\272\223\347\232\204\344\270\211\347\247\215\345\205\263\347\263\273.md" @@ -0,0 +1,52 @@ +# 数据库表关系 +## 一对多 + +1. 一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录 + + 例如:一个班级对应多个学生,一个学生只能对应一个班级 + 班级表中的一条记录可以对应学生表的多条数据,学生表中的一条记录只能对应班级表的一条数据 + +2. 在一对多关系中需要注意以下几点: + + 添加数据时,先添加父表(class)记录,再添加子表(student)记录;(比如增加一个学生而他的班级是class3,父表没有该班级需要先添加) + 删除数据时,先删除子表(student)记录,再删除父表(class)记录;(比如删除一个学生且只有他的班级是class2,先删除学生后再删除父表的class2) +3. 在设计表时,可以遵循以下口诀: + + 一对多,两张表,多的表加外键 + + 解释一下:在一对多的关系中,存在两张表(一张父表一张子表),父表的一条数据对应子表的多条数据,那么子表(多)就需要添加上父表(一)的外键字段; + + 这样才能将两张表连接起来; + +## 一对一 +1. 一对一的关系就是一种特殊的多对多的关系,一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录 + 例如:一个学生只能对应一张学生卡,一张学生卡只能对应一个学生,那么学生和学生卡就是一对一的关系 +2. 一对一设计有两种方案: + + (1)共享主键:(不推荐) + 共享主键就是让学生表的主键和学生卡表的主键一样 + 注意: 添加数据:先添加先产生的表,后添加后产生的表记录 + 删除数据:先删除后产生的表记录,再删除先产生的表记录 + 查询数据:无需进行连接查询 + 但是一般在表的设计时尽量避免主键的相同,所以主键共享一般不会去使用,了解即可 + + (2)唯一外键:(外键加一个唯一性约束) + 唯一外键是一对一设计推荐的方法,顾名思义,也是需要给某个表添加外键,但是该外键必须有唯一性约束,通俗来说就是该外键不能有重复; +## 多对多 +1. 多对多的意思是:一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录 + 例如:一个学生可以选择多门课程,一门课程可以被多个学生选择; + + 那么这样不论给哪个表添加外键都不行,这时就需要额外创建一个关系表来存放这两张表的id键值 + 学生表和关系表就是一对多的关系,课程表和关系表也是一对多的关系 +2. 多对多关系同样注意几点: + + 添加数据时,先添加父表记录(student,course),再添加子表(student_course_relation)记录 + 删除数据时,先删除子表记录(student_course_relation),再删除父表记录(student,course) +3. 在多对多设计表时,可以遵循以下口诀: + + 多对多,三张表,关系表加外键 + + 意思就是当存在多对多的关系时,需要涉及到第三张表关系表的设计,而关系表就是存放了存在多对多关系的两张表的外键 + + + diff --git "a/36\351\273\204\345\230\211\346\227\272/20220908-\346\226\207\347\253\240\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/36\351\273\204\345\230\211\346\227\272/20220908-\346\226\207\347\253\240\347\256\241\347\220\206\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..f2ae4e5e2eb11c1db245c7da73e4ae5f3070a732 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220908-\346\226\207\347\253\240\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -0,0 +1 @@ +![111](./%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-10-10%20210244.png) diff --git "a/36\351\273\204\345\230\211\346\227\272/20220909-\350\277\233\351\224\200\345\255\230.md" "b/36\351\273\204\345\230\211\346\227\272/20220909-\350\277\233\351\224\200\345\255\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..b4f19b57bb051c4ee83f1e3379ac048022cdd99a --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220909-\350\277\233\351\224\200\345\255\230.md" @@ -0,0 +1 @@ +![111](./%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-10-10%20210618.png) \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220915-RABC.md" "b/36\351\273\204\345\230\211\346\227\272/20220915-RABC.md" new file mode 100644 index 0000000000000000000000000000000000000000..9ab57af291b7bc4b20511d8f956ea29c70e10226 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220915-RABC.md" @@ -0,0 +1,66 @@ +# RBAC权限详解 + +## 权限设置 + +### 1.权限点 + +权限:在一个系统内是否具有做某个操作的权利 +权限分为两个级别 + +1. 菜单权限:是否有权限访问某个菜单 +2. 按钮权限:是否有权限操作 页面上的某个按钮功能 + +### 2.业务逻辑 + +对于权限数据来说,有两个级别的设置 + +1.能不能访问谋个页面 + +2.在页面上,能不能操作某个按钮 + +### 3.RBAC权限设计思想 + +目标:不同账号登录系统后看到不同的页面, 能执行不同的功能 + +模式如下 +![在这里插入图片描述](https://img-blog.csdnimg.cn/08a9f71cee64419a9b426cf018d092fe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6L-3Li4u,size_20,color_FFFFFF,t_70,g_se,x_16) + +三个关键点: + +**用户**: 就是使用系统的人 + +**权限点**:这个系统中有多少个功能(例始:有3个页面,每个页面上的有不同的操作) + +**角色**:不同的权限点的集合 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/2de2fa8222e1407fb212f5049aada674.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6L-3Li4u,size_20,color_FFFFFF,t_70,g_se,x_16) + +实际上就是 + +1. 给用户分配角色 +2. 给角色分配权限点 + +实际业务中: + +1. 先给员工分配一个具体的角色 +2. 然后给角色分配具体的权限点 员工就拥有了权限点 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210618211815862.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FudG9uaV9jeQ==,size_16,color_FFFFFF,t_70) + +### 4.RBAC支持的安全原则 + + RBAC支持三个著名的安全原则: + + 1. 最小权限原则 : RBAC可以将角色配置成其完成任务所需的最小权限集合 + 2. 责任分离原则 : 可以通过调用相互独立互斥的角色来共同完成敏感的任务 (例如要求 : 一个计账员和财务管理员 共同参与统一过账操作) + 3. 数据抽象原则 : 可以通过权限的抽象来体现 ( 例如财务操作 用 借款、存款 等抽象权限,而不是使用典型的 读、 写、执行权限) + +### 6.RBAC的优点 + +1. 简化了用户和权限的关系 +2. 易扩展、易维护 + +### 7.RBAC的缺点 + +1. 没有对操作顺序 设限 +2. RBAC模型没有提供操作顺序的控制机制,这一缺陷使得RBAC模型很难适应哪些对操作次序有严格要求的系统 \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220919-\350\277\233\351\224\200\345\255\230max.md" "b/36\351\273\204\345\230\211\346\227\272/20220919-\350\277\233\351\224\200\345\255\230max.md" new file mode 100644 index 0000000000000000000000000000000000000000..c468e9ded4a65add5762972251f18a438a732412 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220919-\350\277\233\351\224\200\345\255\230max.md" @@ -0,0 +1 @@ +![](./%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-10-10%20211102.png) \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220922-\350\247\206\345\233\276,md" "b/36\351\273\204\345\230\211\346\227\272/20220922-\350\247\206\345\233\276,md" new file mode 100644 index 0000000000000000000000000000000000000000..3bc21d4c8451024e99c22151798db94a12bace25 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220922-\350\247\206\345\233\276,md" @@ -0,0 +1,27 @@ +# sql视图 + +## 什么是视图? + +在SQL中,视图是基于 SQL 语句的结果集的可视化的表。 + +视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加SQL函数、WHERE 以及JOIN语句,我们也可以提交数据,就像这些来自于某个单一的表。 + +视图格式:**create vi**ew 视图名称** + **as** + select语句** + +**解释** +**视图从代码上看是一个select语句** + +**视图从逻辑上看是一个虚拟表** + +**优点** +简化查询 +增加数据的保密性 + +**缺点** +增加了数据库的维护成本 +视图只是简化了查询,但是并不能加快查询的速度 + +**注意** +创建视图的select语句必须为所有的计算列指定别名 \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20220923-\347\264\242\345\274\225.md" "b/36\351\273\204\345\230\211\346\227\272/20220923-\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..c1ad226917a197ad49fb60dc12114f1ae1457af5 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220923-\347\264\242\345\274\225.md" @@ -0,0 +1,7 @@ +# 索引 + +## 索引的定义 +索引 就好比书本的目录,加快数据库的查询速度。 + +## 插入500000个数据 +[![xExyQ0.png](https://s1.ax1x.com/2022/09/26/xExyQ0.png)](https://imgse.com/i/xExyQ0) diff --git "a/36\351\273\204\345\230\211\346\227\272/20220926-\345\202\250\345\255\230\344\270\216\351\232\217\346\234\272\345\220\215\345\255\227.md" "b/36\351\273\204\345\230\211\346\227\272/20220926-\345\202\250\345\255\230\344\270\216\351\232\217\346\234\272\345\220\215\345\255\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..6d644652847c7ca1f3a8aa8af40cd766ba808bbb --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220926-\345\202\250\345\255\230\344\270\216\351\232\217\346\234\272\345\220\215\345\255\227.md" @@ -0,0 +1,79 @@ +# 索引 + +```sql +create index idx_名称 +on 表名(列名) +``` + +# 随机生成10000000姓名 + +[![xEOf2V.png](https://s1.ax1x.com/2022/09/25/xEOf2V.png)](https://imgse.com/i/xEOf2V) + +```sql +create database StudentDB +use studentdb + +create table LastName( +Id int primary key identity, +LastName nvarchar(max) +) + +create table FirstName( +Id int primary key identity, +FirstName nvarchar(max) +) + +insert LastName values('赵'),('钱'),('孙'),('李'),('西'),('吴'),('郑'),('王'),('冯'),('陈'),('楮'),('卫'),('蒋'),('沈'),('韩'),('杨'), + +('朱'),('秦'),('尤'),('许'),('何'),('吕'),('施'),('张'),('孔'),('曹'),('严'),('华'),('金'),('魏'),('陶'),('姜'), + +('戚'),('谢'),('邹'),('喻'),('柏'),('水'),('窦'),('章'),('云'),('苏'),('潘'),('葛'),('奚'),('范'),('彭'),('郎'), + +('鲁'),('韦'),('昌'),('马'),('苗'),('凤'),('花'),('方'),('俞'),('任'),('袁'),('柳'),('酆'),('鲍'),('史'),('唐'), + +('费'),('廉'),('岑'),('薛'),('雷'),('贺'),('倪'),('汤'),('滕'),('殷'),('罗'),('毕'),('郝'),('邬'),('安'),('常'), + +('乐'),('于'),('时'),('傅'),('皮'),('卞'),('齐'),('康'),('伍'),('余'),('元'),('卜'),('顾'),('孟'),('平'),('黄'), + +('和'),('穆'),('萧'),('尹'),('赖') + +insert FirstName values ('爱'),('安'),('百'),('邦'),('宝'),('保'),('抱'),('贝'),('倍'),('蓓'),('本'), + +('必'),('碧'),('璧'),('斌'),('冰'),('兵'),('炳'),('步'),('彩'),('曹'),('昌'),('长'),('常'),('超'), + +('朝'),('陈'),('晨'),('成'),('呈'),('承'),('诚'),('崇'),('楚'),('传'),('春'),('纯'),('翠'),('村'), + +('殿'),('丁'),('定'),('东'),('冬'),('二'),('凡'),('方'),('芳'),('昉'),('飞'),('菲'),('纷'),('芬'), + +('奋'),('风'),('峰'),('锋'),('凤'),('芙'),('福'),('付'),('复'),('富'),('改'),('刚'),('高'),('阁'), + +('铬'),('根'),('庚'),('耕'),('公'),('功'),('冠'),('光'),('广'),('归'),('桂'),('国'),('海'),('寒'), + +('翰'),('昊'),('浩'),('荷'),('红'),('宏'),('洪'),('鸿'),('厚'),('华'),('存'),('大'),('丹'),('道'), + +('德'),('登'),('砥'),('典'),('佃'),('小'),('狗'),('亲') + + +create table Name( +Id int primary key identity, +Name nvarchar(max) +) +select LastName from LastName +where id=ROUND(Rand()*(100-1)+1,0) + +select FirstName from FirstName +where Id=ROUND(Rand()*(100-1)+1,0) + +declare @i int=1,@num int=10000000 +set nocount on +while @i<=@num +begin +insert Name values((select LastName from LastName +where id=ROUND(Rand()*(100-1)+1,0))+(select FirstName from FirstName +where Id=ROUND(Rand()*(100-1)+1,0))+(select FirstName from FirstName +where Id=ROUND(Rand()*(100-1)+1,0))) +set @i=@i+1 +end +set nocount off +``` + diff --git "a/36\351\273\204\345\230\211\346\227\272/20220927-\346\216\222\345\220\215.md" "b/36\351\273\204\345\230\211\346\227\272/20220927-\346\216\222\345\220\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..f433bdef5498031cfb07f6ef80a0b62f3c4cb7fe --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220927-\346\216\222\345\220\215.md" @@ -0,0 +1,23 @@ +## 统计排名 + +### 1.ROW_NUMBER() + +**定义**:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询, +比如查询前10个 查询10-100个学生。 + +### **2.RANK()** + +**定义**:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里和ROW_NUMBER()不一样,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样,出现相同的,他们的排名是一样的,且之后的排名会有间隔。下图就可以直观感受出, + +[![xnHIzt.png](https://s1.ax1x.com/2022/09/29/xnHIzt.png)](https://imgse.com/i/xnHIzt) + +### **3.DENSE_RANK()** + +**定义**:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,但是 + +排名不会有间隔。 + +[![xnbko4.png](https://s1.ax1x.com/2022/09/29/xnbko4.png)](https://imgse.com/i/xnbko4) + + + diff --git "a/36\351\273\204\345\230\211\346\227\272/20220927-\350\247\246\345\217\221\345\231\250.md" "b/36\351\273\204\345\230\211\346\227\272/20220927-\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..883da647bee75d9e76d4d7e45b0b4a5bee0c569e --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220927-\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,59 @@ +# 触发器 + +[触发器](https://so.csdn.net/so/search?q=触发器&spm=1001.2101.3001.7020)是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 + +## 1.什么是触发器 + +触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 + +## 2.DML触发器 + + 1、 after触发器(之后触发) + +​ a、 [insert](https://so.csdn.net/so/search?q=insert&spm=1001.2101.3001.7020)触发器 + +​ b、 update触发器 + +​ c、 delete触发器 + + 2、 instead of 触发器 (之前触发) + +其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 + + +## 3.语法 + +### 1.创建 + +```sql +create trigger 触发器名 +on 表名 +{After|Instead of} {insert|update|delete} +as 相应T-SQL语句 +``` + +### 2.修改 + +``` +alter trigger 触发器名 +on 表名 +{After|Instead of} {insert|update|delete} +as 相应T-SQL语句 +``` + +### 3.删除 + +``` +drop trigger trigger_name +``` + +## 4.注意 + +在after触发器的insert和delete触发器会临时创建一张临时表 + +```sql +create trigger 触发器名 +on 表名 after insert +as select * from inserted +``` + diff --git "a/36\351\273\204\345\230\211\346\227\272/20220930-\345\210\206\351\241\265\346\237\245\350\257\242.md" "b/36\351\273\204\345\230\211\346\227\272/20220930-\345\210\206\351\241\265\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..297995b1177c212d7e4f03a957bbc76def44ddd5 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20220930-\345\210\206\351\241\265\346\237\245\350\257\242.md" @@ -0,0 +1,67 @@ +### 第一种、 + +  1、 先查询当前页码之前的所有数据id + +    select top ((当前页数-1)*每页数据条数) id from 表名 + +  2、再查询所有数据的前几条,但是id不在之前查出来的数据中 + +    select top 每页数据条数 * from 表名 where id not in ( select top ((当前页数-1)*每页数据条数) id from 表名 ) + + + +  3、查询出当前页面的所有数据后,再根据一列数据进行排序 + +    select * from ( + +      select top 每页数据条数 * from 表名 where id not in (select top ((当前页数-1)*每页数据条数) id from 表名) + +    ) as b order by 排序列名 desc + + + +  4、当然,如果想要修改排序列再查询也可以(默认是按照id asc 排序的,我们可以改为其他列) + +    select top 每页数据条数 * from 表名 where id not in (select top ((2-1)*5) id from wg_users order by 排序列名 desc) order by 排序列名 desc + +    这里的排序列名一定要用同一列,不然的话,分页查询就会查出重复数据或者少数据,因为排序错乱的原因 + + + +### 第二种、**ROW_NUMBER()分页** + +  1、使用ROW_NUMBER()函数先给查询到的所有数据添加一列序号(就是给数据加一列1、2、3、4、5......这个,一定不要去掉后面起的那个别名【我这里叫做b】) + +    select * from (select ROW_NUMBER() OVER(Order by id) AS RowNumber,* from 表名) as b + + + +  2、然后就是根据前面加的那一列序号,运用数学计算出当前页是 第x 到 y条 数据 + +    select * from (select ROW_NUMBER() OVER(Order by id) AS RowNumber,* from 表名) as b + +    where b.RowNumber BETWEEN (当前页数-1)*每页数据条数+1 and 当前页数*每页数据条数order by 排序列名 desc + + + +  3、这种分页语句的排序列在这里(这里默认根据id这一列排序的,有需要的可以改一下,多个排序列可以写【order by id, creatTime, name, ......】) + +    select * from (select ROW_NUMBER() OVER(Order by 排序列名) AS RowNumber,* from 表名) as b + + + +### 第三种、**Offset and Fetch的分页方法**——仅适用于SqlServer2012及以上版本(**Offset and Fetch不仅可以用来分页,还有别的功能,不过我并不了解,分页方面也只是知道可以这么用**) + +  1、这种分页相较于第二种来说,无论是性能还是语法,都是有优势的,不过优势并不明显(仅供参考,看别人测试的,萌新表示并不知道该怎么比较-_-!!) + +    select * from 表名 order by 排序列名 offset (当前页数-1)*每页数据条数 row fetch next 每页数据条数 row only + + + +  2、对当前页的数据再排序(如果不需要,可以不用加这部分) + +    select * from ( + +      select * from 表名 order by 排序列名 offset (当前页数-1)*每页数据条数 row fetch next 每页数据条数 row only + +    ) as b order by 排序列名 descs \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/20221007-\346\270\270\346\240\207.md" "b/36\351\273\204\345\230\211\346\227\272/20221007-\346\270\270\346\240\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..6097c6787961cad273ca8186283c864e2ded22c5 --- /dev/null +++ "b/36\351\273\204\345\230\211\346\227\272/20221007-\346\270\270\346\240\207.md" @@ -0,0 +1,149 @@ +## 一、什么是游标 + +游标(Cursor) 可以看做一种数据类型,它可以用来遍历结果集,相当于指针,或者是数组中的下标。它处理结果集的方法有以下几种: + +1. ​ 定位到结果集的某一行 +2.   从当前结果集的位置搜索一行或一部分行 +3.   对结果集中的当前行进行数据修改 + +## 二、游标的使用方法(创建、打开、读取、关闭、删除) + +####   【创建游标】 + +  和定义各种数据类型的方法有点像,但是注意,不要加“@”(实际上也有“游标类型的变量”,和“游标”的用法几乎完全相同,而且定义时使用@符 号)。下面是定义游标的语句: + +   + +```sql +declare 游标名 cursor [local|global] [forward_only|scroll] + +  for + +  select查询语句 +``` + +  游标分为局部游标和全局游标两种,local表示局部游标,global表示全局游标(默认值,可以省略)。当指定 forward_only(默认值,可以省略)时,游标是只进的,也就是说只能从头到尾地提取记录,如果需要在行之间来回跳跃,需要指定为scroll。 + +####   【使用游标】 + +  只创建游标但是不使用它,就没有任何意义了。下面我们先举个最简单的例子来演示创建好游标之后的几步使用过程: + +   + +```sql +--【创建游标】 + +  declare C1 cursor for select xingming from yiren + +  declare @xingming varchar(20) + +  --【打开游标】 + +  open C1 + +  --【读取游标】 + +  fetch next from C1 into @xingming --while的特点就是要先写一次 + +  while(@@FETCH_STATUS=0) + +  begin + +  print '姓名:'+@xingming + +  fetch next from C1 into @xingming + +  end + +  --【关闭游标】 + +  close C1 + +  --【删除游标】 + +  deallocate C1 +``` + + + + + + + +# 事务 +事务是单个的工作单元。事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。 +## 事务应用场景 +确保数据完整、安全、一致性。 + +确保线程之间操作不会相互影响。 + +## 事务优点 +原子性、一致性、持久性通过数据库日志实现。 + +批处理数据库操作。 + +保证数据库级联操作的正确性。 + +## 事务缺点 +执行较慢。 + +需要较多的磁盘空间保存事务日志。 + +执行更新需要内存较多。 + +# 事务分类 +自动提交事务 +每条单独的语句都是一个事务。 + +在自动提交模式下, 每个数据库操作是在执行时已提交的事务。 此模式适合用于包含单个 SQL 语句的许多实际的事务。 不需要分隔,或者指定的这些事务完成。 在数据库中不支持事务的情况下,自动提交模式是唯一支持的模式。 在此类数据库语句仅在提交后可以执行它们并没有方法回滚它们;它们因此始终处于自动提交模式。 + +### 显式事务 +每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。 + +### 隐式事务 +在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。 + +隐式事务通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开。 + +### 事务特性 +事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)属性,只有这样才能成为一个事务。 + +### 原子性 +事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 + +### 一致性 +事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。 + +### 隔离性 +由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。 + +### 持久性 +事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。 + +### 事务隔离 +隔离级别用于决定如何控制并发用户读写数据的操作。 + +读操作默认使用共享锁;写操作需要使用排它锁。 + +读操作能够控制他的处理的方式,写操作不能控制它的处理方式。 + +可序列化性 +理想情况下,事务应可序列化。 事务被视为可用作按顺序运行它们的结果的同时运行的事务的结果是相同的情况下序列化 — 即,另一个。 它并不重要的事务,则首先执行,仅的结果不会反映任何混合的事务。 + +## 事务隔离级别可能的实现 +### 未提交读 +事务不是相互隔离的。 如果 DBMS 支持其他事务隔离级别,它会忽略它使用来实现这两种级别的任何机制。 以便它们不产生不利影响其他事务,在 Read Uncommitted 级别运行的事务是通常是只读的。 + +### 已提交读 +在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。 +事务持有读取的锁 (如果它仅读取行) 或写入锁定 (如果它更新或删除的行) 的当前行,以防止其他事务更新或删除它。 事务释放读的锁时即会关闭当前行。 它保留写锁,直到提交或回滚。 + +### 可重复读 +在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。 +事务持有读取的锁,它返回到的应用程序和写锁,它插入、 更新或删除的所有行的所有行。 例如,如果事务包含的 SQL 语句选择*从订单,如应用程序读取它们的事务读取锁定行。 如果在事务中包含的 SQL 语句删除从订单的状态 = 已关闭,如将其删除的行事务写入锁。 +由于其他事务不能更新或删除这些行,当前事务可以避免任何不可重复读取。 事务提交或回滚时释放其锁。 + +### 可序列化 +在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。 +事务持有读取的锁 (如果它仅读取的行) 或写入锁 (如果它可以更新或删除行) 的范围上它的行影响。 例如,如果事务包含的 SQL 语句选择*从订单,范围是整个 Orders 表; 事务读取锁定表而不会允许任何新行插入到它。 如果在事务中包含的 SQL 语句删除从订单的状态 = 已关闭,范围为"已关闭"状态的所有行; 事务写入锁订单中的所有行具有都表状态为"CLOSED"而不会不允许任何行要插入或更新,以便得到的行的状态为"已关闭"。 +由于其他事务不能更新或删除范围中的行,当前事务可以避免任何不可重复读取。 由于其他事务不能在范围中插入任何行,当前事务可以避免任何幻影。 事务提交或回滚时释放其锁定。 \ No newline at end of file diff --git "a/36\351\273\204\345\230\211\346\227\272/\345\233\276\347\211\207/.keep" "b/36\351\273\204\345\230\211\346\227\272/\345\233\276\347\211\207/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210244.png" "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210244.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5fd3e7e80b4fe175a9d8c4da27ff1f74b50ebdb Binary files /dev/null and "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210244.png" differ diff --git "a/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210618.png" "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210618.png" new file mode 100644 index 0000000000000000000000000000000000000000..85622522bf3dea6f411321616b1fe53505892f40 Binary files /dev/null and "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 210618.png" differ diff --git "a/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 211102.png" "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 211102.png" new file mode 100644 index 0000000000000000000000000000000000000000..0fc9e14673c790a1fe6067437d1d71a709036845 Binary files /dev/null and "b/36\351\273\204\345\230\211\346\227\272/\345\261\217\345\271\225\346\210\252\345\233\276 2022-10-10 211102.png" differ diff --git "a/\350\200\201\350\203\241\346\235\245\344\271\237/20220829-\345\274\200\345\255\246\347\254\254\344\270\200\350\257\276.md" "b/\350\200\201\350\203\241\346\235\245\344\271\237/20220829-\345\274\200\345\255\246\347\254\254\344\270\200\350\257\276.md" deleted file mode 100644 index c3d3c68bef190cb025fd9d073bbeceb48c8d0598..0000000000000000000000000000000000000000 --- "a/\350\200\201\350\203\241\346\235\245\344\271\237/20220829-\345\274\200\345\255\246\347\254\254\344\270\200\350\257\276.md" +++ /dev/null @@ -1,13 +0,0 @@ -# 今天是2022-08-29 晴 第一天见21级1班的童鞋们,挺帅挺漂亮的 - -1. 认识了雪炜 -2. 认识了双胞胎 -3. 认识了王斌、刘斌 - - -![20220830150146](http://rhf13uf33.hn-bkt.clouddn.com/20220830150146.png) - - - - -![20220830150510](http://rhf13uf33.hn-bkt.clouddn.com/20220830150510.png) \ No newline at end of file