SQL概述
SQL的组成
操作对象
表和视图是SQL的操作对象
操作分类
- 数据库定义语言
- 数据操纵语言
- 数据控制语言
这一部分包括对关系和视图的权限访问的描述,以及对事物的控制语句 - 嵌入式SQl和动态SQL
SQL的特点
综合统一
语言风格统一
高度非过程化
面向集合的操作方式
以同一种语法结构提供两种使用方式
SQL既是自含式语句,又是嵌入式语句
语言简洁,易学易用
SQL功能 | 操作 |
数据查询 | SELECT |
数据定义 | CREATE,DROP,ALTER |
数据操纵 | INSERT,UPDATE,DELECT |
数据控制 | GRANT,REVOKE |
HAVING子句
HAVING是对GROUP BY后的语句得到的分组进行操作
表的定义
定义表
- 数据类型
- 实体完整性
- 参照完整性
reject;cascade;set-null - 属性值约束
修改表
ALTER TABLE <表名>
ADD <新列名> <数据类型>[完整性约束]
DROP <完整性约束名>
MODIFY <列名> <数据类型>
SQL没有提供删除属性操作
查询语句
例
查询至少选修了学号为2000014的学生所选修的全部课程的学生姓名及所在系
分析:由于SQL运算不提供运算符,因此需要逻辑变换为如果
SELECT Sname,Sdept
FROM Student x
WHERE NOT EXISTS((SELECT Cno
FROM SC
WHERE Sno='2000014')
EXCEPT
(SELECT Cno
FROM SC
WHERE Sno=x.Sno))
AND x.Sno !='2000014'
也可以用以下语句实现
SELECT Sname,Sdept
FROM Student x
WHERE NOT EXISTS(SELECT Cno
FROM SC
WHERE Sno='2000014' AND NOT EXISTS
(SELECT Cno
FROM SC
WHERE Sno=x.sno AND Cno=y.Cno))
索引的定义
索引不是关系模型中的概念,它属于物理实现的范畴
索引一般由DBA建立
索引的概念
根据索引列上的值是否唯一,索引分为:
- 唯一索引
- 非唯一索引
根据索引的结构,分为两大类索引:
- 聚簇索引(Clustered Index)
要求表中的元组的存放次序和索引中索引项的存放次序完全相同,因此元组也是有序的 - 非聚簇索引(NOnclustered Index)
建立索引
CREATE [UNIQUE][CLUSTERED][NONCLUSTERED] INDEX <索引名>
ON <表名>(<列名>[次序],<列名>[次序]...)
删除索引
DROP INDEX <表民.索引名>
视图
视图是一个虚表,在数据库中只存储视图的定义,而不存储视图的数据。(视图也可以建立在视图上)
视图的作用
- 简化用户的操作
- 减少冗余数据
- 对重构数据库提供了一定程度的逻辑独立性(用户和用户程序不受影响)
- 对机密数据提供安全保护
建立视图
CREATE VIEW <视图名>[列名]
AS <子查询>
[WITH CHECK OPTION]
WITH CHECK OPTION 表示对视图进行UPDATE和INSERT操作时要保证更新后的元组和新插入的元组满足视图定义语句子查询的WHERE子句中的条件表达式
删除视图
DROP VIEW <视图名>
更新视图
视图消解
- 取出子查询
- 替换FROM语句
- 映射SELECT语句
- 合并WHERE语句
行列子集视图
若一个视图是从单个表中导出,并且只是去掉了表中的某些行列,但是保留了主关键字
多数DBMS保证行列子集视图是可以更新的
存取控制
授权
GRANT <权限>...
ON <表名或视图名>
TO <用户>...
[WITH GRANT OPTION]
WITH GRANT OPTION使得获得权限的用户可以把权限再授予给其他用户
收回权限
REVOKE <权限>...
ON <表名或视图名>
FROM <用户>...
联级回收
角色
角色是一个DBMS的用户的集合,该集合中的用户要操作相同的数据库对象,需要拥有相同的权限
CREATE ROLE <角色名> --创建角色
GRANT <角色名> TO <用户名> --将角色分配给用户
空值的处理
不能取空值的限制
- 构成主码的列
- UNIQUE限制
- NOT NULL
空值的运算
- 空值和另一个值的算术运算结果为空
- 空值和另一个值比较运算的结果为UNKNOWN
- 聚集函数只有COUNT会对空值进行运算