SQL语句

查询、视图和游标

text::Transact——SQL

单行注释:---- 后面有空格,所以sql注入是 --+

多行注释:/**/


一、数据库

下面指的是SQL Server数据库。

1 数据库结构

数据文件

日志文件

文件组:

  • 一个数据文件只能存在于一个文件组中,一个文件组也只能被一个数据库使用。

2 系统数据库

master数据库:核心数据库,记录所有系统级信息。包括实例范围的元数据(例如登入账户)、端点、连接服务器和系统配置信息。

model数据库:所有用户数据库的创建模板,必须始终存在于Microsoft SQL Server系统中。

msdb数据库:SQL Server Agent使用msdb数据库来计划和警报作业

tempdb数据库:用作系统的临时存储。每次重启时SQL Server都会重新创建tempdb数据库,从而获得一个干净的数据库副本。

resource数据库(只读和隐藏的数据库):包含Microsoft SQL Server中的所有系统对象。

3 创建

界面

右键数据库创建——修改数值

SQL语句

Create database 库名
[ on
[ filegroup 文件组名]
(name = 逻辑名,
filename = '路径+文件名', --主库.mdf 次库.ndf
size = 初始大小,
maxsize = 最大大小,
filegrowth = 自动增长,)]

[ log on
[ filegroup 文件组名]
(name = 逻辑名,
filename = '路径+文件名', --日志.ldf
size = 初始大小,
maxsize = 最大大小,
filegrowth = 自动增长,)]
[collate 数据库校验方式名称]
[for attach]

-- []语句表示可以选用或不选用
-- ()语句表示除最后一行外其余命令用 , 隔开
-- 数据库校验可以选择:Windows校验方式,SQL校验方式
-- for attach 表示将已经存在的数据库文件附加到新的数据库中

案例

...

4 修改

界面

右键数据库属性

SQL语句

alter database 数据库名称
add file(具体文件格式) -- 向数据库中添加数据文件
[ ,...n ]
[ to filegroup 文件组名]

add log file(具体文件格式) -- 向数据库中添加日志文件
[ ,...n ]

| remove file 文件逻辑名称 -- 从数据库中删除文件,并删除物理文件。如果文件不为空则无法删除。
| modify file(具体文件格式) -- 修改文件
| add filegroup 文件组名 -- 向数据库中添加文件组
| remove filegroup 文件组名 -- 从数据库中删除文件组。若文件组非空需要先删除文件组中所有文件
| modify filegroup 文件组名 -- 修改文件组名称、设置文件组read_only(只读) | read_write(读写),指定文件组为default(默认文件组)
{
read_only | read_write ,
| default ,
| name = 新文件组名 }
}

-- 具体文件格式:
(
name = 文件逻辑名称
[ , newname = 新文件逻辑名称 ]
[ , size = 初始文件大小 ]
[ , maxsize = 文件最大容量 ]
[ , filegrowth = 文件自动增长容量]
)


案例

...

5 删除

界面

右键数据库删除。

SQL语句

drop database 数据库名称 [,…n]

案例

...

6 查看

界面

右键数据库属性。

SQL语句

-- 查看数据库结构(不指定显示全部)
exec Sp_helpdb [[@dbname=] 'name']
-- 查看文件信息(不指定显示全部)
exec Sp_helpfile [[@filename=] 'name']
-- 查看文件组名称(不指定显示全部)
exec Sp_helpfilegroup [[@filegroupname=] 'name']

案例

...

7 迁移

界面

分离:右键数据库——任务——分离

加载:右键数据库——附加


二、数据表

1 创建

数据类型 (下面为补充类型)

类型 作用
nchar,nvarchar,ntext Unicode字符
text / ntext 文本字符型,最大存 2 ^ 31 - 1 / 2 ^ 30 -1 个字符
money / smallmoney 货币型,可精确到小数点后四位
auto_increment 自动递增,可以自动递增或随机产生一个整数,常用来自动产生唯一编号

创建数据表

