3.2数据库的修改和删除
使用脚本修改 TSQL
exec sp_helpdb testdb(数据库名称) /*exec sp_helpdb 数据库名称 就是查看这个数据库的内容*/ /*修改 修改对象 ,修改对象名称*/ alter database testdb01 /*固定的编辑语法 修改name = XXX */ modify name = testdb02;只是修改了名称,但是逻辑文件名称没有修改 /*修改数据文件的名称*/ alter database testdb02 这个是修改后的名称 modify file { name = 'testdb01',这个是原来库的名称 size = 15MB, maxsize =50MB, filegrowth = 10MB };
修改逻辑名称:
--修改逻辑文件名 --MDF alter database 数据库名称 modify file(name=原逻辑文件名, newname=新逻辑文件名) --Log alter database 数据库名称 modify file(name=原逻辑文件名, newname=新逻辑文件名)
使用较本删除数据库
drop database testdb;/*使用drop语句删除自己创建的数据库 一般不能删除系统的数据库,*/
3.3数据库的备份和还原
差异备份 (differential backup)在上一次基础上再备份一个
完整备份(full backup) 整个备份下来
执行备份 .bak 后缀名
还原:通过bak备份文件进行还原
3.4数据类型
数据类型就是属性 ,有一些常用的,例如:整数数据 ,字符数据,日期数据,货币数据等
数字类型
数据类型 |
范围 |
占用的字节 |
bigint |
-263 ~263 -1 |
8字节 |
int |
-231~231-1 |
4字节 |
smallint |
- 215 ~ 215-1 |
2字节 |
tinyint |
0~255 |
1字节 |
float |
-1.79E+308~3.40E+38 |
4或者8字节 |
时间类型
数据类型 |
输出 |
time |
12:35:29.123 (精确度到秒后面三位)时分秒 |
date |
2007-05-08 (年月日) |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
2007-05-08 12:35:29.123(精确到后面 就是小数点后面三位) |
datetime |
2007-05-08 12:35:29.1234567(精确到小数点后面三七位) |
字符串类型
类型 |
说明 |
char[(n)] |
固定长度 。 n用于定义字符串长度,必须在1~8000之间。 |
varchar[(n|max)] |
可变长度。n用于定义字符串长度,可以在1~8000之间。 |
nchar[(n)] |
固定长度的Unicode字符串数据。n用于定义字符串长度,必须在1~4000之间。 |
nvarchar |
可变长度的Unicode字符串数据。n用于定义字符串长度,必须在1~4000之间。 |
3.5创建表
关键:表名称,列名称,数据类型,每个是否为空值,
表中的主键:由表的一列或多列组成,主键始终是唯一的,主键值不可以重复。
SSMS创建表
Transcat-SQL创建表
CREATE TABLE dbo.Products/*创建一个Products表*/ (ProductlD int PRIMARY KEYNOT NULL/*主键*/,ProductName varchar(25) NOT NULL, Pricemoney NULL,ProductDescription text NULL)Go
括号里面不同属性之间用 英文逗号 “, ” 隔开
修改表结构
字段名就是列名称
- 更改字段类型长度
- 更改字段类型
- 添加 not null 约束
- 设置主键
- 更待字段名
- 添加字段名
- 删除表
alter table 表名称 alter column 字段名 类型长度 -- varchar(10)
alter table 表名称 alter column 字段名 更改后的类型
alter table 表名称 alter column 字段名 int not null
alter table 表名称 ADD constraint 逐渐名 primary key(字段名) -- 不是修改主键名称 他是唯一的不能修改的
EXEC sp_rename '表名. 字段名' -- 修改前的字段名 '修改后的字段名','COLUMN' -- 修改后的字段名
ALTER TABLE 表 ADD 字段名 字段类型 DEFAULT null 默认值
DROP TABLE table_name [,....n]
定义表主键、外键
主关键字:一个只有一个,唯一的;
外键:两个关系之间的相关联系 保持数据的一致性,完整性,主要是控制存储在外键表中的数据
- 设置主键
- 删除主键
alter table 表 add constraint 主键名称 primary key (需要的主键字段) alter table Stu_PkFk_S add constraint PK_S primary key (sno)
alter table Stu_PkFk_S drop constraint PK_S
- 添加 SQL SERVICE外键 从表建立外键
- 删除SQL SERVICE外键
就是另外一张表的主键 关系到本表的外键
例如:A表中的一个字段,是B表的主键,那他就可以是A表的外键。
alter table Stu_PkFk_S drop constraint FK_S
设置外键时 A表中的主键可以是B表的外键建立联系 ,可以有多个外键
3.6数据表的增删改查
记录由表中的列和行组成。字段是列和行的交集:某种类型的单个值。
增(插入)
- 插入单行数据
- 插入多行数据
- 从其他表copy数据
select * from [dbo].[uerinfo]--使用脚本插入记录 insert into uerinfo(userid ,eamil,name) values ('zhangsan','456413@qq,com','张三');--插入单行的数据 --插入多行数据 insert into uerinfo(userid ,eamil,name) values ('lisi','ddsad@qq.com','李四'),('wangba','laoba@qq.com','老八'),('wangba01','laoba01@qq.com','老八一号'),('wangban','laoban@qq.com','老八n号'); --在values中一个括号就是一行数据就是一个记录
-- 从其他的数据文件中copy到指定的位置中 insert into uerinfo(userid ,eamil,name) select sno,sage,ssex from [dbo].[student]
INSERT INTO "表名"("栏位1","栏位2".....) VALUES ("值1","值2".....) -- 简化 INSERT INTO "表格名" VALUES("值1","值2".....);
INSERT INTO "表格名"("栏位1","栏位2".....) VALUES ("值1","值2".....),("值1","值2".....),("值1","值2".....),("值1","值2".....); -- 一个括号的值对应一个栏位 -- 简化 INSERT INTO "表格名" VALUES("值1","值2".....),("值1","值2".....),("值1","值2".....),("值1","值2".....);
INSERT INTO "表格名1"("栏位1","栏位2".....) SELECT "栏位3","栏位4",..... -- select 查询语句 FROM "表格2" -- 把表格2中的数据copy到表格1的 栏位1 。。上
查
使用关键字 SELECT select __list 查询的字段名称 有*是查询所有名称
FROM table_source 从哪一张表查询
Distinct/Top用法
distinct 去重
TOP
select distinct select_list from table_source -- 在table_source 中查询,并且去掉重复的内容
select Top 行数 select_list -- 在table _source 查询表的前 n 行数据 from table_source
select *from [dbo].[uerinfo] -- 查询整个数据表 select userid, eamil from [dbo].[uerinfo] -- 查询指定的列 select distinct id from [dbo].[student] -- 去掉id例中重复的值 select top 10 *from [dbo].[student] -- 只查询前十行数据
改
关键字: UPDATE TABLE_NAME
SET 字段 = 值 设置字段 和 值
select *from [dbo].[uerinfo] where id = 10 --查询 id = 10 的行 update [dbo].[uerinfo] set userid = 'laoba01' -- 对应 字段 = 值 (要修改成为的值) where id =10 --要限定的修改行的数据 不然全部都会被修改
删除
关键字: DELECE FROM TABLE_list
-- 例如: select *from [dbo].[uerinfo] -- from可省略 delete from [dbo].[uerinfo] where id = 2 -- 只删除 id = 2 的行数据
3.7条件限制where
分类
- 精确限制条件
- 模糊限制条件
WHERE 字段 = 值 -- 只能查看限定的内容
WHERE 字段 like ‘%值%’ -- % 在值的前面 ,模糊掉前面的内容 只匹配 值 对应内容 ; 若 % 在值的后面则 先匹配 值 把后面的模糊掉 ;再者就是 % 值 % 对值的前后都进行模糊掉
BETWEEN 语法
限制条件表达式 ,指定表达式范围值
[NOT] BETWEEN begin 开始数 and 结束数 -- 起始到结束范围值
-- 例题 where id between 10 and 45 -- 查看 id = 10 ~ 45 之间 的 内容 where id not between 10 and 45 -- 查看 id = 10 ~ 45 之外 的 内容
select GETDATE() 方法是服务器的当前的时间
3.8子查询
IN表达式
用于限制条件表达式,指定表达式范围值
结构是指定 所在的行的内容
EXISTS表达式
[NOT] IN(subquery|expression[,...n])
select *from [dbo].[stu] where number in (1,4);-- 指定number值为 1 和4 的 行结果 where number not in (1,4);-- 指定number值为 1 和4 之外的行结果
select *from [dbo].[stu] where number in (select number from [dbo].[student]) -- 子查询 就是在括号里面的是子类的,查询出对应的number 在和第一行的数据表的number进行查询有共同的number则有结果出来, where number not in (select number from [dbo].[student])-- 除了括号里面的 其他都要显示出结果/。 -- 子查询只是一个条件范围,返回的是主查询的记录
select a.num, a.age,a.sex from [dbo].[student] a -- 给表取一个名为a, a表中查询的 是num(学号)、age(年龄)、sex 。 a 就是student 这个表 where exists (select ID from [dbo].[student_course]b -- 在 b(student_course) 表中是否存在 ID 与a 中的 num、age等属性相同 存在则返回true 否则返回false where a.num = b. num) -- num 代表学号, EXISTS 指定一个子查询,检测行的存在。
-- 例题 select a.number ,a.name, from [dbo].[stu] as a -- a 就是代表stu这个表 where exists (select *from [dbo].[stu_course] b where a.number =b.number);-- 子查询中所有的字段,若a表和b表中的number相同则返回结果 where not exists (select *from [dbo].[stu_course] b where a.number =b.number); -- 不存在 就是返回false就是返回不存在b表中的值
3.9排序
放回纪律排序
关键字:ORDER BY
order_by_experssion [ASC | DESC][..n] 排序的字段要在表中存在才能进行排序,否则不能排序 ASC是升序 DESC是降序
select *from [dbo].[stu] order by id asc -- 升序 asc可省略 order by number desc -- 降序 select *from [dbo].[stu] order by id,number -- 多个一起排序 升序 select *from [dbo].[stu] order by id, number desc -- 多个一起排序前个是升序 后面一个是降序 书写字段的优先级进行排序,在前的先优先排序 -- 也可以对字符串进行排序,就是根据字符串对应的编码 进行排序, 日期等等都可以进行排序
3.10关联查询 (多表查询)
- inner join (交叉关联) 只返回两个表中连接字段相等的行
- left join(左关联) 返回包括左表中所有的记录 和右表中联结字段相等的记录 (就是在on条件控制相等的字段)
- right join 返回包括右表中的所有记录和左表中的联结字段相等的记录
select *from 表1 inner join 表2 on 表1 .字段号 = 表2 .字段号 -- on是两个表中的关联关系控制字段 on 后面是关联条件
select *from 表1 left join 表2 on 表1 .字段号 = 表2 .字段号
select *from 表1 right join 表2 on 表1 .字段号 = 表2 .字段号
3.11函数
- 聚合函数
AVG() : 返回各值的 平均值。忽略null
SUM():
MIN() : 返回表达式的最小值 字段类型为:数字型或字符型
MAX:返回表达式的最小值,字符类型为:数字型或字符型
select avg(字段名) From 表1
返回表达式的所有值的和,忽略null;sum()只能用于数字列 select Sum(字段名) FROM 表名
-- 例题 select AVG(score) from [dbo].[stu]; -- 求平均 select SUM(score) as sum_score from [dbo].[stu]; -- 求和 as 为字段取名字为 :sum_score select name+' - '+number as name_num from [dbo].[stu]; -- 把两列结合起来并命名为:name_num
select MIN(字段名) FROM 表名
select MAX(字段名) FROM 表名
-- 例题 select MIN(score) from [dbo].[stu]; -- 求平均 select MAX(score) as sum_score from [dbo].[stu];
COUNT()函数
返回组中的项数 并且返回的类型为整型
select COUNT(字段名) FROM 表名
-- 例题 select count(number) as '共有学号' from [dbo].[stu]; -- 忽略掉null的不计算进内 select COUNT_BIG(age) from [dbo].[stu] ;-- COUNT_BIG 用于大于2^23-1内 COUNT用于2^23-1内
LEN()函数
- 返回字符串表达式占用的字符数大小 并不是字符串的长度
- 起哄不包含尾随空格
- 若要返回表达式的字节数,使用DATELENGTH()函数
select LEN(字段名) FROM 表名
随机数的产成 RAND()
- 查询分析器中执行:select rand()
- 可以随机生成整数,小数很少。
select floor(rand()*N) -- 返回小于或等于所给表达式的最大整数 向下取整 select ceiling(rand()*N) -- 返回大于等关于所给表达式的最小整数 向上取整
时间函数
- GETDATE() : 返回数据库系统的时间值 返回类型是datetime()
- GETUTCDATE():返回当前国际标准时间值,返回类型为datetime
select GETUTCDATE()
SELECT GETDATE()
时间转换格式
- CONVENT() 函数把日期转换为新的数据类型;
- CONVENT()可以用不同格式显示日期/时间数据
- CONVENT(data_type(length),date_to_be_converted(),style) 三个参数分别是 1.要转换成的数据类型(长度),2.要转换的时间值,3.要转换的时间格式
Style ID |
style |
100或0 |
mon dd yyyy hh:miAM(PM) |
101 |
mm/dd/yy |
102 |
yy.mm.dd |
103 |
dd/mm/yy |
104 |
dd.mm.yy |
105 |
dd-mm-yy |
106 |
dd mon yy |
107 |
Mon dd,yy |
108 |
hh:mm:ss |
109或者9 |
mon dd yyyy hh:mi:ss: mmmAM(PM) |
110 |
mm-dd-yy |
111 |
yy/mm/dd |
112 |
yymmdd |
113或者13 |
dd mon yyyy hh:mm:ss.mmm(24h) |
114 |
hh:mi:ss:mmm(24h) |
120或者20 |
yyyy-mm-dd hh:mi:ss.mmm(24h) |
121或者21 |
yyyy-mm-dd hh:mm:ss.mmm |
126 |
yyyy-mm-ddThh:mm:ss.mmm(没有小数空格) |
130 |
dd mon yyyy hh:mi:ss.mmmAM(PM) |
131 |
dd/mm/yy hh:mi:ss.mmmAM(PM) |
-- 时间格式 select GETDATE();--格式是 2022-01-14 16:27:59.137 --只取年月日 select CONVERT(varchar(10),GETDATE(),110) as '月 日 年'; -- 01-14-2022 月 日 年 select CONVERT(varchar(23),GETDATE(),109) as '月日年时分秒'; -- 01 14 2022 4:31:24:417 月 日 年 时 分 秒
时间计算
DATEDIFF() :放回两个日期之间的天数
DATEADD()函数在日期中添加或减去指定的时间间隔
DATEDIFF(datepart, startdate ,enddate) -- startdate\enddate是合法的日期表达式 开始和结束时间 -- datepart 计算日期的哪一部分 比如 :单独计算 年 或者 月
DATEADD(datepart, number ,date) -- datepart增加或减去日期的部分 -- number 为增加或减去数 可以是负数 -- date 指定的日期
--计算天数 select DATEDIFF(DAY,'2022-1-12','2021-12-23'); --这两个时间的天数之差 后面的减去前面的时间 end - start select DATEDIFF(DAY,'2021-12-23','2022-1-12'); --计算月份 select DATEDIFF(MONTH,'2021-12-23 16:27:59.137','2022-01-14 16:27:59.137'); --只计算月份,不计算年 日 时间 select DATEDIFF(MINUTE,'2021-12-23 16:27:59.137','2022-01-14 16:27:59.137'); --只计算分钟,不计算年 月 日 小时 秒 -- 增加年月日时分秒 select DATEADD(YEAR,10,'2022-01-14 16:27:59.137') -- 加10年 select CONVERT(varchar(10), DATEADD(YEAR,10,'2022-01-14 16:27:59.137'),110); -- 加10年 select DATEADD(MONTH,-10,'2022-01-14 16:27:59.137') -- 减10个月 select DATEADD(DAY,10,'2022-01-14 16:27:59.137') -- 加10day select DATEADD(HOUR,-10,'2022-01-14 16:27:59.137') -- 减10小时 select DATEADD(MiNUTE,10,'2022-01-14 16:27:59.137') -- 加10分
日期的某一部份的获取或计算
DATEPART():用于返回日期/时间的单独部分,比如年 月 日 小时 分钟,秒 返回类似是INT类型
DATENAME();这个也是用于返回日期的单独部分 返回类是VARCHAR型
day() month() year()
select DATEPART(YEAR, GETDATE()) as '年'; -- 只要年 select DATEPART(Day, GETDATE()) as 'day'; -- 只日 select DATENAME(YEAR,GETDATE());-- 返回类型是varcahr类型 select YEAR(GETDATE());--年 select MONTH(GETDATE());-- 月 select DAY(GETDATE());-- 日
字符串函数
CAHRINDEX()
- CAHRINDEX(experssion1 ,expression2[,start_location]) expression1是到expression2中寻找的字符,start_location是expr2 在expre1中的位置。
start不写也可以,默认从0开始,返回一个index索引值,没有找到则返回 0
PATINDEX()
返回字符或者字符串在另一个字符串或者表达式中的起始位置,PATINDEX函数支持搜索字符串中使用通配符,这使PATINDEX函数对于变化的搜索字符串很有价值
和 CHARINDEX函数一样,PATINDEX函数返回搜索字符串在被搜索字符串中的起始位置。假如有这样一个PATINDEX函数:
PATINDEX(%BC%,'ABCD')
这个PATINDEX函数返回的结果是2,这和 CHARINDEX函数一样。这里的%标记告诉PATINDEX函数去找字符串“BC",不管被搜字符前后的是什么。
STUFF函数:用于删除指定长度的字符,并可以在制定的起点出插入另一组字符,返回类型是字符串类型
SUBSTRING() :用于截取指定长度的字符串
LEFT() 、RIGHT()
LTRIM() ,RTTIM() 去除首尾的空格
UPPER() LOWER():大小写转换
REPLACE()替换字符串
REPLICATE() SPACE()
REVERSE():倒置
CAST()数据类型转换 :
CASE()函数 : 条件判断转换 ,把满足条件的表达示转换为对应的结果
简单case() 有一定的限制
CASE() 搜索函数
select CHARINDEX('s','dasdsadsadsadsas',4); -- 在后面的字符串中找出第一次出现s的索引值,找不到返回0 后面是4 表示从第四个字符开始查找 select PATINDEX('%s%','sdasas'); -- 不加通配符是不能查找到的,必须要有通配符 -- 如果通配符只有单边的只能匹配字符串中第一个或者最后一个是不是改字符,是就返回索引值,不是则返回0 -- 单边的通配符是表示以什么字符(开头/结尾)
stuff(列名,开始位置,长度,替代字符串)
select STUFF('aabbccdd',5,2,'截取'); -- aabb截取dd 在第五个位置开始截取,截取两位,并且用“截取”代替 select *,STUFF(name,1,2,'wsnimm') as 'newname'from [dbo].[stu]; where number = 1
substring('字符串',开始位置,长度); -- 例题 select substring('sadsds',1,3); -- sad 下标从1开始 返回截取的内容 select *,SUBSTRING(cmath,2,2)as new from [dbo].[course1] where con = 1002;
LEFT() -- 返回字符串中从左边开始指定个数的字符。 LEFT ( 字符串 , 长度 ) -- 后面的参数不能为负数 RIGHT()-- 返回字符串中从 右边 开始指定个数的字符。 RIGHT( 字符串 , 长度 ) select left ('sadsds',3); -- sad 长度不能为负数 select right ('sadmlkdls',4); -- sds 顺序还是从左到右,但是只要右边的四个字符 select *,LEFT(cmath,2)as new from [dbo].[course1] select *,right(cend,2)as new from [dbo].[course1]
LTRIM()-- 删除起始空格后返回字符表达式。 LTRIM( 字符串 ) RTTIM()-- 截断所有尾随空格后返回一个字符串。 RTTIM( 字符串 ) --字符去除空格 select LTRIM(' s d a '); --去除左边的空格s d a select RTRIM(' s d a '); --去除右边的空格 s d a select *,LTRIM(cend)as new from [dbo].[course1] select *,RTRIM(cend)as new from [dbo].[course1]
UPPER()-- 返回小写字符数据转换为大写的字符表达式。 UPPER (字符串) LOWER()-- 返回大写字符数据转换为小写的字符表达式。 LOWER(字符串) select UPPER('dsad') -- DSAD select LOWER('DSAD') -- dsad select *,UPPER(cend)as new from [dbo].[course1] select *,LOWER(cend)as new from [dbo].[course1]
用另一个字符串值替换出现的所有指定字符患值。 REPLACE ( 源字符串, 源字符串中要被替换的字符串, 要替换的字符串 ) select replace('abdsad','ds','kl'); -- abklad 全部替换的 select *,replace(name,'张三','王八是你') from [dbo].[student] 要替换的长度不需要相等
REPLICATE以指定的次数重复字符表达式。 REPLICATE ( 字符串 ,重复次数(int) ) SPACE返回指定个数的空格表达示 SPACE( 个数(int) ) -- 返回空格数 select REPLICATE('SS',4) -- SSSSSSSS重复4次 select 's'+SPACE(4)+'s'; -- s s select *,REPLICATE(cend)as new from [dbo].[course1] select name +space(1)+number from [dbo].[course1] -- 把两个连接起来显示
select reverse('dsadlm') -- mldasd select *,reverse(cend)as new from [dbo].[course1]
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型 CAST( string_expression as data_type) select cast(123 as varchar); -- 123(varchar(10)) select cast('你' as varchar(10)); -- 你 (varchar(10)) select 'da'+CAST(1 as varchar(10)); -- da1 select CAST(2.5 as int); -- 2 select CAST('2012-12-02' as datetime); -- 2012-12-02 00:00:00.000 select cast(age as decimal(5,1)) from [dbo].[stu] -- 显示小数的位数 1位
case 字段 WHEN '条件' THEN '值' WHEN '条件' THEN '值' ELSE '值' END -- fe case 字段 WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END -- 简单case函数 select *,case sex when '男' then 'man' when '女' then 'woman' end as 'engsex' from [dbo].[stu]
case WHEN 字段 = '条件' THEN '值' WHEN 字段 = '条件' THEN '值' ELSE '值' END -- 例如 select *, case when age>10 and age<15 then '小孩子' -- in(10,11,12,13,14,15) then '小孩子' when age>30 and age<35 then '中年人' when age>60 then '老人' else '非人类 ' end from [dbo].[stu]
4.视图
4.1概念
- 视图是一张虚拟表,并不在数据库中以存储数据值集的形式存在。在引用过程中依据基表动态生成。
4.2视图的优缺点
- 安全:有的数据是需要保密的,如果直接把表给出来进行操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。
- 高效:复杂的连接查询,每次执行时效率比较低,可以考虑新建视图,每次从视图中获取,将会提高效率。
- 定制数据:将常用的字段放置在视图中。
4.3使用视图
- 创建视图
- 查询视图
- 修改视图
- 删除视图
#查看10号部门所有的员工信息 create view v_emp as select * from emp where deptno=10; -- 创建一个名为 v_emp 的视图
select * from v_emp;
# 将基表的ename字段修改了 update v_emp set ename='kitty' where empno=7839; # 将视图包含的deptno均修改为20,在基表中修改 update v_emp set deptno=20; # 结果集为空,基表中不存在10号部门了 select * from v_emp; # with check option保证视图查询条件不被修改,但其他字段可以修改 create view v_emp as select * from emp where deptno=10 with check option;
#删除视图(DDL操作) drop view v_emp;
4.3 要注意的问题
- 通过视图可以修改基表数据,但视图一般只做查询。
- with check option关键词词用于保证视图的查询条件不被修改,但其他字段可以修改。
5.索引
5.1什么是索引
索引是供服务器快速在表中查询一行数据的数据结构,可以比作书籍的目录。mysql中的索引的默认数据结构是B-Tree。
5.2使用索引好处
5.2.1性能指标
性能从高到低依次是:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL,其中all表示全表扫描。一般来说,查询至少达到range级别,最好能达到ref级别。否则,sql的查询性能会很慢。
5.2.2 查询语句性能比较
关键词explain:查看sql执行性能
#解释计划任务 #explain:查看sql执行性能 #性能级别:const,查询1row explain select * from emp where empno=7788; #性能级别:all(全表扫描),查询14row explain select * from emp where ename='scott'; -- 第1条语句的条件字段是主键,主键自动创建索引,根据记录地址查找;而第2条语句的条件是普通字段,做的是全表扫描。