一、数据库语言概述
- 数据定义语言DDL
负责数据结构定义与数据库对象定义的语言,由create、alter、drop三个语法组成。
- 数据操纵语言DML
实现对数据库的基本操作。如,对表中数据的select、insert、delete和update。
1.1 创建表
create table <表名> (<列名><数据类型>[列级完整性约束条件])
列级完整性约束条件有NULL(空)和UNIQUE(取值唯一)。
1.2 修改表
alter table <表名> [add <新列名><数据类型>[完整性约束条件]]
[drop <完整性约束名>]
[modify<列名><数据类型>];
1.3 删除表
drop table <表名>
1.4 创建和删除索引
create [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>]);
说明:
(1)次序:可以选ASC(升序)或DSC(降序),默认为ASC。
(2)UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录。
(3)CLUSTER:表明要建立的索引是聚簇索引,索引项的顺序是与表中记录的物理顺序一致的索引组织。
1.5 删除索引
drop index <索引名>
1.6 视图的创建和删除
creat view 视图名(列表名)
as select 查询字句 [with check option];
创建视图必须遵循如下规定:
(1)子查询可以是任意复杂的select语句,但通常不允许含有order by字句和distinct短语。
(2)with check option表示执行update、insert、delete操作时保证更新、插入、删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
(3)组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由select子查询目标列的主属性组成。
drop view 视图名
二、数据操作
SQL的数据操纵功能
- select(查询)
- insert(插入)
- delete(删除)
- update(修改)
2.1 select语句
select [all | distinct] <目标列表达式>
from <表名或视图名>[,<表名或视图名>]
[where<条件表达式>]
[group by <列名1>[having <条件表达式>]]
[order by <列名2>[asc | desc]]
(1)聚集函数:以一个值的集合为输入,返回单个值的函数。
SQL提供了5个预定义的集函数:平均值AVG、最小值MIN、最大值MAX、求和SUM以及计数COUNT。
2.2 HAVING字句
在group by子句后面加一个having子句,对分组设置过滤条件(可以使用聚集函数)。
注意:当元祖含有空值时,记住以下两点:
- 空值在任何聚集操作中都会被忽视,如求和、求平均值和计数都没有影响。如count(*)是某个关系中所有元祖数目之和,但count(A)却是A属性非空的元祖个数之和。
- NULL值可以看作分组属性中的一个一般的值。例如,在select A,AVG(B) from R中,当A的属性值为空时,就会统计A=NULL的所有元祖中B的均值。
2.3 字符串操作
对于字符串进行的最通常的操作是使用操作符like的模式匹配,使用两个特殊的字符来描述模式:
- “%”匹配任意字符串
- “_”匹配任意一个字符
注意:模式是大小写敏感的。
2.4 集合操作
在关系代数中用集合的并(UNION)、交(INTSECT)、差(EXCEPT)来组合关系。
三、授权
3.1 主键约束primary key
1、完整性约束条件作用的对象有关系、元祖和列。
2、完整性控制具有的功能:定义功能、检测功能和处理功能。
3、实体完整性(使用primary key字句)
3.2 属性值上的约束
属性值上的约束通过下面关键字进行:
- not null :不允许空值
- unique:唯一值
- check:属性值要满足指定条件
3.3 授权与销权
grant <权限> [,<权限>] ... [ON <对象类型><对象名>]
to <用户>[,用户] ... [with grant option]
revoke <权限> [,<权限>] ... [ON <对象类型><对象名>]
from <用户>[,用户] ...
四、触发器
触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
- 触发器经常用于加强数据的完整性约束和业务规则等
- 触发器与存储过程的唯一区别是触发器不能执行execute语句调用,而是在用户执行transact-SQL语句时自动触发执行
4.1 创建触发器
触发器的定义包含两个方面:
- 指明触发器的触发事件
- 指明触发器的执行动作
事件的触发有两个时间:
- Before:事件发生之前触发
- After:事件发生之后触发
create trigger <触发器名>[{before | after}]
{[delete | insetr | updateof[列名清单]]}
on 表名
[referencing <临时视图名>]
[when <触发条件>]
begin
<触发动作>
end [触发器名]