原则上没有不要的东西, 否则不完备
横贯很多章节
特征, 性质
数据定义SDD语法, 含义, 利用当前语法定义表
数据查询: 单表, 连接(嵌套可以通过连接完成, 不做要求, 不推荐但是可以写, 不会全扣光)
集合, 创建视图, 更新, 修改, 删除(重点)
空值: 有所了解, 不会特意考察, 但是空值不能乱来
概念
结构化查询语言,是关系数据库的标准语言
特征
- 综合统一
- 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
- 可以独立完成数据库生命周期中的全部活动
- 数据库投入运行后可根据需要随时逐步修改模式, 不影响数据库运行
- 数据操作符统一
- 高度非过程化
- 只需要提出做什么, 存储路径选择和SQL操作过程由系统自动完成
- 面向集合的操作方式
- 操作对象, 查找结果都是元组的集合
- 以同一种语法结构提供两种使用方法
- 是独立语言, 能独立用于联机交互
- 也是嵌入式语言, 能嵌入到高级语言程序中使用
- 简洁易用
- 9个核心动词:
- 数据定义: CREATE, DROP, ALTER
- 数据查询: SELECT
- 数据操作: INSERT, UPDATE, DELETE
- 数据控制: GRANT, REVOKE
与数据库模式的关系

- SQL基本表: 本身独立存在的表, 一个基本表对应一个关系, 对应数据库的模式
- SQL存储文件: 存储文件的逻辑结构构成数据库的内模式, 物理结构对用户屏蔽. 一个存储文件可以对应多个基本表(例如多个基本表有相同属性列则可以统一存储)
- SQL视图: 从一个或几个基本表中导出的虚表, 数据库中只存放视图的定义而不存放视图的数据, 对应数据库的外模式
SQL数据定义语言(DDL)
一个DBMS中可以建立多个数据库, 一个数据库中可以建立多个模式, 一个模式下通常包括多个表, 视图和索引等数据库对象.
SQL的数据定义功能(定义结构和类型): 模式定义, 表定义, 视图和索引定义

