From 2dabbc0665035d61df472e8df17e86a060309a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E6=80=9D=E5=A9=B7?= <3377421251@qq,com> Date: Sat, 1 Apr 2023 12:42:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\254\224\350\256\260.md" | 385 ++++++++++++++++++ 1 file changed, 385 insertions(+) create mode 100644 "37\351\231\206\346\200\235\345\251\267/\347\254\224\350\256\260.md" diff --git "a/37\351\231\206\346\200\235\345\251\267/\347\254\224\350\256\260.md" "b/37\351\231\206\346\200\235\345\251\267/\347\254\224\350\256\260.md" new file mode 100644 index 0000000..b701b1b --- /dev/null +++ "b/37\351\231\206\346\200\235\345\251\267/\347\254\224\350\256\260.md" @@ -0,0 +1,385 @@ + + +# 数据库的介绍 + +数据库:存储数据的仓库 + 关系型数据库、非关系数据库 + 关系型数据库:MySQL 、SQLServer、oracle + 数据库系统由计算机硬件、数据库服务器、操作人员、数据库管理系统(DBMS) + 数据库的文件类型:mdf,ndf,ldf + +T-SQL语言: + +| DDL | DCL | DQL | | +| ------------------------------------------- | -------------------------------------------------------- | ---------------- | ---- | +| 数据库**定义**语言;定义数据库和数据表等对象 | 数据**操作**语句;对数据表的数据进行操作,增加、删除修改 | 数据**查询**语言 | | +| create--创建 | insert--插入 | select--查询 | | +| drop--删除 | delete--删除数据 | | | +| alter--修改 | update--修改数据 | | | + +# 数据库的创建 + +## 创建数据库 + +create database 数据库名称; + +## 使用数据库 + +use 数据库名称; + +## 删除数据库 + +drop database 数据库名称; + +切换到master 再删除,避免正在使用要删除的数据库 + +use master; + + + +--如果数据库存在,再执行删库的语句 +if exists (select * from sys.databases where name='Student') +begin + use master; + drop database Student; + print('删除成功') +end + + + +go:批处理标志,分割sql文件;代表批处理语句,先处理执行完前面的sql语句在执行后面的sql + +等待前面语句执行完毕再执行后面的sql语句 + + + +# 数据表的创建 + +## 创建数据表 + +表的语法 +create table 数据表的名称( +列名1 数据类型 [约束], +列名2 数据类型 [约束], +.... +); + +删除数据表 +drop table 数据表名称 + +### 数据类型 + +​ 整数数据类型:int ,tinyint(用于年龄等) + +​ 字符数据类型:nvarchar(n)(用于姓名,性别等),varchar(n)(用于手机号等),char,nchar + +​ 浮点数据类型:float, decimal(n,m)(用于成绩等)----n代表数值的总位数,m代表小数的位数 + +​ 货币数据类型:money + +​ 日期数据类型:date(用于出生日期等),time,datetime(2) + +​ 文本数据类型:text(用于文本等), ntext(n) + + + + ### 表的属性 + +​ 1.主键(primary key):进行主键的定义,插入数据时,主键字段不能为空,并且不能重复,唯一识别表中的一条记录; + +​ 2.自增(identity):identity (自增的起始值,自增的步长),系统帮忙计算插入自增字段的值,通常用于业务主 键,每插入一条记录自增1 + +​ 3.非空(not null):插入数据时不能为空值 + +​ 4.唯一(unique):这一列插入的值不能重复 + +​ 5.默认值(fefault):fefault '默认值' 插入数据时,没有值的时候系统默认帮忙设置的值; + +​ 6.检查条件:check(条件语句) + +​ 7.外键:使用外键建立两张表的联系,使值的引用有效 + +​ 语法:foreign key(本表外键字段) references 参照表的名称(参照表主键(参照的字段)) + +​ 作用:限制引用数据的正确性 + +# 插入数据 + +语法:insert into 表名(列名1,列名2,.....,) + values(值1,值2,......),(值1,值2,......),........ + 列名和值:数量、数据类型、顺序一一对应 + 列名的列表可以省略,所有字段(除了自增字段)都按顺序插入值时可以省略 + + + +## 数据的修改 + +### 修改表结构 + +#### 1.增加字段 + +alter table 表名 add 字段名 数据类型 [约束] + +#### 2.删除字段 + +alter table 表名 drop column 列名 + +#### 3.修改字段的数据类型 + +alter table 数据表名称 + +alter column 字段名称 数据类型[约束] 属性 + +【修改id字段非空 +alter table 数据表名称 +alter column id int not null)】 + +### 修改表名字 + +exec sp_rename '旧的表名','新的表名' + +### 修改表的字段名 + +exec sp_rename '表名.旧字段名','新字段名' + +### 添加约束 + +1.主键约束 +alter table 表名 +add constraint PK_表名_字段名 (约束) + +2.默认值约束 +alter table 表名 +add constraint DF_表名_字段名 (约束) for 字段名 + +### 删除约束 + +alter table 表名 drop [constraint] 约束名 + + + +# 删除、修改数据 + +删除表数据 + +语法: + delete from 表名 + +​ where 删除条件的表达式 + +1.truncate table 表名:整张表删除重建,自增重新从起始值开始;不可以条件删除 +2.delete只删除数据,不删除表;自增值从上一次自增后的值开始;它可以对数据进行条件删除 + +修改表数据 + +语法: + update 表名 set 列名1=更新后的值1,列名2=更新后的值2,......... + where 修改的条件表达式 + + + +# 查询 + +DQL:数据查询语言;查询数据表的数据 +查询:select + +查询语法: +select * from 表名 + +查询单表的所有数据 +select * from 表名 +*所有列,from、指明了查询的表 + +查询若干行数据 +select top n [percent] 列名,列名,....... from 表名 +top获取查询结果的前几行 + +查询结果去除重复项 +select distinct 列名,列名,....... from 表名 +distinct :不同的 + +对查询结果进行排序 +select 列名,列名,.... from 表名 +order by 排序字段 [asc(升序)|desc(降序)] + +查询指定列 +select 列名,列名,....... from 表名 + +查询数据 +select [top n [percent]]| [distinct] 列名,列名,..... +from 表名,表名 +order by 排序字段 [asc|desc] + +查询 +select distinct|top n percent 列名,..... +from 表名,.... +where 条件表达式 字段名和运算符组成的表达式 +order by 排序字段 [asc|desc],排序字段 [asc|desc] + +查询 +select distinct |top n 列名,..... +from 表名,..... +where 条件表达式,对数据表的原有列进行条件筛选 +group by 分组字段,..... +having 包含聚合函数条件表达式 +order by 排序字段 [asc|desc],....... + +给列名设置别名 +列名 别名 +列名 as 别名 +**别名=列名** + +where条件子句,后面是条件表达式,关于表中字段应该满足的条件表达式 +运算符: +1)比较运算符:> >= < <= <> != +2)逻辑运算符:and(与) or(或) not(非) +3)范围运算符:between A and B ,在[A,B]范围内;not between A and B ,不在[A,B]范围内 + +4)列表运算符:in(值1,值2,.....) ,not in(值1,值2,.....) + +5)空值运算符:is null 值为NULL返回结果记录,is not null 值不为NULL返回 + NULL:插入数据时,没有给该字段赋值,也没有指向内存空间的地址 + '':空字符串,没有任何字符,有存储空间 + +6)模式匹配运算符:like '模式字符串' +匹配字符: + %:匹配0~n任意字符; +_:匹配1个任意字符 + +[a,b,c,...]:匹配指定列表中的一个字符 +[^a,b,c,...]:不匹配指定列表中的一个字符 + +## 聚合查询 + +聚合查询:在查询语句中使用聚合函数 + +### 聚合函数 + +聚合函数:将一组数据进行统计计算,返回一个单值 +count(字段):计数,计算非空值数据的个数; + +计数:count:NULL不列入计算,非空值+1 + +sum(字段):求和,指定字段所有数据和 +avg(字段):求平均值 +max(字段):求最大值 +min(字段):求最小值 + +分组查询group by 字段:将数据进行按照分组字段进行分组,分组字段值相同分为同一组,聚合函数对该组数据进行统计计算;每一组返回一个统计结果值 + +group by 语法:select 合并列,函数(列名)from 表名 group by 合并列 having + +having子句:对查询处理后结果数据进行条件筛选, ,条件表达式中引用的字段只能是对分组字段; +where子句:对原数据进行条件筛选,表达式中不允许有聚合函数 + +注意:select 子句中有聚合函数,那么表的其他列名可以是group by 子句后的分组字段,不能是其他非分组字段 + +### 日期函数 + +getdate()获取当前系统时间 +select getdate() + +| year()函数截取时间的年份部分,返回的是整数类型 | +| ------------------------------------------------------------ | +| month()函数截取时间的月份部分,返回的是整数类型 | +| day()函数截取时间的日期部分,返回的是整数类型 | +| datepart(指定日期部分,日期时间) 获取指定的日期部分,返回是一个整型;日期部分有年、月、日、周.................. | +| dateName(指定日期部分,日期时间) 获取指定的日期部分,返回是一个字符串类型;日期部分有年、月、日、周.................. | +| dateadd(指定日期部分,整数,日期时间) 将日期时间的指定部分增加上整数值,返回的是一个日期时间类型。 | +| datediff(指定日期部分,开始时间,结束时间) 将结束时间-开始时间,返回的是的指定日期部分的差值,是一个整数类型。 | +| datepart(指定日期部分,日期时间),返回的是一个整数 | + +datepart 日期部分代码缩写: + +| 年 yy, yyyy,year | 季度 qq, q,quarter | +| ------------------- | --------------------------- | +| 月 mm, m,month | 年中的日 dy, y,day of year | +| 日 dd, d,day | 周 wk, ww,week | +| 星期 dw, w,weekday | 小时 hh,hour | +| 分钟 mi, n,minute | 秒 ss, s,second | +| 毫秒 ms,millisecond | 微妙 mcs、纳秒 ns | + + + + +dateName(指定日期部分,日期时间),返回的是一个字符串 + +日期增加函数,dateadd(指定日期部分,增加的整数值,要增加的日期时间) ,返回的是一个增加相应部分值的日期时间类型值 + +日期减法函数,datediff(指定日期部分,开始时间,结束时间),返回的是结束时间-开始时间的指定部分的差值,是一个整数类型 + +【 查询本月的第一天 +1)用datediff函数获取今天距离日期起始值0的月份数;0代表了数据库中起始日期值1900-01-01 +今天的日期 - 1900-01-01 的月份差值 +select datediff(month,0,getdate()) --今天距离1900-01-01有1478个月 +2)用dateadd将日期起始值0加上月份数的差值,获得本月的第一天 +1900-01-01 + 月份差 今天所在的月份 的第一天 +select dateadd(month,datediff(month,0,getdate()),0) + +查询本月的最后一天 +select dateadd(month,datediff(month,0,getdate())+1 ,0)-1 + +查询本年的第一天 + +查询本年的最后一天】 + +## 多表连接查询 + +当查询的数据字段涉及多张表时需要多表连接查询 +1.内连接:inner join 表 on 连接条件(两表的关联字段相等),inner可以省略 +2.外连接:left join ,right join ,full join + + 专门提供连接两表的关键字:join 表 on 连接条件 + + 1.内连接:连接两张表用inner join,只有满足连接条件的记录才会返回到结果集中 + inner join 表名 on 连接条件 + 在select子句中需要用“表名.列名”来指明重复列 + + 2.外连接:不满足连接条件的记录,另一张表将以NULL 填充返回连接的记录 + 1)左外连接 + select * from StuInfo left join ClassInfo on StuInfo.ClassId=ClassInfo.ClassId + select * from ClassInfo left join StuInfo on StuInfo.ClassId=ClassInfo.ClassId + + 2)右外连接 + select * from StuInfo right join ClassInfo on StuInfo.ClassId=ClassInfo.ClassId + + 3)全外连接 + + select * from StuInfo full join ClassInfo on StuInfo.ClassId=ClassInfo.ClassId + +## 子查询 + +子查询:是一个嵌套在 select、insert、update 或 delete 语句或其他子查询中的查询。 + +1.子查询作为虚拟表 select .. from (select .. from ..) '别名' + +2.子查询作为列[只能返回一行一列] select 列1,(select...from...),列3 from ..... +查询学生的成绩信息:成绩编号,姓名,课程名称,成绩 + +3.子查询作为条件 + 3.1 比较运算符连接条件 >=, <= , > ,< ,!= ,<> [子查询必须返回一行一列的值] + +​ 3.2 in、not in连接条件 [in,not in子查询] [子查询结果集只能是一列] + +​ 3.3 exists,not exists连接条件, +​ exists(select * from 表名......),select 子句有一行或以上的记录返回true,否则一条记录都没有返回false + +​ 3.4 any,all连接条件,any(和子查询返回的某个值比较),all(和子查询返回的所有值比较) + +## 自连接查询 + +自连接查询:如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询。 + +查询课程编号"1 "比课程编号" 2 "成绩高的学生的信息及课程成绩:学号,姓名,课程1,课程1的成绩,课程2,课程2的成绩 +方案一(课上讲的): +将成绩表进行自连接,分别取别名为S1和S2; +S1认为是课程编号1的成绩表(通过最后where子句中的筛选条件S1.Course=1决定数据) +S2认为是课程编号2的成绩表通过最后where子句中的筛选条件S2.Course=2决定数据) + +# 集合运算 + + 1.union [all] :并集运算,将两个或两个以上放入结果集合并成一个结果集,垂直合并 + 合并的所有结果集必须相同的列数,每列的数据类型一样 + 返回的结果集的列名标题由第一个结果集决定 + 2.intersect:交集运算,将多个结果集中相同的记录取出来形成新的集合。 + 3.except;减集运算,将前面的结果集减去后面结果集中相同记录,留取第一个结果集中不同的记录 -- Gitee