关系数据库标准语言SQL
关系数据库标准语言 SQL
3.1 SQL 概述
3.1.1 SQL 的产生与发展
跳过…
3.1.2 SQL 的特点
SQL 集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能于一体,其主要特点包括以下几部分。
- 综合统一
数据库系统的主要功能是通过数据库支持的数据语言来实现的。
SQL 集数据定义语言、数据操纵语言、数据控制语言的功能与一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括以下一系列操作要求:
- 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库。
- 对数据库中的数据进行查询和更新。
- 数据库重构和维护。
- 数据库安全性、完整性控制,以及事务控制。
- 嵌入式 SQL 和动态 SQL 定义。
- 高度非过程化
只要提出“做什么”,需芝麻指明“怎么做”,因此无须了解存取路径。存取路径的选择以及 SQL 的操作过程由系统自动完成。 - 面向集合的操作方式
SQL 采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。 - 以同一种语法结构提供多种使用方式
SQL 即是独立的语言,又是嵌入式语言。在两种不同的使用方式下,SQL 的语法结构基本上是一致的。 - 语言简洁,易学易用
SQL 功能极强,由于设计巧妙,语言十分简洁,完成核心功能只用了9个动词。SQL 功能 动词 数据查询 SELECT 数据定义 CREATE,DROP,ALTER 数据操纵 INSERT,UPDATE,DELETE 数据控制 GRANT,REMOVE
3.1.3 SQL 的基本概念
支持 SQL 的关系数据库管理系统同样支持关系数据库三级模式结构。其中外模式包括若干视图(view)和部分基本表(base table),模式包括若干基本表,内模式包括若干存储文件(store file)。
用户可以用 SQL 对基本表和视图进行查询或其他操作,基本表和视图一样,都是关系。
基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。
存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构对最终用户是隐蔽的。
视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表相同,用户可以在视图上再定义视图。
3.2 学生-课程数据库
跳过…
3.3 数据定义
SQL 的数据定义功能包括模式定义、表定义、视图和索引的定义
一个关系数据库管理系统的实例(instance)中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。
3.3.1 模式的定义与删除
- 定义模式
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
如果没有指定<模式名>,那么<模式名>隐含为<用户名>。
用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。即
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> | <视图定义子句> | <授权定义子句>];
- 删除模式
DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
其中 CASCADE 和 RESTRICT 两者必选其一。选择了 CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;选择了 RESTRICT(限制),表示如果该模式已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
3.3.2 基本表的定义、删除与修改
- 定义基本表
CREATE TABLE <表名> ( <列名> <数据类型> [列级完整性约束]
[, <列名> <数据结构> [列级完整性约束条件]] …
[, <表级完整性约束条件>];)
- 数据类型
数据类型 | 含义 |
---|---|
CHAR(n) | 长度为 n 的定长字符串 |
VARCHAR(n) | 最大长度为 n 的变成字符串 |
CLOB | 字符串大对象 |
BLOB | 二进制大对象 |
INT | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
BIGINT | 大整数(8字节) |
NUMERIC(p, d) | 定点数,由 p 位数字组成,小数点后面有 d 位数字 |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECISION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为 n 位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期,YYYY-MM-DD |
TIME | 时间,HH:MM:SS |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
- 模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。当定义基本表时一般可以有三种方式定义它所属的模式。
- 在表中明显地给出模式名
- 在创建模式语句中同时创建表
- 设置所属的模式
当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径(search path)来确定该对象所属的模式。
- 修改基本表
ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE | RESTRICT]]
[DROP CONSTRAINT <完整性约束名> [CASCADE | RESTRICT]]
[ALTER COLUMN <列名> <数据类型>];
- 删除基本表
DROP TABLE <表名> [RESTRICT | CASCADE];
3.3.3 索引的建立与删除
数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列(hash)索引、位图索引等。
索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。
- 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名> [<次序>] [, <列名> [<次序>]] …)
其中,<表名>是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可以选 ASC(升序)或 DESC(降序),默认值为 ASC
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表示要建立的索引是聚簇索引。
- 修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
- 删除索引
DROP INDEX <索引名>;
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
3.4 数据查询
数据查询是数据库的核心操作。SQL 提供了 SELECT 语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
SELECT [ALL | DISTINCT] <目标列表达式> [, <目标列表达式>] …
FROM <表名或视图名> [, <表名或视图名> …] | (<SELECT 语句> [AS]
[WHERE <条件表达式>]
[GROUP BY <列名 1> [HAVING <条件表达式>]]
[ORDER BY <列名 2> [ASC | DESC]];
整个 SELECT 语句的含义是,根据 WHERE 子句的条件表达式从 FROM 子句指定的基本表、视图或派生表中找出满足条件的元组,再按照 SELECT 子句中的目标列表达式选出元组中的属性值形成结果表。
如果有 GROUP BY 子句,则将结果按<列名 1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果 GROUP BY 子句带有 HAVING 短语,则只有满足指定条件的组才予以输出。
如果有 ORDER BY 子句,则结果表还要按<列名 2>的值的升序或降序排序。
3.4.1 单表查询
选择表中的若干列
选择表中的全部或部分列即关系代数的投影运算。- 查询指定列
SELECT <列名 1> [, <列名 2> …]
FROM <表 1> [, <表 2> …]
2. 查询全部列
SELECT *
FROM <表 1> [, <表 2> …]
3. 查询经过计算的值
SELECT <目标列表达式> [, <目标列表达式> …]
FROM <表 1> [, <表 2> …]
选择表中的若干元组
消除取值重复的行
SELECT DISINCT <列名 1> [, <列名 2> …]
FROM <表 1> [, <表 2> …]查询满足条件的元组
查询条件 谓词 比较 =, >, <, >=, <=, !=, <>, !>, !<; 确定范围 BETWEEN AND, NOT BETWEEN AND 确定集合 IN, NOT IN 字符匹配 LIKE, NOT LIKE 空值 IS NULL, IS NOT NULL 逻辑运算 AND, OR, NOT - 比较大小
- 确定范围
BETWEEN 后是范围下限,AND 后是范围的上限 - 确定集合
- 字符匹配
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
% 代表任意长度的字符串
_ 代表任意单个字符