目录
1.创建数据库
create database <数据库名>
on (
name=<数据库名_data>, --数据文件的逻辑名称,不能与日志逻辑同名
filename='路径\<数据库名>.mdf', --mdf数据库的后缀,数据库文件存放地址
size=< >, --数据库初始大小
maxsize-< >, --数据库最大大小
filegrowth=< > --数据库每次增长大小
)
log on(
name=<数据库名_log>, --日志文件名称
filename='<路径>'\<数据库名>.ldf', --ldf日志文件的后缀路径,日志文件存放地址
size=< >, --日志文件初始大小
maxsize=< >, --日志文件最大大小
filegrowth=< >, --每次增长大小
)
2.创建、修改、删除表或模式
--创建模式
create schema <模式名> authorization <用户名> --用户名默认系统下的dbo
--删除模式
drop schema <模式名> [cascade|restrict]
--cascade(级联)删除模式同时把模式下的数据库对象全部删除
--restrict(限制)如果该模式下有数据库对象,则拒绝删除该模式
用户名必须是已有的,可以在<数据库>- 安全性-用户下查找。
--创建表
create table <表名> --默认在用户dbo下创建表
(<列名> <数据类型> [完整性约束]
……
)
--创建一个新表并讲已有表中的数据添加
select <列名>
into <新表名>
from <已有表名>
--删除表
drop table <表名>
||
delete from <表名> --删除符合条件的表中数据
[where <条件>]
--修改表
alter table <表名>
add <新列名> <数据类型> [完整性约束] --增加新列
| add <表级完整性约束> --增加表级完整性约束
| drop column <列名> [cascade | restrict] --删除表中的列
| drop constraint <完整性约束名> [restrict | cascade] --删除表中的完整性约束
| alter column <列名> <新数据类型> --改变表中列的数据类型
完整性约束包括主键(primary key)、唯一值(unique)和对其他类型的约束,例如对数字类型的约束如{<Score> int (<Score> between 0 and 100)}和字符型的约束如{ <Sex> char (2) (Sex='男' or Sex='女') }。
alter 只能修改列的数据类型,不能修改列的名称。
--在模式下创建表
create schema <模式名> authorization <用户名> --在用户< >下创建模式< >并创建表
create table <表名> (
<列名> <数据类型> <完整性约束>
……
)
3、建立索引
--创建索引
create [unique] | [cluster] --默认是非聚簇(nonclustered),可定义unique(唯一)
index <索引名> --和cluster(聚簇)的索引
on <表名> ( <列名> [次序] --聚簇是什么?
……
)
--删除索引
drop index <索引名> on <表名>
4、插入数据
--插入数据
insert into <表名>( <列名> )
values (<数据>), --按照列名的顺序填写数据
……;
若在一个表中插入信息,而这个表有两个及以上外键,则这两个外键都必须有数据插入,否则会报错。
5、更新数据
--更新数据
update <表名>
set <列名> = <修改的表达式> [,<列名> = <表达式>]
[where <修改符合的条件>] --若不加where条件,则整列数据都修改
--例如:
update S
set Sage=20 --在S表下的Sage列修改信息即改为20
where Sno='20211228' --符合Sno='20211228'的条件
6、查询表
--单表查询
select [all | distinct] <目标表达式> --默认all,distinct为消除重复元组。目标表达式可以是列名,也可以是算式表达式
from <表名>
[where <条件表达式>] --选择查询符合的条件
[group by <列名> [having <条件表达式>] ] --按分类查询,且满足条件表达式
[order by <列名> [asc | desc] ]; --以<列名>的升序(asc)、降序(desc)查询
--group by语句
--例:
select Ssex,count(*) --从S表查询所有列
from S
group by Ssex; --以Ssex列里的数据分类,前面必须要有Ssex
--where <条件表达式>
--例;
select Sage
from S
where Sage [not] between 17 and 30 --条件是Sage在17与30间
|
where Ssex [not] in ('男','女') --条件是Ssex在男与女
|
where Sname [not] like '条件' --字符型在'条件'中的数据
--条件中可以使用通配符
--若需要查询的目标中有通配符,则可以用转换符 escape '符号'
--例:
where Cname like 'DB\_data' escape '\' --即查询的目标为DB_data
查询全部列用count(*)。
通配符中:'%'表示任意长度,如a%b表示以a开头,b结尾任意长度的数据。'_'表示固定长度,如a_b表示以a开头,b结尾的三个字符长度的数据。
having与where的区别:作用对象不同。where作用与基于表或视图,从中选择满足条件的元组。having作用于元组,从中选择满足条件的元组。
7、视图
--创建视图
create view <视图名>[<列名>]
as
<子查询>
[with check option] --针对与视图所作的所有更新操作必须满足子查询中指定的限制条件
--删除视图
drop view <视图名> [cascade] --cascade将该视图和它导出的所有视图一起删除
--查询视图、更新视图与表的方法相同
建立视图时,除了需要创建整个表的列,否则需要在子查询中的select后写出相应的列,不能用 * 。
8、函数
count( [ distinct | all ] <列名> ) 为计数函数,输出列下元组的个数。
sum( [ distinct | all ] <列名>)为求和函数,输出列下元素的相加的和,属性列必须是数值。
avg( [ distinct | all ] <列名>)为求平均值函数,输出列下元素的平均值。
max | min ( [ distinct | all ] <列名>) 为求最大(小)值函数,输出最大(小)值。
datediff( day , <列名> , <列名> ) 求两个日期的时间差。day表示天数差。
dateadd(month, <数字>,<列名>) 表示在<列名>下增加<数字>个manth
round(函数( ),2)表示保留两位小数。例:表示取price的平均值并保留两位小数。
cast( (名) as (类型) )将一个属性的类型换成另一个类型
--例:
select count(*) as '人数' --在S表中查询所有列的下元组的总数
from S;
--例:
select Tno,round(avg(price),2) as avg_price from tb_book
group by Tno;
--cast
declare @x date
cast(@x as char(10))
--将原本类型是date的@x变量转换为char类型
' * '代表全部。即全部列。
as 可以用在列名后,表示给查询结果重新命名列名。
9、创建用户
1、 创建登录用户
create login <用户名>
{
with “密码”=' ' --密码
|[,default_database=database ]
|[,default_language=language ]
}
--eg
create login [qsy_4_11] --[]可以用来表示命名的起始
with ”密码“='123456' --创建成功可以在安全性->登录名查看
“密码”=password
--禁用登录用户
alter login <用户名> disable
--启用登录用户
alter login <用户名> enable
--自主存取控制 由grant与revoke
--可用权限:create [ schema | table | view | index | ]
-- alter table
-- select insert update delete
2、创建用户,授权与取回
--创建用户
create user user_name
[
{for | from}
{
login login_name
}
| without login
]
[ with default_schema=schema_name ]
--给用户授权
grant <权限> []
on <对象类型> <对象名> [] --
to <用户> []
[with grant option] --不允许循环授予权限
--eg
grant update(Sno),select
on Student
to U1
[with grant option]
--回收权限
revoke <权限> []
[on <对象类型> <对象名> ]
from <用户> []
--eg
revoke insert
on SC
from U2 cascade --sql中不能联级收回
--权限
--dba 全部权限
--resource 只能create table 、登录数据库、查询和操纵数据
--connect 登录数据库、查询和操纵数据
3、创建角色,授予与取回权限
--角色创建
create role <角色名>
--给角色授权
grant <权限> []
on <对象类型> 对象名
to <角色> []
--将一个角色授予其他角色或用户
grant <角色> []
to <被授予角色>
[with admin option]
--角色权限收回
revoke <权限>
on <对象类型> <对象名>
from <角色> []
角色是被命名的一组与数据库操作相关的权限。--是权限的集合 --可为一组具有相同权限的用户创建一个角色 --简化了授权过程。
12、存储过程
--创建存储过程:
create procedure 过程名 (
@参数名 参数类型[,]
[ ] --若是返回参数,则啊参数类型后加 output
)
as 过程体
--若过程体内有多条语句,则在as后使用begin [过程体] end
--修改存储过程
--重命名:
alter procedure 过程1 rename to 过程2;
--删除存储过程
drop procedure 过程名
--有返回参数时过程块里需要赋予返回值
set @参数名=()
--eg、db_Library
create procedure PRO_returnB_sum(
@B_sum int output,
@Rno char(10)
)
as begin
select B.* --显示学号为@Rno的学生
from tb_borrow B,tb_reader R --的借阅信息
where B.Rname=R.Rname and R.Rno=@Rno
set @B_sum=(select count(Bno) --给参数B_sum赋值
from tb_borrow B,tb_reader R --计算该学生借了多少本书
where B.Rname=R.Rname and R.Rno=@Rno
)
OR select @B_sum=count(Bno)
from tb_borrow B,tb_reader R
where B.Rname=R.Rname and R.Rno=@Rno
end
给返回参数赋值有两种方法,一种是用set关键字,一种是在select内。
--调用存储过程
declare 参数 --声明变量
exec 过程名 实参
eg、过程 PRO_returnB_sum
exec PRO_returnB_sum @B_sum output,'2021051228' --学号为2021051228
select @B_sum --显示借阅总数
11、游标
--创建游标
declare cursor_name cursor for --创建一个含Bname,Bno的游标
select Bname,Bno
from tb_book
open cursor_name --打开游标
12、学习中遇到的错误
分组显示时,不能得知分组情况
解决:在select 语句后添加所分组的列名。
3、在使用grant为用户“User2”授权时出现“不能为实体级权限指定子实体(如列或安全性表达式)列表”的问题。解决:因为alter、insert不能对单独的列进行操作,alter只能对表进行操作,insert只能插入一组数据。故这两个操作不能单独对列进行。否则报错。
4、在数据库下创建用户时,报错,内容为该登录已用另一个用户名开立账户。这是在另一个windows用户在某个数据库下创建用户。报错的原因是在创建登录用户时,已在已有的数据库下创建了与windows用户同名的用户,若要在这个数据库下创建用户,需将这个同名用户删去,再执行创建。