一、SQL server的部署
1、数据库的基本概念
- 数据库通常是一个由行和列组成的二维表
- 数据表中的行通常叫做记录或元祖
- 数据表中的列通常叫做字段或属性
2、主键和外键
- 主键:定义主键可以保证数据的完整性
- 外键:一个关系数据库通常包含多个表,通过外键,可以将这些表连接
3、数据库的完整性
- 实体完整性规则:主键不为空
- 域完整性规则:指定某一数据对某一个列是否有效或确定是否允许空值
- 引用完整性规则:如果两个表互相关联,那么引用完整规则要求不允许引用不存在的元祖
- 用户定义完整性规则:针对某一数据的约束条件
4、安装:可看:https://www.cnblogs.com/-xuan/p/9998103.html
5、启动数据库
- 服务(win + R,services.msc,)-->右击SQL server(MSSQLSERVER),开启
- SQL server配置管理器(安装完成后点击桌面左下角,选择Microsoft SQL server 2016中打开),SQL服务-->SQL server(MSSQLSERVER)
- 使用SSMS启动或者停止
6、注册服务器(方便日后管理):打开SSMS连接后,右击实例,注册即可
7、在SQL server中,数据库分为两种
- 系统数据库:
- master 数据库:记录系统级别的信息
- model 数据库:用作实力上创建所有数据库的模板
- msdb数据库:用于SQL server代理计划警报和作业
- tempdb数据库:表示一个数据空间,用于保存临时的对象或中间结果集,SQL server每次启动数据库tempdb都会重新创建
- 用户数据库:
二、数据库和表的管理
1、文件类型
- 主数据文件:包括文件的启动信息,每个数据库都有且只有一个主数据文件,扩展名为*.mdf
- 次要(辅助)数据文件:可以白数据库内动保存到其他计算机或磁盘,扩展名为*.ndf
- 日志文件:最低必须有一个,可以很多,数据误删除可以使用日志文件进行恢复,扩展名为*.ldf
- 文件流:储存非结构化数据,如图片、音频、视频等二进制文件; 数据流主要将SQL server数据库引擎和NTFS集成在一起。
2、数据文件:数据文件由若干个64kb大小的区(Extend)组成,每个区由8个8kb的连续页(Page)组成
3、扩展数据库:可以通过右击数据库——>点击属性——>文件 进行数据库的扩展
4、收缩数据库:分为手动收缩和自动收缩
- 手动收缩分为:收缩数据库和收缩文件
- 收缩数据库:右击数据库——>任务——>收缩——>数据库,对整个数据库进行收缩
- 收缩文件:右击数据库——>任务——>收缩——>文件,对某个文件收缩
- 自动收缩:可以通过右击数据库——>点击属性——>选项——>自动收缩 改为True
5、分离数据库和附加:用于数据库的迁移
6、数据类型
Character 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
char(n) | 固定长度的字符串。最多 8,000 个字符。 | n |
varchar(n) | 可变长度的字符串。最多 8,000 个字符。 | |
varchar(max) | 可变长度的字符串。最多 1,073,741,824 个字符。 | |
text | 可变长度的字符串。最多 2GB 字符数据。 |
Unicode 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
nchar(n) | 固定长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(n) | 可变长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(max) | 可变长度的 Unicode 数据。最多 536,870,912 个字符。 | |
ntext | 可变长度的 Unicode 数据。最多 2GB 字符数据。 |
Binary 类型:
数据类型 | 描述 | 存储 |
---|---|---|
bit | 允许 0、1 或 NULL | |
binary(n) | 固定长度的二进制数据。最多 8,000 字节。 | |
varbinary(n) | 可变长度的二进制数据。最多 8,000 字节。 | |
varbinary(max) | 可变长度的二进制数据。最多 2GB 字节。 | |
image | 可变长度的二进制数据。最多 2GB。 |
Number 类型:
数据类型 | 描述 | 存储 |
---|---|---|
tinyint | 允许从 0 到 255 的所有数字。 | 1 字节 |
smallint | 允许从 -32,768 到 32,767 的所有数字。 | 2 字节 |
int | 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 | 4 字节 |
bigint | 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 | 8 字节 |
decimal(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
numeric(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
smallmoney | 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 | 4 字节 |
money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 | 8 字节 |
float(n) | 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 | 4 或 8 字节 |
real | 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 | 4 字节 |
Date 类型:
数据类型 | 描述 | 存储 |
---|---|---|
datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 | 8 bytes |
datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 | 6-8 bytes |
smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 | 4 bytes |
date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 仅存储时间。精度为 100 纳秒。 | 3-5 bytes |
datetimeoffset | 与 datetime2 相同,外加时区偏移。 | 8-10 bytes |
timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。 |
7、默认值:如果没有指定数据,则使用默认值
8、标识列的三个特点及指定的三个内容
- 三个特点
-
- 列的数据类型为不带小数的数值类型
- 该列有一定顺序产生,不允许为空
- 列值不重复,具有标识表中每行的内容,每个表只能有一个
- 三个内容
-
- 类型:必须是数值类型,当选择decimal和numeric时,小数位必须为0
- 种子:第一行的值,默认为1
- 递增量:相邻两个表示值之间的增量
9、T-SQL语句管理
- 创建表
1 CREATE TABLE 表名( 2 第一列 数据类型() 3 第二列 数据类型() 4 ... 5 ) 6 7 可以指定以下内容 8 identity(1,1) 标识列,种子为1,递增值为1 9 not null 制定该列不能为空 10 primary key 指定主键 11 check(条件) 对该列做约束
- 修改表
1 -- 添加列 2 ALTER TABLE 表名 3 ADD 列名 数据类型() 4 5 -- 修改列的数据类型 6 ALTER TABLE 表名 7 ALTER COLUNM 列名 数据大小() 8 9 -- 删除列 10 ALTER TABLE 表名 11 DROP COLUMN 列名 12 13 --删除表 14 15 DROP TABLE 表名
三、T-SQL查询语句
1、插入数据、更新数据、删除数据
1 -- 插入 2 insert into 表名 [列名] values(要插入的值列表) 3 4 例: 5 insert into class_table(姓名,年龄,职务) values ('杨过','18','运维工程师') //向class_table表中插入姓名:杨过,年龄:18,职务:运维工程师 6 7 --更新(修改)数据 8 update 表名 set 列名 = 更新值 where 条件 9 10 例: 11 update class_table 年龄 = 10 where 姓名 = '杨过' //更改class_table 中 姓名是:杨过 的年龄为10, 可以不指定where,则将所有人年龄更改为10 12 13 --删除数据 14 delete from 表名 where 条件 15 16 例: 17 delete from class_table where 姓名 = '杨过' //删除姓名是杨过的哪一行,如果不指定where则删除整个表,纪录日志 18 19 删除表 20 truncate table class_table //删除表,不记录日志,标识列重置
2、查询语句select
- 语法结构
1 select select_list 2 [into new_table_name] 3 from table_name 4 [wherer search_conditions] 5 [group by group_by_expression] [having search_confitions] 6 [orwer by order_expression [ ASC | DESC] ]
- 比较运算符
--等于、大于、小于什么的就没写 between 指定一个范围,包含边界 例:between 10 and 20 从10到20的数,包含10和20 is【not】 null 搜索空值扩非空值 like 模糊查询,与字符串进行模式匹配 in 是否在数据范围里边
- 通配符
1 '_' 任意单个字符 2 '%' 任意个任意长度的字符 3 [] 括号范围所指定的一个字符 4 [^] 不在括号内的任意一个字符 5 6 7 8 9 and 两边同时为True,返回True 10 or 两边一遍为True则返回True 11 not 真返回假,假返回真 12 13 顺序:() > not > and > or
- 查询举例,由于后边都是查询举例,所以就写到一起了,表:
可以先执行以下命令创建词表:
1 --创建表 2 CREATE TABLE class_table( 3 编号 decimal(100,0) identity(1) 4 姓名 nvarchar(50) not null, 5 身份证号 char(18) primary key not null, 6 姓名 nvarchar(50) not null, 7 姓名 nvarchar(50) not null, 8 ) 9 10 -- 插入 11 insert into class_table (姓名,身份证号,职务,出生日期,基本工资) 12 values('杨过','111222333444555666','运维工程师','1995/01/02',8500), 13 ('小龙女','222222333444555666','CTO','1999/10/12',11100), 14 ('郭靖','333222333444555666','DBA','1990/05/02',10000), 15 ('洪七公','444222333444555666','DBA','2000/05/05',8500), 16 ('黄药师','555222333444555666','运维工程师','1995/01/02',8500)
-
1 --1、显示表中所有信息 2 select * from class_table 3 4 -- 2、查询特定列 5 select 姓名,职务 6 from class_table 7 8 --3、查询特定行 9 --①查询职务是运维工程师的行的所有信息 10 select * from class_table 11 where 职务='运维工程师' 12 13 --②查询工资在8500 到 10000的员工信息 14 select * from class_table 15 where 基本工资 between 8500 and 10000 16 17 --③查询工资高于8000 小于 10000的员工 18 select * from class_table 19 where 基本工资 > 8000 and 基本工资 < 10000 20 21 --④更新黄药师和杨过的工资分别为6500、7000 22 update class_table set 基本工资 = 6500 where 姓名 = '黄药师' 23 update class_table set 基本工资 = 7000 where 姓名 = '杨过' 24 25 --⑤查询表中工资为6500,8500,11100的员工所有信息 26 select * from class_table where 基本工资 in (6500,8500,11100) 27 28 --⑥查询表中身份证号以11或22开头的员公所有信息 29 select * from class_table where 身份证号 like '11%' or 身份证号 like '22%' 30 31 -- ⑦查询表中姓杨的运维工程师 32 select * from class_table where 姓名 like '杨%' and 职务 = '运维工程师' 33 34 --⑧ 查询表中备注为空的员工所有信息 35 select * from class_table where 备注 is null 36 37 --4、限制返回的行数 38 select top n 显示的列 from 表名 --n为返回的行数 39 40 --①查询前3行数据 41 select top 3 * from class_table 42 43 --5、改变查询后显示的列的名字 44 select 原名字 as 显示的名字 from 表名 45 --①显示名字和身份证号,姓名用‘name’表示,身份证用‘idcard’表示 46 --第一种方式 47 select 姓名 as name,身份证号 as idcard from class_table 48 --第二种方式,可以去掉as 49 select 姓名 name,身份证号 idcard from class_table 50 --第三种方式,可以用等号赋值 51 select name=姓名,idcard=身份证号 from class_table 52 53 --6、排序 54 select 要显示的列 from 表名 order by 根据什么排序 asc(升序) | desc(降序) 55 56 --①按照工资进行升序 57 select * from class_table order by 基本工资 asc 58 59 --7、查询时重复的只显示一个 60 select distinct 显示列 from 表名 61 62 --①查询表中都有哪些职务 63 select distinct 职务 from class_table 64 65 --8、使用select生成新表 66 select 要添加新表的列 into 新表的名字 ftom 表名 67 --①将工资大于8000的姓名,职务添加到新表new_table中 68 select 姓名,职务 69 into new_table 70 from class_table 71 where 基本工资 > 8000 72 --执行之后会出现一个新表,可以右击,编辑查看前二百行进行查看 73 --②使用insert查询插入 74 insert into new_table(姓名,职务) --new_table必须存在才可以使用insert插入 75 select 姓名,职务 76 from class_table 77 where 基本工资 > 8000 78 79 --③使用union关键字进行连续插入 80 insert new_table 81 select '老大','出去打工' union 82 select '老二','干活' union 83 select '老三','照顾老四' union 84 select '老四','玩'
第三章实验:
实验案例一:先创建表
1 create table products( 2 编号 decimal(10,0) identity(1,1) primary key not null, 3 名称 nvarchar(10) not null, 4 种类 nvarchar(10) not null, 5 成本 money not null, 6 出厂日期 date not null, 7 )
- 方法一
1 -- 方法一 2 insert into products(名称,种类,成本,出厂日期) 3 values ('西瓜','水果',4.1000,'2018/05/06'), 4 ('芹菜','蔬菜',1.0000,'2017/04/01'), 5 ('番茄','蔬菜',2.9000,'2017/05/09'), 6 ('黄瓜','蔬菜',2.2000,'2017/05/05'), 7 ('香蕉','水果',6.1000,'2017/05/23'), 8 ('核桃','坚果',28.1000,'2017/06/02'), 9 ('开心果','坚果',38.1000,'2017/06/21'), 10 ('蓝莓','水果',50.1000,'2017/05/15')
- 可以使用:truncate table products 删除表中的数据,然后使用方法二创建
1 -- 方法二 2 3 insert into products(名称,种类,成本,出厂日期) 4 select '西瓜','水果',4.1000,'2018/05/06' union 5 select '芹菜','蔬菜',1.0000,'2017/04/01' union 6 select '番茄','蔬菜',2.9000,'2017/05/09' union 7 select '黄瓜','蔬菜',2.2000,'2017/05/05' union 8 select '香蕉','水果',6.1000,'2017/05/23' union 9 select '核桃','坚果',28.1000,'2017/06/02' union 10 select '开心果','坚果',38.1000,'2017/06/21' union 11 select '蓝莓','水果',50.1000,'2017/05/15'
-
--验证结果:select * from products
实验案例二:
1 --1、查看成本低于10的水果价格 2 select * from products 3 where 成本 < 10 and 种类 = '水果' 4 5 --2、将所有蔬菜成本上调一元 6 update products set 成本 = 成本 + 1 7 where 种类='蔬菜' 8 9 --3、查询成本大于3元小于40元的产品信息,并按照成高到低排序 10 select * from products 11 where 成本 between 3 and 40 12 order by 成本 desc 13 14 --4、查询成本最高的5个产品 15 16 select top 5 * from products 17 order by 成本 DESC 18 19 --5、查询都有哪些产品种类 20 select distinct 种类 from products 21 22 --6、将products中水果的名称、种类、和出厂日期信息插入新表products_new中。 23 select 名称,种类,出厂日期 24 into products_new from products 25 where 种类='水果'
四、T-SQL高级查询
1、