create table <表名> ( <列定义> [ { , <列定义> | <表约束> } ] )

-- <列定义>: <列名> <数据类型> [ default ] [ {列约束} ]

数据表约束

-- 创建约束
[ constraint < 约束名 > ] < 约束类型 >

-- 允许/不允许为空(缺省值为 NULL)
NULL / NOT NULL
[ constraint < 约束名 > ] [ NULL | NOT NULL ]

-- 唯一约束(表明某列值必须唯一,允许NULL)
unique
[ constraint < 约束名 > ] [ unique ]
-- unique会强制在指定字段上创造一个unique索引,缺省为非聚集索引。

-- 主键(唯一标识,不允许NULL)
primary key
[ constraint < 约束名 > ] primary key ( < 列名 > [ { , < 列名 > } ] )
-- 一个表只能一个主键(但是可以联合多个列)
-- 定义了primary key的列不能定义unique。

-- 外键(联立从表主键)
foreign key
[ constraint < 约束名 > ] foreign key [ references < 主表名 > ] ( < 列名 > [ { , < 列名 > } ] )

-- 约束(检查条件)
check
[ constraint < 约束名 > ] check ( < 条件 > )

特殊使用

-- 查看全部约束
select * from sys.objects
where type in ( 'c' , 'd' , 'f' , 'pk' , 'uq')
-- in中分别为:check,default,foreign key,primary key,unique。

案例

create table pwd
(
id integer primary key autoincrement,
name nvarchar(20) not null,
user nvarchar(20) not null,
pwd nvarchar(33) not null,
text nvarchar(40) not null
);

2 修改

表格式修改

-- 增加列或列约束
alter table <表名>
add <列定义> | <完整性约束定义>
# <完整性约束定义>constraint <约束名> <约束>


-- 修改列
alter table < 表名 >
alter column < 列名 > < 数据类型 > [ NULL | NOT NULL ]
# 注:(不能改列名,不能改类型,不能减少宽度,不能null -> not null,有其他约束应该先删其他约束)

表数据修改

-- 插入数据
insert into <表名> [(<列名1>[,<列名2>...])] # (插入写列名则插入对应列,不写则插入数据要含有全部的列)
values (<>) [,(<>)] # (插入一行或多行的值)
# 多行插入:子查询,values带多个值。


-- 修改数据
update <表名>
set <列名> = <表达式> [,<列名> = <表达式>]...
[where <条件>]

案例

...

3 删除

删除数据表

-- 删除列或约束
alter table <表名>
drop constraint <约束名> | drop column <列名>

-- 删除表
drop table <表名>

删除数据表数据

-- 删除数据
delete
from <表名>
[where <条件>]

案例

..

4 查看

查数据表格式:右键属性。

查数据表数据:单表查询、多表查询。

4.1 select 单表查询

比较运算符:等于(=)、不等于(<>)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)

统计函数:

  • 统计结果无列名,可以用as取别名。
  • count(distinct)可以消除重复行取和,count对空值不计算,对0计算。
  • (count *)不消除重复行,不可以用distinct。
符号 作用
like 类似(like是模糊信息,=是确定信息)
is null 判断空(不能用=null)
通配符 作用
% 多个字符
_ 一个字符
[ 0~9 ] 在0~9中的字符
[ ^3~7 ] 不在3~7中的字符
符号 作用
avg 平均数
sum 总数
max 最大值
min 最小值
count 总个数

单表查询

select [ all | distinct ] [ TOP N [ percent ] [ with ties ] ]
< 列名 > [ as 别名1 ] [ { < 列名 > [ as 别名2 ] }]
from < 表名 > [ [ as ] 表别名 ]
[ where < 检索条件 >]
[ group by < 列名1 > [ having < 条件表达式 > ] ]
[ order by <列名2 > [ asc | desc ] ]

-- \* :全部列名。
-- distinct :去重查询。(需要元组重复才会去重)

# 按照什么值分组
group by
having # 分组后按照一定条件筛选。

