# 关系数据库语言 SQL
Structured Query Language (SQL) 是用于管理和操作关系数据库的标准语言,包含数据定义语言 (DDL) 和数据操作语言 (DML) 两个主要部分。以下内容涵盖了 SQL 的基本查询语法及其在数据管理中的具体应用。
## SQL 简单查询
SQL 的查询语法如下:
需要注意的是:
- SQL 对大小写不敏感,但数据库本身可能对大小写敏感。
- SQL 查询的结果是一个关系。
### SQL 中的投影
- `SELECT 属性` 用于实现投影。
- `AS` 关键字用于给属性起别名。
- 属性可以是表达式,常量也可以作为表达式列出。
### SQL 中的选择
- 条件表达式包括比较、算术运算、字符串连接 (`||`) 和逻辑运算。
- `WHERE` 子句用于实现选择。
- 使用 `between` 关键字可以指定范围。
例如,`SELECT L FROM R WHERE C` 等价于 $\pi_L(\sigma_C(R))$。
### 字符串模式匹配
- `s LIKE p` 和 `s NOT LIKE p` 用于字符串模式匹配,其中:
- `%` 代表零个或多个字符。
- `_` 代表一个字符。
- `''` 用于转义。
### NULL 处理
- NULL 与任何值的运算结果都是 NULL,与任何值的比较结果都是 UNKNOWN。
- 判断 NULL 使用 `x IS NULL` 或 `x IS NOT NULL`。
### 输出排序
- `ORDER BY 属性 [DESC]` 用于排序,默认升序,`DESC` 表示降序,`ASC` 表示升序。
## 多关系查询
SQL 中的投影和连接:
- `FROM` 两个表,`WHERE` 子句中比较两个表的属性。
- 使用 `关系名.属性名` 来消除歧义。
- 元组变量用于表示不同的元组。
### 并、交、差运算
- 并:`UNION`
- 交:`INTERSECT`
- 差:`EXCEPT`
## 子查询
子查询是嵌套在另一个查询中的查询,可以返回单个常量或关系。
例如:
子查询的其他用法:
- `EXISTS R`:R 不为空时为真。
- `s IN R`:s 等于 R 中的一个值。
- `s > ALL R`:s 大于 R 中的每一个值。
- `s < ANY R`:s 小于 R 中至少一个值。
### 相关子查询
相关子查询会多次执行,例如:
## SQL 连接表达式
- 内连接:`表1 JOIN 表2 ON 属性1 = 属性1' AND 属性2 = 属性2'`
- 外连接:
- 左外连接:`LEFT OUTER JOIN`
- 右外连接:`RIGHT OUTER JOIN`
- 全外连接:`FULL OUTER JOIN`
- 自然连接:`NATURAL JOIN`
## 全关系操作
### 消除重复
- `SELECT DISTINCT 属性` 用于消除重复元组。
### 分组与聚集
- `GROUP BY 属性` 用于按属性分组。
- 常用聚集运算符:`AVG`, `SUM`, `MIN`, `MAX`, `COUNT`。
### HAVING 子句
- `HAVING` 子句用于基于分组聚集的条件选择分组。
## 数据库更新
### 插入
### 删除
### 更新
## SQL 中的事务
### 事务的基本操作
- 开始事务:`START TRANSACTION`
- 结束事务:
- 成功:`COMMIT`
- 失败:`ROLLBACK`
例如:
### 事务的隔离级别
- 可串行化(默认):`SET TRANSACTION ISOLATION LEVEL SERIALIZABLE`
- 读未提交:`SET TRANSACTION READ WRITE ISOLATION LEVEL READ UNCOMMITTED`
- 读已提交:`SET TRANSACTION ISOLATION LEVEL READ COMMITTED`
- 可重复读:`SET TRANSACTION ISOLATION LEVEL REPEATABLE READ`
### 读脏数据
读脏数据是指读取未提交事务写入的数据。虽然这样可以提高并发性,但有风险,例如事务可能会被回滚导致数据失效。
总结,SQL 是一种功能强大且灵活的数据库管理语言,适用于各种复杂的数据操作和查询需求。通过掌握 SQL 的各种语法和操作,可以高效地进行数据库管理和数据分析。