SQL server基础和部分内置函数
摘要
笔者在曾经学习过mysql的基础上,对sql server基础一个基本学习。
一、特性
- 高性能特性 充分利用windowNT优势
- 系统管理先进 支持windows GUI 支持本地和远程
- 强壮的事物处理功能
- 支持对此处理器结构、存储过程、ODBC、自主的SQL语言
二、数据库基本操作
创建
if exists(select * from sys.databases where name='TestDB')
drop database TestDB --查询数据库名为TestDB的数据库,如果有则删除。
GO
create database TestDB --创建数据库,TestDB
on primary --定义在主文件组上的文件
(name='db_hj', --逻辑名称为student_date1(只在DBMS上存储)
filename='C:\project\db_hj.mdf', --物理名称(存储在磁盘上的文件)
size=20MB, --主文件初始大小为20mb
maxsize=unlimited, --主文件最大限制为无限大
filegrowth=0) --主数据文件增长幅度为0
LOG ON --定义事务日志文件
(name='db_hj_log', --逻辑名称为student_log1
filename='C:\project\db_hj_log.ldf', --物理名称
size=5MB, --事务日志初始大小为5MB
maxsize=10MB, --事务日志最大限制为10MB
filegrowth=0) --事务日志增长幅度为0
修改
alter database TESTDB_HJ
modify name = testhj --修改数据库名称
alter database testhj --修改逻辑文件名称名称
modify file(
name = 'TESTDB_HJ', --这里填数据库逻辑文件名称名称
size = 20MB,
maxsize = 50MB,
filegrowth = 10MB
)
删除
drop database testhj
相关命令
exec sp_helpdb DBNAME --显示有关 DBNAME 数据库的信息
exec sp_helpdb --返回有关所有数据库的信息
exec sp_rename 'CountProce','CountProce1'; ------重命名存储过程名;
exec sp_rename 'fruits.f_name','f_names','COLUMN';--重命名字段名;
exec sp_rename 'suppliers','supplier'; -----------重命名表名;
参考:https://blog.csdn.net/baidu_32731497/article/details/51523236
三、备份还原
备份
1.SQL server Management Studio 连接数据库 找到要备份的数据库 右键->任务->备份;
2.在弹出的窗口中选择备份数据库,备份类型,默认是当前右键选择的数据库,备份类型是完整备份,并选择备份路径和文件名称;
3.点击确定,生成备份文件。
还原
1.在本机上新建一个数据库,这个库是空的,没有任何表的其他信息。是右键选择新建数据库生成的;
2.在新建的这个数据库上,选择右键,任务->还原->数据库;
3.在窗口中,选择设备为上面备份的文件,目标数据库为新建的库。
四、数据类型
类型 | 范围 | 存储 |
---|---|---|
bigint | -2^63 -2^63-1 | 8字节 |
int | -223-223-1 | 4字节 |
samllint | -215-215-1 | 2字节 |
tinyint | 0-255 | 1字节 |
float | -1.79E+ 308至-2.23E - 308、0以及2.23E - 308至1.79E + 308 | 取决于n的值 |
类型 | 输出 |
---|---|
time | 12:35:29.1234567 |
date | 2020-11-10 |
smalldatetime | 2020-11-10 12:35:29 |
datetime | 2020-11-10 12:35:29.123 |
datetime2 | 2020-11-10 12:35:29.1234567 |
char[1-8000] nchar[1-4000] 固定长度
varchar[1-8000] nvarchar[1-4000] 可变长度
五、数据表
create table T_USERS
(
ID int IDENTITY (1000,1),
NAME NVARCHAR(20)
); --自增列
create type 数据类型名称 --创建自定义数据类型
from 数据类型 [NOT NULL]
drop type 数据类型名称 --删除自定义数据类型
EXEC SP_HELP 对象名称; --查看定义
select * from SYS.TABLES
where NAME=‘对象名称’;
alter table 表名
add 列名 数据类型,列名 数据类型 --增加列
add constraint KID primary key (ID) --增加主键
alter table 从表
constraint 外键名 foreign key (从表字段)
references 主表(主表字段) --增加外键
alter table 表名
alter COLUMN 列名 数据类型 --修改列
alter table 表名 --删除列
drop COLUMN 列名,列名
drop table 表名 --删除表
插入
insert into 表名 (字段一,字段二..) values(value1,value2...) --单行插入
insert into 表名 (字段一,字段二..)
values(value1,value2...),
(value1,value2...),
(value1,value2...); --多行插入
insert into 表一 (字段一,字段二..)
select 字段一,字段二,...
from 表二; --copy其他表
查表
--基本用法
select [distinct][*][字段] from 表名 --distinct去除重复字段
--where 条件
select * from 表名
where 字段名 like '%待匹配文本' --查询相应字段 为 "xx待匹配文本" 的记录
like '待匹配文本%' --查询相应字段 为 "待匹配文本xx" 的记录
like '%待匹配文本%' --查询相应字段 为 "xx待匹配文本xx" 的记录
select * from 表名
where 字段名 [not] between 开始值 and 结束值 --查询字段名 在开始值和结束值之间的记录 not 取反
select * from 表名
where createDate between '2020-07-30' and GETDATE() --查询记录创建时间 到服务器当前时间为止
select * from 表名
where 字段名 [not] in (字段值1,字段值2,字段值3) --查询在in(字段值)中的相应字段值的记录 not 取反 相当于分别执行了 where 字段名=字段值1, 字段名=字段值2, 字段名=字段值3
select * from 表名 where 字段名 [not] in (select 字段名 from 表名 where 条件) --子查询筛选完后主查询再在子查询的结果中查询
--子查询EXISTS
select A.a from 表名 A
where [not] exists (select * from 表名 B where A.id = B.id) --查询子查询中有的记录 ()中有的值返回true,主查询显示;false 主查询不显示
--返回记录排序
select * from 表名 order by A.id,A.a [desc] --先按id排序,再按a排序 默认升序,可多字段 desc降序 字符串数字在数据库中按照ASCII码排序,从字符的第一个数字对比,首先就会将为首个数字相同的排在一起,在从这些字符串里面对比第二个数字
--inner join (交叉关联)只返回两个表中联结字段相等的行 inner可省略
select * from 表1
inner join 表2
on 表1.字段号=表2.字段号
--left join(左关联)返回包括左表中的所有记录和右表中联结字段相等的记录
select * from 表1 --主表
left join 表2
on 表1.字段号=表2.字段号
--right join(由关联) 表二是主表
更新
update 表名 set 字段名 = 修改值 where 条件
删除
delect [字段][*] from 表名 where 条件
聚合函数
select avg(数字类型字段) from 表名 --平均值,忽略NULL
select sum(数字类型字段) from 表名 --求和,忽略NULL
select 字段一+字段二 from 表名 --记录返回为字符串
select min/max(数字类型或字符型) from 表名 --最大/小值,忽略NULL
select count(字段) from 表名 --返回组中的项数(整型),忽略NULL,count_big(更大的范围2^23-1)
select len(数字类型字段) from 表名 --返回指定字符串表达式的字符数,不含尾随空格,返回字节数用DATALENTH()
随机数
select rand() --随机得到一个小数,类似:0.836393773069793
select floor(rand()*N) --向下取整
select ceiling(rand()*N) --向上取整 [1-N]
内置函数
--时间相关
select GETDATE() --系统当前时间
select GETUTCDATE() --国际标准时间
CONVERT(数据类型,要转换的时间值,格式) --转换日期类型 格式(如下表)
select CONVERT(varchar(10),GETDATE(),110) --11-14-2020
DATEDIFF(时间单位,startdate,enddate) --函数返回两个日期之间的天数。startdate和 enddate参数是合法的日期表达式。
select DATEDIFF(DAY,'2020-11-10','2020-11-14') --4
DATEADD(时间单位,num,date) --函数在日期中添加或减去指定的时间间隔,-num,向前数
select DATEADD(DAY,5,'2020-11-14') -- 2020-11-19 00:00:00.000
DATEPART(时间单位,时间) --返回日期/时间的单独部分,比如年、月、日、小时、分钟等等,返回类型是一个INT整型
select DATEPART(YEAR,GETDATE()) --2020
DATENAME() --返回日期/时间的单独部份,返回数型是一个VARCHAR型
day() 、 month()、year() --获取数据库服务器系统当前时间对应的值
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 |
… | … |
--字符串相关
CHARINDEX ( str1 , str2 [ , start_location ] ) --返回字符或者字符串在另一个字符串中的起始位置,str1是要到str2中寻找的字符中,start_location是CHARINDEX函数开始在str2中找str1的位置,返回位置(可理解为数组下标),否则返回0。
select charindex('aa','ccssddaadd',3) --7
PATINDEX('%字符%','str(字段名)') --返回字符或者字符串在另一个字符串中的起始位置,支持通配符。
select patindex('%aa','ccssddaa') --7 以aa结尾
STUFF(str(字段名) ,开始位置,长度,替代字符串) --删除指定长度的字符,并可以在制定的起点处插入另一组字符。,返回类型是一个字符串型
select STUFF('aabbccdd',5,2,'ee') --aabbeedd
SUBSTRING( str(字段名) , start, length ) --函数用于截取指定长度的字符串
select substring('aabbccdd',5,2) --cc
LEFT ( str(字段名) , num ) --返回字符串中从左边开始指定个数的字符
select LEFT('aabbccdd',2) --aa
RIGHT( str , num ) --返回字符串中从右边开始指定个数的字符。
select right('aabbccdd',2) --dd
LTRIM(str(字段名)) --删除起始空格后返回字符表达式。
RTRIM(str(字段名)) --截断所有尾随空格后返回一个字符串。
UPPER(str(字段名)),LOWER(str(字段名)) --大小写转换
REPLACE(str1,str2,str3) --将str1中的str2替换为str3
REPLICATE(str1,num) --返回num次str1 str1str1str1
SPACE(n) --返会n个空格
select 字段一 + SPACE(3) + 字段二 from 表 --字段一 字段二
REVERSE(str) --倒置字符串
--数据类型转换
CAST(123 as varchar(10)) --123转换为varcahr型
select 'abc' + CAST(123 as varchar(10)) --'abc123'
select CAST(12.5 as decimal(18,2)) --12.50
--CASE (相当于if……elseif)
select * ,
case when A.sex = 1 then '男'
when A.sex = 2 then '女'
end '性别'
from student A --男女生按性别分类