# 按照什么排序
order by
asc|desc # 默认升序,(升序 | 降序)

案例

```



#### 4.2 select 多表查询

> 查询格式同上
>
> 内连接查询:不符合结果则不输出,表间用 , 隔开是内连接。`inner join`
>
> 外连接查询:不符合结果输出空。外连接查询where改成on
>
> [外连接查询](https://www.cnblogs.com/menghen/p/12569473.html) [外连接查询图解](https://www.zhihu.com/question/34559578/answer/2561071157)

| 语句 | 作用 |
| -------------------- | ------------------------ |
| left ( outer ) join | 左边表全,右边缺用null|
| right ( outer ) join | 右边表全,左边缺用null|
| full ( outer ) join | 左右表的并集 |
| cross join | 笛卡尔连接 |



自连接查询

> 取别名,自己查自己,输出需要的数据。

```sql
-- 例:输出薪水大于刘伟的人的薪水
select x.sal
from t as x, t as y
where x.sal > y.sal and y.tn = '刘伟'

子查询

-- 任意(可用 in 代替)
any
-- 所有
all
-- (不)存在
[not] exists
-- 联合查询(输出一个结果集,需要同结构的表,会自动去重)
union

其他

-- 把查询结果输入到一个表中
select ... into <表名>

案例

...

三、视图

1 创建视图

语句

create view view_name [(column [ , ... n ])]
[with <view_attribute> [, ... n ]]
as select_statement
[with check option] [;] -- 修改视图需要符合以下语句
< view_attribute > ::=
{
[ encryption ]
[ schemabinding ]
[ view_metadate ]
}

-- [( column [, ... n])] -- 列是算术表达式,函数,常量派生才需要列名。
-- [ with check option ] [;] -- 修改视图需要符合以下语句。
-- [ encryption ] -- 加密后无法修改视图。
-- [ schemabinding ] -- 绑定框架,不能随便更改框架。
-- [ view_metadate ] -- 不设置返回视图引用的metadate,否则返回视图自身的metadata。

案例

...

2 修改视图

语句

alter view view_name
as <子查询>

案例

...

3 查询视图

和表一样。

案例

...

4 删除视图

语句

drop view view_name

案例

...

5 视图操作

数据操作和表一样。

案例

...

四、索引

1 创建索引

语句

create [ unique ] [ clustered | nonclustered ] index index_name
on table_or_view_name ( column_name [ asc | desc ] [ , ... n ] )
[ with < index_option > [ , ... n] ]
[ on { filegroup_name | "default" } ]

-- unique:唯一索引
-- clustered:聚集索引
-- nonclustered:非聚集索引

案例

...

2 修改索引

语句

...

案例

...

3 删除索引

语句

drop index <index name> on <table or view_name>

案例

...

4 查看索引

语句

# 查看索引
exec sp_helpindex [@objname =] 'name'
# 改索引名
exec sp_rename 'index_name' 'index_newname'

案例

...

五、用户

用户操作

1 创建用户

语句

-- 创建登入用户
create login login_name with password = 'passwd'

-- 创建数据库用户
create user user_name [for login login_name]

案例

...

2 修改用户

语句

...

案例

...

3 删除用户

语句

...

案例

...

4 赋予权限

语句

grant create  on database_name to user_name

exec sp_addrolemember 'db_owner' 'user_name'

案例

...

5 移除权限

语句

revoke create on database_name from user_name

案例

...

六、规则与默认

1 创建规则

语句

...

案例

...

2 删除规则

语句

...

案例

...

3 绑定规则

语句

...

案例

...

1 创建默认

语句

...

案例

...

2 删除默认

语句

...

案例

...

3 绑定默认

语句

...

案例

...

七、案例查询

1 所有查询

语句

-- 查询所有数据表
select name from sysobjects where type = 'U' order by name

-- 查询所有约束
select * from sys.objects where type in ('c','d','f','pk','uq')

-- 查询所有视图
select * from sysobjects where xtype='V'

八、提示

引号中打引号用 '' (两个单引号)