- 定义模式: 实际上定义了一个命名空间, 空间内可以定义该模式下的数据库对象(基本表, 视图, 索引等)
- 删除模式: 限制(类比
rmdir
)或级联(类比rm -rf
)
- 定义基本表:
- 修改基本表:
- 删除基本表:
- 建立索引:
- 修改索引:
- 删除索引:
单表查询
查 询 条 件 | 谓 词 |
比较 | = , > , < , >= , <= , != , <> , !> , !<
或NOT +上述比较运算符 |
确定范围 | BETWEEN ... AND ... , NOT BETWEEN ... AND ... |
确定集合 | IN , NOT IN |
字符匹配 | LIKE , NOT LIKE
通配符: % (任意长度字符串), _ (任意单个字符) |
空值 | IS NULL , IS NOT NULL
不能用= 代替IS ! |
多重条件(逻辑运算) | AND , OR , NOT |
聚集函数 | 功能 |
COUNT() | 统计元组个数 / 列中值的个数 |
SUM() | 计算一列值总和(类型必须为数值) |
AVG() | 计算一列平均值 |
MAX() | 计算一列中的最大值 |
MIN() | 计算一列中的最小值 |
多表查询(连接)
连接查询: 同时涉及两个以上的表的查询
连接条件: 用于连接两个表的条件(筛选笛卡尔积的结果)
连接字段: 连接条件中涉及的列名称. 连接条件中各连接字段类型必须可比, 名字不用相同.
当使用自连接时, 需要给两个自己取不同的别名来区分列的来源.
在WHERE子句中加上更多复合条件, 就可以在连接的同时进行选择.
普通连接只输出满足连接条件的元组, 而外连接会将主体表中不满足连接条件的元素一并输出. 左连接中左表为主体表, 其中元组会在结果中全部列出, 右外连接同理.
左连接示例:
Student.Sno | Sname | Ssex | Sage | Sdept | Cno | Grade |
201215121 | 李勇 | 男 | 20 | CS | 1 | 92 |
201215121 | 李勇 | 男 | 20 | CS | 2 | 85 |
201215121 | 李勇 | 男 | 20 | CS | 3 | 88 |
201215122 | 刘晨 | 女 | 19 | CS | 2 | 90 |
201215122 | 刘晨 | 女 | 19 | CS | 3 | 80 |
201215123 | 王敏 | 女 | 18 | MA | NULL | NULL |
201215125 | 张立 | 男 | 19 | IS | NULL | NULL |
也可以有不止两个表互相连接, 一般使用统一的左连接/右连接以免混乱(总是保留左边/右边表中的行).
集合查询
集合操作: 对多个查询结果取并(
UNION
), 交(INTERSECT
), 差(EXCEPT
). 参加集合操作的各查询结果的列数必须相同, 对应项的数据类型也必须相同(即属性列的个数和域相同)
- 并操作
SQL数据操纵语言(DML)
- 插入(
INSERT-INTO
)
- 修改(
UPDATE-SET
)
- 删除(
DELETE-FROM
)
空值
“不存在/不知道/无意义”
可能出现的情况:
- 属性应该有一个值, 但是现在还不知道
- 属性不应该有值
- 出于某种原因暂时不便于填写(如共轭父子)
产生空值:
判断空值:
IS NULL
/ IS NOT NULL
限制: 有
NOT NULL
/ UNIQUE
/ PRIMARY KEY
限制的属性不能取空值空值和其他所有值的算数/比较运算结果均为空值.
空值将传统的二值逻辑(
TRUE
, FALSE
)扩展成了三值逻辑(TRUE
, FALSE
, UNKNOWN
). 逻辑运算中除短路求值外结果均为UNKNOWN
. UNKNOWN
在WHERE
和HAVING
子句的判断条件中不会被判定为真. 视图
“滤镜”
特点
- 虚表, 从一个或几个基本表或视图导出
- 只存放定义, 不存放数据
- 与数据同步变化
操作
- 创建
若一个视图由单个基本表导出, 并只是去掉了基本表中的某些行或列但保留了码, 则称这类视图为行列子集视图.
可以在子查询中使用连接, 以建立基于多个基本表的视图.
视图可以当做基本表成分进行查询, 所以也可以基于视图创建新的视图.
也可以在子查询中使用分组来建立视图
修改基表的结构后, 基表与视图的映射关系就会被破坏, 导致视图不能正常工作
- 删除
- 查询
用户视角: 查询视图与查询基本表别无二致
系统视角: 视图消解法, 先进行有效性检查, 再转换为等价的对基本表的查询并执行.
当视图定义的子查询中含有分组时使用视图消解法可能会产生错误(将聚集函数放在WHERE子句中)
- 更新
与基本表一致, 会使用视图消解法转换为对基本表的操作
行列子集视图一定可以更新, 但是有一些视图是不可更新的, 因为对它们的更新不能唯一有意义地转换为对相应基本表的更新(如尝试更新聚集函数的计算结果则会失败).
基于一个不允许更新的视图定义的视图同样不允许更新.
意义
当视图中的数据不是直接来自基本表时, 定义视图能够简化用户的操作(多张表连接, 复杂嵌套查询, 导出属性)
视图就是挥发性的查询结果的持久性保存!
视图机制能使不同用户用他们需要的不同方式看待同一数据, 能够适应数据库共享的需要.
视图还为重构数据库提供了一定程度的逻辑独立性(如把一张基本表拆成两个表, 可以把它们连接成一个视图来保持外模式不变)
视图机制能对机密数据提供安全保护(对不同用户定义不同视图, 使每个用户只能看到他有权看到的数据)
适当利用视图可以进行查询的阶段性封装, 可以更清晰地表达查询