对数据库的操作
对数据库的操作可分为图形界面的操作和脚本操作,本章主要总结关于脚本的操作。
数据库的创建
create datebase [数据库名]
on primary( //主文件
name='主文件名',
filename='主文件路径' //如'D:\zerotwo\zerotwo.mdf'
size=10MB,
maxsize=100MB,
filegrowth=5MB
);
log on ( //日志文件
name='日志文件名'
filename='日志文件名', //如'D:\zerotwo\zerotwo.ldf'
size=10MB,
maxsize=100MB,
filegrowth=5MB
);
需要注意主文件和日志文件的后缀名。
数据库的修改与删除
exec sp_helpdb [数据库名]
其作用为查询数据库的状态(属性等是否发生改变)
exec sp_helpdb 数据库名;
数据库的修改
数据库的修改要用到关键字alter,注意是先说明对数据库的修改,再用modify说明要修改数据库的具体内容。下面举几个对数据库修改的例子:
alter database 数据库名
modify name=修改后的数据库名;
alter database 数据库名
modify file(
name=原名,
size=新,
maxsize=新,
filegrowth=新
);
注意,修改数据库中的数据文件的话,数据文件名不能更改,在这样将其名字写出来是为了在数据库中找到叫这个名字的文件。
数据库的删除
数据库的删除需要用到drop关键字
drop database 数据库名;
数据库的备份与还原
数据类型
在SQL Sever中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整形数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
数字类型
数据类型 | 范围 | 存储 |
---|---|---|
bigint | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1 | 8字节 |
int | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 | 4字节 |
smallint | − 2 1 5 -2^15 −215~ 2 15 − 1 2^{15}-1 215−1 | 2字节 |
tinyint | 0 0 0~ 255 255 255 | 1字节 |
float |
时间类型
数据类型 | 输出 |
---|---|
time | 17:20:20.1234567 |
date | 2022-6-20 |
smalldatetime | 2022-6-20 17:21:21 |
datetime | 2022-6-20 17:21:54.123 |
datetime2 | 2022-6-20 17:22:11.1234567 |
字符串类型
- char(n)
固定长度。n用于定义字符串长度,并且它必须为1到8000之间的值。 - varcahr(n|max)
可变长度。n用于定义字符串长度,并且它可以为1到8000之间的值。 - nchar(n)
固定长度的Unicode字符串数据。n用于定义字符串长度,并且它必须为1到4000之间的值。 - nvarchar(n|max)
可变长度的Unicode字符串数据。n用于定义字符串长度,并且它可以为1到4000之间的值。
数据表
新建表
- 若要创建表,必须要提供该表的名称以及该表中每个列的名称和数据类型。指出每个列中是否允许空值,也是一种很良好的做法。
- 大多数表有一个主键,主键由表的一列或多列组成。主键始终是唯一的。数据库引擎将强制实施以下限制:表中的任何主键值都不能重复。
create table 表名
(ID int primary key not null,
name varchar(10) not null,
age int null
);
修改表
- 更改列的类型长度
alter table 表名
alter column 列名 列长度
- 更改列的类型
alter table 表名
alter column 列名 更改后的类型
- 添加not null约束
alter table 表名
alter column 列名 列的类型 not null; //null/not null都是可选项,注意列的类型不可省略
- 设置主键
alter table 表名
alter constraint 主键名 primary key(列名);
- 更改列名
exec sp_rename '表名.列名','修改后的列名','column';
- 添加列名
alter table 表名
add 列名 类型 default not null; //后面两个可选项
- 删除表
drop table 表名;
定义主键、外键
- 增加主键(没有主键的情况下)
alter table 表名 add constraint 主键名 primary key(列名);
- 删除主键
alter table 表名 drop constraint 主键名;
- 删除外键
alter table 表名
add constraint 外键名
foreign key(列名)
references 外表名(依赖的外表列)
- 删除外键
alter table 表名 drop constraint 外键名
新增表记录
- 插入单行数据
insert into 表名(列名1,列名2,...)
values(值1,值2,...)
注意,插入的值与列名的顺序是一一对应的,还应注意符号是英文状态的符号。
如果值是字符的话记得加单引号’ ’
- 插入多行数据
insert into 表名(列名1,列名2,...)
values(值1,值2,...),(值1,值2,...),(值1,值2,...),...
- 从其他表复制数据
insert into 表名1 (列名1,列名2,...)
select 列名1,列名2,...
from 表名2
注意是将标表2的数据复制到表1的数据。
查询数据库中的表记录
- 查询某一列或几列值
select 列名1,列名2,...
from 表名
- 查询全部列值
select *
from 表名
- 消除重复值
select distinct 列名1,列名2,...
from 表名
- 查询前几或几十行数据
select top 行数 列名1,列名2,...
from 表名
修改表记录
update 表名
set 列名1=新的列值,列名2=新的列值,...
where 条件限制
删除表记录
delete from 表名 //from可省略
where 条件限制
where条件限制语句
查询条件
where语句并不是所有查询条件都能使用的,下面我们给出一些where常用的查询条件。
查询条件 | 谓词 |
---|---|
比较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | between and, not between and |
确定集合 | in, not in |
字符匹配 | like,not like |
空值 | is null,is not null |
多重条件 | and,or,not |
需要注意的是,where子句中是不能用聚集函数作为条件表达式的。
字符匹配
where 列名 like '匹配串'
其中,匹配符可以是一个完整的字符串,也可以含有通配符%和_。
- %(百分号)代表任意长度的字符串(长度可以为0)。例如a%b表示以a开头,以b结尾的任意长度的字符串。b%表示任意开头,以b结尾的字符串。
- _(下横线)表示任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。
BETWEEN语法
用于限制条件的表达式,指示表示指定范围。除了数字外,字符(字母、时间等)也可用between限制。
where 列名 between 100 and 200
where 列名 not between 100 and 200
where 列名 between 'acd' and 'acz'
子查询IN
select *
from 表名
where 列名 in (列值1,列值2,...);
select 表1中的列名
from 表1
where 表1中的列名 in (select 表2中的列名 from 表2);
同样,in前也可以加not来表示。
子查询EXISTS
exists用来检测子查询中的行是否存在,若存在,则返回Ture;若不存在,则返回false。
在子查询中得到了Ture之后,才能再打印出主查询所查询的行。
select b.name,b.age,b.num from Student1 as b
where exists(select * from Student2 as a where a.num=b.num);
返回记录的排序
order by
select *
from 表名
order by 列名 asc|desc //系统默认是asc,所以升序时不用将asc打出来
order by 列名1,列名2
若是按照两个属性来排序,则先按列名1排序,再在列名1中相同的序号里按列名2排序。
关联查询
交叉关联(inner join)
只返回两个表中属性列相等的行
select *
from 表1 inner join 表2 on 表1.属性列=表2.属性列
左关联(left join)
返回左表中的所有记录和右表中联结属性列相等的记录
select *
from 表1 left join 表2 on 表1.属性列=表2.属性列
右关联(right join)
返回右表中的所有记录和左表中联结属性列相等的记录
通过两表连接进而又可以进行多表连接