From 4d35e46ff1e57465373e79cc50d6d7eb50ef52ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=8E=E4=BC=9F?= <1931626338@qq.com> Date: Wed, 5 Oct 2022 17:02:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BA=8B=E5=8A=A12=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-9-30 \344\272\213\345\212\2412.md" | 584 ++++++++++++++++++ 1 file changed, 584 insertions(+) create mode 100644 "12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\344\271\235\346\254\241\347\254\224\350\256\260/2022-9-30 \344\272\213\345\212\2412.md" diff --git "a/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\344\271\235\346\254\241\347\254\224\350\256\260/2022-9-30 \344\272\213\345\212\2412.md" "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\344\271\235\346\254\241\347\254\224\350\256\260/2022-9-30 \344\272\213\345\212\2412.md" new file mode 100644 index 0000000..43bb2ad --- /dev/null +++ "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\344\271\235\346\254\241\347\254\224\350\256\260/2022-9-30 \344\272\213\345\212\2412.md" @@ -0,0 +1,584 @@ +# 2022.9.16 + +## 创建数据库 + +```SQL +create database 数据库名 +``` + +## 创建数据表 + +```SQL +create table 表名( +) +``` + +## 查询数据 + +```sql +select * from 表名 +``` + +## 增删改查 + +```SQL +insert into 表名 ({字段1},{字段1},{字段1},....) values (值1,值1,值1,....) +alter table (表名) add (列名) varchar(255) ; +delete from 表名 where 删除条件 +drop table (表名) 删除整个表 +UPDATE 表名 SET 字段1=修改的值1,字段2=修改的值2,.. . .. WHERE 修改的条件 +``` + + + +## 主键,自增,不允许为空,默认值,外键,唯一约束 + +```sql +1.primary key 主键 +2.identity(1,1) 自增 初始ID,自增多少 +3.not null 不允许为空 +4.default('') 默认值 +5.userId(表名) int(字段) references(外键) userInfo(表名)(userNo)列名 外键 +6.unique 唯一约束 +``` + +# 2022.9.17 + +## SQL条件查询 + +```sql +=:等于,比较是否相等及赋值 +!=:比较不等于 +>:比较大于 +<:比较小于 +>=:比较大于等于 +<=:比较小于等于 +IS NULL:比较为空 +IS NOT NULL:比较不为空 +in:比较是否在其中 +like:模糊查询 +BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 +and:逻辑与(两个条件同时成立表达式成立) +or:逻辑或(两个条件有一个成立表达式成立) +not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) +``` + +## 模糊查询 + +```sql +%:代表匹配0个字符、1个字符或多个字符。 +_:代表匹配有且只有1个字符。 +[]:代表匹配范围内 +[^]:代表匹配不在范围内 + +模糊查询,包含查询 +select * from 表名 where 列名 like '%要查询的字段%' + +模糊查询,开头查询 +select * from 表名 where 列名 like '要查询的字段%' + +模糊查询,结尾查询 +select * from 表名 where 列名 like '%要查询的字段' +``` + +## 聚合函数 + +```SQL +count:求数量 +max:求最大值 计算某一列的最大值 +min:求最小值 计算某一列的最小值 +sum:求和 计算某一列的合计值,该列必须为数值类型 +avg:求平均值 计算某一列的平均值,该列必须为数值类型 +``` + +## 升序降序查询 + +```SQL +-- desc 降序 默认升序 asc -- +SELECT * FROM 表名 order by 列名 desc +``` + + + +## ROUND函数用法: + +```SQL +round(num,len,[type]) +其中: +num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取) +select ROUND(123.45454,3) --123.45500 +select ROUND(123.45454,3,1) --123.45400 +``` + +## CONVERT()与CAST()函数: + +```SQL +--1.保留小数 +convert(decimal(13,2),12.45454) +cast(12.45454 as decimal(13,2)) +--2.强制转换类型 +``` + +## SQL中常用的时间函数 + +```SQL +select DATEDIFF(day, '2019-08-20', getDate()); --获取指定时间单位的差值 +SELECT DATEADD(MINUTE,-5,GETDATE()) --加减时间,此处为获取五分钟前的时间,MINUTE 表示分钟,可为 YEAR,MONTH,DAY,HOUR +select DATENAME(month, getDate()); --当前月份 +select DATENAME(WEEKDAY, getDate()); --当前星期几 +select DATEPART(month, getDate()); --当前月份 +select DAY(getDate()); --返回当前日期天数 +select MONTH(getDate()); --返回当前日期月数 +select YEAR(getDate()); --返回当前日期年数 + +SELECT CONVERT(VARCHAR(22),GETDATE(),20) --2020-01-09 14:46:46 +SELECT CONVERT(VARCHAR(24),GETDATE(),21) --2020-01-09 14:46:55.91 +SELECT CONVERT(VARCHAR(22),GETDATE(),23) --2020-01-09 +SELECT CONVERT(VARCHAR(22),GETDATE(),24) --15:04:07 +Select CONVERT(varchar(20),GETDATE(),14) --15:05:49:330 +``` + +## 连表查询 + +```SQL +内连接查询 +1.select * from 第一张表名 重命名字段1 +2.inner join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 + +左连接查询 +1.select * from 第一张表名 重命名字段1 +2.left join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 + +右连接查询 +1.select * from 第一张表名 重命名字段1 +2.right join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 +``` + +## **时间格式控制字符串:** + +| 名称 | 日期单位 | 缩写 | +| ------------ | ----------- | --------- | +| 年 | year | yyyy 或yy | +| 季度 | quarter | qq,q | +| 月 | month | mm,m | +| 一年中第几天 | dayofyear | dy,y | +| 日 | day | dd,d | +| 一年中第几周 | week | wk,ww | +| 星期 | weekday | dw | +| 小时 | Hour | hh | +| 分钟 | minute | mi,n | +| 秒 | second | ss,s | +| 毫秒 | millisecond | ms | + +## SQL语句执行顺序: + +```sql +(7) SELECT +(8) DISTINCT +(1) FROM +(3) JOIN +(2) ON +(4) WHERE +(5) GROUP BY +(6) HAVING +(9) ORDER BY +(10) LIMIT +``` + +# 2022.9.19 + +## 子查询 + +```sql +标量子查询:返回的是单行单列;标量子查询是指子查询返回的是**单一值**,如一个数字或一个字符串。 + +列子查询:返回的数据时1列n行,放在where之后 + +行子查询:是指子查询返回的结果集是1行N列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +表子查询(from子查询) +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 +``` + +## all和any的区别 + +```sql +注意:1. =any 与in 等效. +all:是所有 +any:是任意一个 +any表示任何一个满足就返回TRUE,all表示全部都满足才返回TRUE +``` + +## 三个排序函数 + +```sql +row_number():连续,无并列 +dense_rank():有并列,不挑空 +rank():有并列,会挑空 + +--学生的Java成绩,并根据成绩排名 +--row_number() +select StuName 姓名,ROW_NUMBER() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' + +--rank() +select StuName 姓名,rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' + +--DENSE_RANK() + select StuName 姓名,dense_rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +``` + +## exists子查询 + +关键字EXISTS构造子查询时,当子查询的结果集不为空时,则EXISTS返回的结果为TRUE,外层查询语句进行查询;当子查询的结果集为空时,则EXISTS返回的结果为FALSE,外层查询语句不进行查询。 + +```SQL + 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 + if exists(select * from CardTransfer where CardNoIn = 6225547858741263) + print '有' + else + print '没有' +``` + +# 2022.9.21 + +## 关联子查询_排序 + +```SQL +row_number():连续,无并列 +dense_rank():有并列,不挑空 +rank():有并列,会挑空 +``` + +# 2022.9.22 + +## 变量 + +```sql +全局变量必须以标记@@作为前缀,如@@version +全局变量由**系统定义和维护**,我们**只能读取,不能修改全局变量的值** +全局变量在整个SQL环境下都可以被访问或调用 +--全局变量:只读,由系统定义和维护, @@ + +--@@ERROR:返回执行的上一个语句的错误号 +--@@IDENTITY:返回最后插入的标识值 +--@@MAX_CONNECTIONS:返回允许同时进行的最大用户连接数 +--@@ROWCOUNT:返回受上一语句影响的行数 +--@@SERVERNAME:返回运行 SQL Server 的本地服务器的名称 +--@@SERVICENAME:返回 SQL Server 正在其下运行的注册表项的名称 +--@@TRANCOUNT:返回当前连接的活动事务数 +--@@LOCK_TIMEOUT:返回当前会话的当前锁定超时设置(毫秒) +-------------------------------------------------------------------------------------- +局部变量必须以标记@作为前缀 ,如@age +局部变量的使用是先声明,再赋值 +局部变量只在定义它的局部范围内有效 + +声明一个局部变量:**declare @变量名 数据类型** +--局部变量: 声明(int a),赋值(a = 1) +--declare 变量名 数据类型 +例: + declare @id int --声明一个名为id的整型变量 + declare @name varchar(50) --声明一个可变长度为50的存放姓名的字符串变量 +``` + +# 赋值 + +赋值: + - set @变量名 = 值 + - select @变量名 = 值 + +```sql +--例: + select @id = 1001 + set @name = '周飘' +``` + +set与select赋值的区别: + +set赋值给变量指定的值,select一般用于表中查询出的数据赋值给变量,如果查询结果有多条,取最后一条赋值给变量 + +# 逻辑控制语句 + +## if条件分支 + +```sql +sql中的if-else语句 +if(条件) +begin +语句 +语句 +..... +end +else +begin +语句 +语句 +..... +end +``` + +## while 循环控制语句 + +while:可以通过break和continue控制循环语句中的执行。 + +break:跳出整个循环 + +continue:跳出当前循环 + +```sql +sql中的if-else语句 +while(条件) +begin +语句 +语句 +..... +end +``` + +## 逻辑控制语句 switch case + +``` + +``` + +# 批处理语句 + +go语句特点: + +1. 等待go语句前的代码执行完成后,再执行go后面的代码。 +2. 批处理语句的结束标志。 + +```sql +--下面的@num变量作用域为全局 +--declare @num int +--set @num = 0 + +--下面的@num变量的作用域是局部,只在两个go之间可以使用,最后一行代码会报错 +--.........sql代码 +--go +--declare @num int +--set @num = 0 +--go +--set @num = 1 +``` + +# 2022-9-26 + +## 视图 + +三种类型关系: + +- 表(Table)--基表,存储关系(Base Tables,Sorted relations) +- 视图(Views)--虚拟表,虚拟关系(Virtual relations)(不是物理存在的是虚拟的) +- 临时结果--临时表,(select * from, Temporary results)--用于构建**子查询**的结果 + +with check option --涉及的增删只能对信息学院的学生进行操作 + +## 定义视图 + +```sql +--1.建立视图 +create view <视图名> [(<列名>[,<列名>]...)] +as <子查询> [with check option] + + +create view V_GetInfo(虚拟表) +as +select stu_num(列名), name(列名), school(列名) from tb_student(表名) +select * from V_GetInfo + +--2.使用 +--视图是一张虚拟表 +select * from V_GetInfo --》视图转化: select stu_num, name, school from tb_student + +--3.删除(虚拟表) +--drop view V_GetInfo + +--4.建立信息学院学生的视图 使用,查询虚拟表 +create view V_Info +as +select * from tb_student where school='信息学院' +with check option --涉及的增删只能对信息学院的学生进行操作 + +--5.分组视图:使用group by 建立视图 +create view V_GetTotalPrize(生源地,荣誉总数) +as +select ori_loca , sum(prize) from tb_inf_student group by ori_loca +select * from V_GetTotalPrize + +--6.定义一个反映学生年龄的视图 +create view V_GetAgeByBirth(学号,姓名,年龄) +as +select stu_num,name, (year(getdate()) - year(birth)) from tb_student +select * from V_GetAgeByBirth + +--7.建立信息学院学生的特长属于艺术特长视图 连表查询 +create view V_GetSpecBySch +as +select tb_student.*,hobby,speciality,ori_loca,prize from tb_student join tb_inf_student on tb_student.stu_num = tb_inf_student.stu_num where school='信息学院' and speciality='艺术特长' + +--8.基于视图的视图:视图可作为另一视图建立的表 +create view V_GetOriInBJ +as +select * from V_GetSpecBySch where ori_loca = '北京' +select * from V_GetOriInBJ +``` + +## 查询视图 + +更新视图:不推荐直接在视图进行更新操作,增,删 操作 + +视图一般只用来查询,如果是单表的话,也可以进行增删改。但是有如下限制。 + 1.聚合函数(SUM(), MIN(), MAX(), COUNT()等)。 + +2. DISTINCT + +3. GROUP BY +4. 4 HAVING +5. UNION或UNION ALL (连表) +6. 位于选择列表中的子查询 + 7.Join + 8.FROM子句中的不可更新视图 +7. WHERE子句中的子查询,引用FROM子句中的表。 +8. 仅引用文字值(在该情况下,没有要更新的基本表)。 +9. ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。 + +##### 删除视图 + +```sql +drop view <视图名> +--该语句从数据字典中删除指定的视图定义 +--由该视图导出的其他视图仍在数据字典中,但不能使用,需要删除 +--删除基表时,由该基表导出的所有视图定义都必须显示删除 +``` + +# 2022-9-27到29 + +## 事务 + +**事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。** + +**事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。** + +## 事务的属性(ACID) + +一般来说,事务具有四个标准属性,分别是原子性(**A**tomicity,或称不可分割性)、一致性(**C**onsistency)、隔离性(**I**solation,又称独立性)、持久性(**D**urability),简称 **ACID**。具体说明如下: + +##### 1) 原子性 + +一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 + +##### 2) 一致性 + +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + +##### 3) 隔离性 + +数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 死锁 操作系统 + +##### 4) 持久性 + +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +## 事务的隔离级别 + +#### 事务的ACID属性 + +​ Atomicity 原子性:同一个事务中的操作,要么全部成功,要么全部失败。 + +​ Consistency 一致性:数据库中的数据保证合法,满足所有的约束(比如唯一约束) + +​ Isolation **隔离性**:不同的事务不能相互影响 + +​ Durability 持久性:事务提交后,不管数据库是否崩溃重启,提交的事务所作出的修改都要生效 + +如果不对事务进行隔离,多个事务同时发生在数据库中,将会导致以下的问题: + +- **脏读**:一个事务读取到另一个未提交事务的修改。没保证原子性,如果当前事务基于这些脏数据进行操作,另一个事务回滚后,这些操作将会是错误的 +- **不可重复读**:事务中,另外的事务提交了update或delete,导致当前事务前后读取到的数据不一致。没保证持久性,会导致当前事务覆盖另外事务的修改 +- **幻读**:事务中,另外的事务提交了insert,导致当前事务前后读取到的数据总量不一致。当前事务先对唯一约束进行检查发现没有与将要插入的数据重复的,此时另外的事务提交了,导致当前事务进行插入后数据库中有两条相同的数据,破环了一致性 + +#### 事务的四种隔离级别 + +**read-uncommitted** **读未提交** + +​ 可以读到未提交的数据(完全不隔离) + +**read-committed 读已提交** + +​ 只能读取已提交的数据(避免脏读) + +**repeatable-read 可重复读** + +​ 只能读取到事务开始前,其它事务提交的数据(避免脏读、不可重复读) + +**serializable 串行化** + +​ 所有事务一个一个执行,不进行并发(避免脏读、不可重复读、幻读) + +``` +--查看事务的隔离级别 +dbcc useroptions +--设置事务隔离级别 +set transaction isolation level <隔离级别> +``` + +# 2022.9.30 + +## 游标 + +游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成**单个记录处理方式**。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。 + +游标分类: + +(1)静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变 +(2)动态游标(Dynamic):在操作游标的时候,数据发生变化,游标中数据改变,默认值。 +(3)键集驱动游标(KeySet):在操作游标的时候,被标识的列发生改变,游标中数据改变,其他列改变,游标中数据不变。 + +## 游标的使用 + +### 创建游标: + +```sql +--1.创建游标(Scroll代表滚动游标,不加Scroll则是只进的,只能支持fetch next) +declare <游标名> cursor scroll for select (表列名) from stuinfo +``` + +### 打开游标: + +```sql +open <游标名> +``` + +### 关闭游标: + +```sql +close <游标名> +``` + +### 释放游标: + +```sql +deallocate <游标名> +``` + +### 提取数据操作: + +```sql +fetch first from <游标名> --结果集的第一行 +fetch last from <游标名> --最后一行 +fetch absolute 1 from <游标名> --从游标的第一行开始数,第n行。 绝对 +fetch relative 3 from <游标名> --从当前位置数,第n行。 相对 +fetch next from <游标名> --当前位置的下一行 +fetch prior from <游标名> --当前位置的上一行 +``` + -- Gitee From 0c3101184a3a44c01ca295df148a5f93c505fc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=8E=E4=BC=9F?= <1931626338@qq.com> Date: Wed, 5 Oct 2022 17:03:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B8=B8=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-9-30 \346\270\270\346\240\207.md" | 584 ++++++++++++++++++ .../SQLQuery10.sql" | 115 ++++ 2 files changed, 699 insertions(+) create mode 100644 "12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/2022-9-30 \346\270\270\346\240\207.md" create mode 100644 "12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/SQLQuery10.sql" diff --git "a/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/2022-9-30 \346\270\270\346\240\207.md" "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/2022-9-30 \346\270\270\346\240\207.md" new file mode 100644 index 0000000..43bb2ad --- /dev/null +++ "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/2022-9-30 \346\270\270\346\240\207.md" @@ -0,0 +1,584 @@ +# 2022.9.16 + +## 创建数据库 + +```SQL +create database 数据库名 +``` + +## 创建数据表 + +```SQL +create table 表名( +) +``` + +## 查询数据 + +```sql +select * from 表名 +``` + +## 增删改查 + +```SQL +insert into 表名 ({字段1},{字段1},{字段1},....) values (值1,值1,值1,....) +alter table (表名) add (列名) varchar(255) ; +delete from 表名 where 删除条件 +drop table (表名) 删除整个表 +UPDATE 表名 SET 字段1=修改的值1,字段2=修改的值2,.. . .. WHERE 修改的条件 +``` + + + +## 主键,自增,不允许为空,默认值,外键,唯一约束 + +```sql +1.primary key 主键 +2.identity(1,1) 自增 初始ID,自增多少 +3.not null 不允许为空 +4.default('') 默认值 +5.userId(表名) int(字段) references(外键) userInfo(表名)(userNo)列名 外键 +6.unique 唯一约束 +``` + +# 2022.9.17 + +## SQL条件查询 + +```sql +=:等于,比较是否相等及赋值 +!=:比较不等于 +>:比较大于 +<:比较小于 +>=:比较大于等于 +<=:比较小于等于 +IS NULL:比较为空 +IS NOT NULL:比较不为空 +in:比较是否在其中 +like:模糊查询 +BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 +and:逻辑与(两个条件同时成立表达式成立) +or:逻辑或(两个条件有一个成立表达式成立) +not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) +``` + +## 模糊查询 + +```sql +%:代表匹配0个字符、1个字符或多个字符。 +_:代表匹配有且只有1个字符。 +[]:代表匹配范围内 +[^]:代表匹配不在范围内 + +模糊查询,包含查询 +select * from 表名 where 列名 like '%要查询的字段%' + +模糊查询,开头查询 +select * from 表名 where 列名 like '要查询的字段%' + +模糊查询,结尾查询 +select * from 表名 where 列名 like '%要查询的字段' +``` + +## 聚合函数 + +```SQL +count:求数量 +max:求最大值 计算某一列的最大值 +min:求最小值 计算某一列的最小值 +sum:求和 计算某一列的合计值,该列必须为数值类型 +avg:求平均值 计算某一列的平均值,该列必须为数值类型 +``` + +## 升序降序查询 + +```SQL +-- desc 降序 默认升序 asc -- +SELECT * FROM 表名 order by 列名 desc +``` + + + +## ROUND函数用法: + +```SQL +round(num,len,[type]) +其中: +num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取) +select ROUND(123.45454,3) --123.45500 +select ROUND(123.45454,3,1) --123.45400 +``` + +## CONVERT()与CAST()函数: + +```SQL +--1.保留小数 +convert(decimal(13,2),12.45454) +cast(12.45454 as decimal(13,2)) +--2.强制转换类型 +``` + +## SQL中常用的时间函数 + +```SQL +select DATEDIFF(day, '2019-08-20', getDate()); --获取指定时间单位的差值 +SELECT DATEADD(MINUTE,-5,GETDATE()) --加减时间,此处为获取五分钟前的时间,MINUTE 表示分钟,可为 YEAR,MONTH,DAY,HOUR +select DATENAME(month, getDate()); --当前月份 +select DATENAME(WEEKDAY, getDate()); --当前星期几 +select DATEPART(month, getDate()); --当前月份 +select DAY(getDate()); --返回当前日期天数 +select MONTH(getDate()); --返回当前日期月数 +select YEAR(getDate()); --返回当前日期年数 + +SELECT CONVERT(VARCHAR(22),GETDATE(),20) --2020-01-09 14:46:46 +SELECT CONVERT(VARCHAR(24),GETDATE(),21) --2020-01-09 14:46:55.91 +SELECT CONVERT(VARCHAR(22),GETDATE(),23) --2020-01-09 +SELECT CONVERT(VARCHAR(22),GETDATE(),24) --15:04:07 +Select CONVERT(varchar(20),GETDATE(),14) --15:05:49:330 +``` + +## 连表查询 + +```SQL +内连接查询 +1.select * from 第一张表名 重命名字段1 +2.inner join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 + +左连接查询 +1.select * from 第一张表名 重命名字段1 +2.left join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 + +右连接查询 +1.select * from 第一张表名 重命名字段1 +2.right join 第二张表名 重命名字段2 on 重命名字段1.关联的列=重命名字段2.关联的列 +3.where 要筛选的条件、 +``` + +## **时间格式控制字符串:** + +| 名称 | 日期单位 | 缩写 | +| ------------ | ----------- | --------- | +| 年 | year | yyyy 或yy | +| 季度 | quarter | qq,q | +| 月 | month | mm,m | +| 一年中第几天 | dayofyear | dy,y | +| 日 | day | dd,d | +| 一年中第几周 | week | wk,ww | +| 星期 | weekday | dw | +| 小时 | Hour | hh | +| 分钟 | minute | mi,n | +| 秒 | second | ss,s | +| 毫秒 | millisecond | ms | + +## SQL语句执行顺序: + +```sql +(7) SELECT +(8) DISTINCT +(1) FROM +(3) JOIN +(2) ON +(4) WHERE +(5) GROUP BY +(6) HAVING +(9) ORDER BY +(10) LIMIT +``` + +# 2022.9.19 + +## 子查询 + +```sql +标量子查询:返回的是单行单列;标量子查询是指子查询返回的是**单一值**,如一个数字或一个字符串。 + +列子查询:返回的数据时1列n行,放在where之后 + +行子查询:是指子查询返回的结果集是1行N列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +表子查询(from子查询) +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 +``` + +## all和any的区别 + +```sql +注意:1. =any 与in 等效. +all:是所有 +any:是任意一个 +any表示任何一个满足就返回TRUE,all表示全部都满足才返回TRUE +``` + +## 三个排序函数 + +```sql +row_number():连续,无并列 +dense_rank():有并列,不挑空 +rank():有并列,会挑空 + +--学生的Java成绩,并根据成绩排名 +--row_number() +select StuName 姓名,ROW_NUMBER() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' + +--rank() +select StuName 姓名,rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' + +--DENSE_RANK() + select StuName 姓名,dense_rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +``` + +## exists子查询 + +关键字EXISTS构造子查询时,当子查询的结果集不为空时,则EXISTS返回的结果为TRUE,外层查询语句进行查询;当子查询的结果集为空时,则EXISTS返回的结果为FALSE,外层查询语句不进行查询。 + +```SQL + 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 + if exists(select * from CardTransfer where CardNoIn = 6225547858741263) + print '有' + else + print '没有' +``` + +# 2022.9.21 + +## 关联子查询_排序 + +```SQL +row_number():连续,无并列 +dense_rank():有并列,不挑空 +rank():有并列,会挑空 +``` + +# 2022.9.22 + +## 变量 + +```sql +全局变量必须以标记@@作为前缀,如@@version +全局变量由**系统定义和维护**,我们**只能读取,不能修改全局变量的值** +全局变量在整个SQL环境下都可以被访问或调用 +--全局变量:只读,由系统定义和维护, @@ + +--@@ERROR:返回执行的上一个语句的错误号 +--@@IDENTITY:返回最后插入的标识值 +--@@MAX_CONNECTIONS:返回允许同时进行的最大用户连接数 +--@@ROWCOUNT:返回受上一语句影响的行数 +--@@SERVERNAME:返回运行 SQL Server 的本地服务器的名称 +--@@SERVICENAME:返回 SQL Server 正在其下运行的注册表项的名称 +--@@TRANCOUNT:返回当前连接的活动事务数 +--@@LOCK_TIMEOUT:返回当前会话的当前锁定超时设置(毫秒) +-------------------------------------------------------------------------------------- +局部变量必须以标记@作为前缀 ,如@age +局部变量的使用是先声明,再赋值 +局部变量只在定义它的局部范围内有效 + +声明一个局部变量:**declare @变量名 数据类型** +--局部变量: 声明(int a),赋值(a = 1) +--declare 变量名 数据类型 +例: + declare @id int --声明一个名为id的整型变量 + declare @name varchar(50) --声明一个可变长度为50的存放姓名的字符串变量 +``` + +# 赋值 + +赋值: + - set @变量名 = 值 + - select @变量名 = 值 + +```sql +--例: + select @id = 1001 + set @name = '周飘' +``` + +set与select赋值的区别: + +set赋值给变量指定的值,select一般用于表中查询出的数据赋值给变量,如果查询结果有多条,取最后一条赋值给变量 + +# 逻辑控制语句 + +## if条件分支 + +```sql +sql中的if-else语句 +if(条件) +begin +语句 +语句 +..... +end +else +begin +语句 +语句 +..... +end +``` + +## while 循环控制语句 + +while:可以通过break和continue控制循环语句中的执行。 + +break:跳出整个循环 + +continue:跳出当前循环 + +```sql +sql中的if-else语句 +while(条件) +begin +语句 +语句 +..... +end +``` + +## 逻辑控制语句 switch case + +``` + +``` + +# 批处理语句 + +go语句特点: + +1. 等待go语句前的代码执行完成后,再执行go后面的代码。 +2. 批处理语句的结束标志。 + +```sql +--下面的@num变量作用域为全局 +--declare @num int +--set @num = 0 + +--下面的@num变量的作用域是局部,只在两个go之间可以使用,最后一行代码会报错 +--.........sql代码 +--go +--declare @num int +--set @num = 0 +--go +--set @num = 1 +``` + +# 2022-9-26 + +## 视图 + +三种类型关系: + +- 表(Table)--基表,存储关系(Base Tables,Sorted relations) +- 视图(Views)--虚拟表,虚拟关系(Virtual relations)(不是物理存在的是虚拟的) +- 临时结果--临时表,(select * from, Temporary results)--用于构建**子查询**的结果 + +with check option --涉及的增删只能对信息学院的学生进行操作 + +## 定义视图 + +```sql +--1.建立视图 +create view <视图名> [(<列名>[,<列名>]...)] +as <子查询> [with check option] + + +create view V_GetInfo(虚拟表) +as +select stu_num(列名), name(列名), school(列名) from tb_student(表名) +select * from V_GetInfo + +--2.使用 +--视图是一张虚拟表 +select * from V_GetInfo --》视图转化: select stu_num, name, school from tb_student + +--3.删除(虚拟表) +--drop view V_GetInfo + +--4.建立信息学院学生的视图 使用,查询虚拟表 +create view V_Info +as +select * from tb_student where school='信息学院' +with check option --涉及的增删只能对信息学院的学生进行操作 + +--5.分组视图:使用group by 建立视图 +create view V_GetTotalPrize(生源地,荣誉总数) +as +select ori_loca , sum(prize) from tb_inf_student group by ori_loca +select * from V_GetTotalPrize + +--6.定义一个反映学生年龄的视图 +create view V_GetAgeByBirth(学号,姓名,年龄) +as +select stu_num,name, (year(getdate()) - year(birth)) from tb_student +select * from V_GetAgeByBirth + +--7.建立信息学院学生的特长属于艺术特长视图 连表查询 +create view V_GetSpecBySch +as +select tb_student.*,hobby,speciality,ori_loca,prize from tb_student join tb_inf_student on tb_student.stu_num = tb_inf_student.stu_num where school='信息学院' and speciality='艺术特长' + +--8.基于视图的视图:视图可作为另一视图建立的表 +create view V_GetOriInBJ +as +select * from V_GetSpecBySch where ori_loca = '北京' +select * from V_GetOriInBJ +``` + +## 查询视图 + +更新视图:不推荐直接在视图进行更新操作,增,删 操作 + +视图一般只用来查询,如果是单表的话,也可以进行增删改。但是有如下限制。 + 1.聚合函数(SUM(), MIN(), MAX(), COUNT()等)。 + +2. DISTINCT + +3. GROUP BY +4. 4 HAVING +5. UNION或UNION ALL (连表) +6. 位于选择列表中的子查询 + 7.Join + 8.FROM子句中的不可更新视图 +7. WHERE子句中的子查询,引用FROM子句中的表。 +8. 仅引用文字值(在该情况下,没有要更新的基本表)。 +9. ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。 + +##### 删除视图 + +```sql +drop view <视图名> +--该语句从数据字典中删除指定的视图定义 +--由该视图导出的其他视图仍在数据字典中,但不能使用,需要删除 +--删除基表时,由该基表导出的所有视图定义都必须显示删除 +``` + +# 2022-9-27到29 + +## 事务 + +**事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。** + +**事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。** + +## 事务的属性(ACID) + +一般来说,事务具有四个标准属性,分别是原子性(**A**tomicity,或称不可分割性)、一致性(**C**onsistency)、隔离性(**I**solation,又称独立性)、持久性(**D**urability),简称 **ACID**。具体说明如下: + +##### 1) 原子性 + +一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 + +##### 2) 一致性 + +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + +##### 3) 隔离性 + +数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 死锁 操作系统 + +##### 4) 持久性 + +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +## 事务的隔离级别 + +#### 事务的ACID属性 + +​ Atomicity 原子性:同一个事务中的操作,要么全部成功,要么全部失败。 + +​ Consistency 一致性:数据库中的数据保证合法,满足所有的约束(比如唯一约束) + +​ Isolation **隔离性**:不同的事务不能相互影响 + +​ Durability 持久性:事务提交后,不管数据库是否崩溃重启,提交的事务所作出的修改都要生效 + +如果不对事务进行隔离,多个事务同时发生在数据库中,将会导致以下的问题: + +- **脏读**:一个事务读取到另一个未提交事务的修改。没保证原子性,如果当前事务基于这些脏数据进行操作,另一个事务回滚后,这些操作将会是错误的 +- **不可重复读**:事务中,另外的事务提交了update或delete,导致当前事务前后读取到的数据不一致。没保证持久性,会导致当前事务覆盖另外事务的修改 +- **幻读**:事务中,另外的事务提交了insert,导致当前事务前后读取到的数据总量不一致。当前事务先对唯一约束进行检查发现没有与将要插入的数据重复的,此时另外的事务提交了,导致当前事务进行插入后数据库中有两条相同的数据,破环了一致性 + +#### 事务的四种隔离级别 + +**read-uncommitted** **读未提交** + +​ 可以读到未提交的数据(完全不隔离) + +**read-committed 读已提交** + +​ 只能读取已提交的数据(避免脏读) + +**repeatable-read 可重复读** + +​ 只能读取到事务开始前,其它事务提交的数据(避免脏读、不可重复读) + +**serializable 串行化** + +​ 所有事务一个一个执行,不进行并发(避免脏读、不可重复读、幻读) + +``` +--查看事务的隔离级别 +dbcc useroptions +--设置事务隔离级别 +set transaction isolation level <隔离级别> +``` + +# 2022.9.30 + +## 游标 + +游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成**单个记录处理方式**。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。 + +游标分类: + +(1)静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变 +(2)动态游标(Dynamic):在操作游标的时候,数据发生变化,游标中数据改变,默认值。 +(3)键集驱动游标(KeySet):在操作游标的时候,被标识的列发生改变,游标中数据改变,其他列改变,游标中数据不变。 + +## 游标的使用 + +### 创建游标: + +```sql +--1.创建游标(Scroll代表滚动游标,不加Scroll则是只进的,只能支持fetch next) +declare <游标名> cursor scroll for select (表列名) from stuinfo +``` + +### 打开游标: + +```sql +open <游标名> +``` + +### 关闭游标: + +```sql +close <游标名> +``` + +### 释放游标: + +```sql +deallocate <游标名> +``` + +### 提取数据操作: + +```sql +fetch first from <游标名> --结果集的第一行 +fetch last from <游标名> --最后一行 +fetch absolute 1 from <游标名> --从游标的第一行开始数,第n行。 绝对 +fetch relative 3 from <游标名> --从当前位置数,第n行。 相对 +fetch next from <游标名> --当前位置的下一行 +fetch prior from <游标名> --当前位置的上一行 +``` + diff --git "a/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/SQLQuery10.sql" "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/SQLQuery10.sql" new file mode 100644 index 0000000..1ce300e --- /dev/null +++ "b/12 \351\231\210\345\215\216\344\274\237/2022-10-04 \347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260/SQLQuery10.sql" @@ -0,0 +1,115 @@ +--1.ʹαʵּн +--2.ʹαɾԱ +--3.ʹα ʵ:ABIDֵֶͬôBеʡݣ ޸ijAеijһ£ + use master + go + select * from Department + select * from People + + --1.ʹαʵּн + --α + declare cui_id cursor scroll + for select PeopleId from People + --α + open cui_id + + declare @id int + declare @money money = 1000 + fetch first from cui_id into @id + while (@@FETCH_STATUS=0) + begin + update People set PeopleSalary += @money where PeopleId = @id + fetch next from cui_id into @id + end +--رα + close cui_id +--ͷα + deallocate cui_id + + select * from People + +--2.ʹαɾԱ + --α + select * from People + + declare cui_id cursor scroll + for select PeopleId ,PeopleSalary from People +--α + open cui_id + + declare @id2 int + declare @money2 money + fetch first from cui_id into @id2,@money2 + while(@@FETCH_STATUS = 0) + begin + if(@money2<10000) + begin + delete People where PeopleId = @id2 + fetch next from cui_id into @id2,@money2 + end + else + fetch next from cui_id into @id2,@money2 + end + --رα + close cui_id + --ͷα + deallocate cui_id +--3.ʹα ʵ:ABIDֵֶͬôBеʡݣ ޸ijAеijһ£ + create table table_a ( + id int, + Province varchar(20), + City varchar(20) + ) + go + insert into table_a (id,Province,City) values (1,'','') + insert into table_a (id,Province,City) values (2,'㶫','') + insert into table_a (id,Province,City) values (3,'','') + insert into table_a (id,Province,City) values (4,'','') + go + create table table_b ( + id int, + Province varchar(20), + City varchar(20) + ) + go + insert into table_b (id,Province,City) values (1,'','') + insert into table_b (id,Province,City) values (3,'','') + insert into table_b (id,Province,City) values (5,'','人') + insert into table_b (id,Province,City) values (7,'','ɳ') + + select * from table_a + select * from table_b + --α + declare cui_id cursor scroll + for select table_a.* from table_a inner join table_b on table_a.id = table_b.id + --select * from table_a + --inner join table_b on table_a.id = table_b.id + --α + open cui_id + + --declare @id3 varchar(20) + --declare @Province varchar(20) + --declare @City varchar (20) + --fetch first from cui_id into @id3,@Province,@City + --while(@@FETCH_STATUS = 0) + --begin + -- update table_b set table_b.Province= @Province,table_b.City = @City where id = @id3 + -- fetch next from cui_id into @Province,@City,@id3 + -- end + declare @id int , @id1 int,@Province varchar(10),@City varchar(10) + fetch first from cui_id into @id,@Province,@City + while(@@FETCH_STATUS = 0) + begin + update table_b set table_b.Province = @Province ,table_b.City = @City where table_b.id = @id + fetch next from cui_id into @id,@Province,@City + end + --رα + close cui_id + + --ͷα + deallocate cui_id + select * from table_a + select * from table_b + + + \ No newline at end of file -- Gitee