申明:以下内容是对课本知识和老师课堂内容的总结,若有侵权请与笔者联系,笔者会及时处理。
# 关系数据库标准语言—SQL
## 3.1 SQL语言的基本概要和特点
### SQL的特点
- 综合统一
- 高度非过程化
- 一种语言提供多种使用方式
- 语言简洁 易学易用
- 面向集合的操作方式
** SQL语言动词一览 **
数据定义 CREATE ALTER DROP
数据查询 SELECT
数据操纵 UPDATE DELETE INSERT
数据控制 GRANT REMOKE
创建与使用数据表
定义基本表
修改基本表
删除基本表
|操作对象| 创建 |删除 |修改 |
|表 |Create table |Drop table |ALTER TABLE|
|视图 |Create view |Drop view | \ |
|索引 |Create index |Drop index | \ |
## 定义基本表
CREATE TABLE 表名
(列名 数据类型 约束条件,列名 数据类型 约束条件....);
## 常用完整性约束
主码约束 PRIMARY KEY
唯一性约束 UNIQUE
非空值约束 NOT NULL
参照完整性约束
## PRIMARY KEY 和 UNIQUE 的区别
- 相同点:
都会建立唯一索引来保证所在列值的唯一性
- 不同点:
PRIMARY KEY 约束 该列不可以为空值,仅可设置一个
UNIQUE 则可以 设为控制 且可以设置多个
不可以将 PK 和UN约束同时设置
## 完整性约束
完整性约束规定了每一个关系实例必须满足的条件
不满足的 修改更新删除 插入 等操作会被拒绝
确保应用程序的语义环境 防止数据的不一致
- 完整性约束 1 主码约束 2 外码约束 3 域约束 4 一般性约束
- 格式 constraint <约束名> <约束条件>
- 修改完整性约束 ALTER TABLE 表名 DROP CONSTRAINT约束名字
## 一般性约束
CREATE TABLE MY( rate INTEGER,no INTEGER,
CHECK(rate>100 AND rate <200));
== 使用 CHECK 关键字 然后 用在创建表时 ==
## 断言ASSERTION
多个表上的完整性约束
- CREATE ASSERTION 断言名 ( 条件 );
- DROP ASSERTION 断言名
## 触发器
触发器是一个过程 他对数据库的特定改变进行响应 由DBMS自动调用
包含三要素
- 事件 激活触发器的数据库改变
- 条件 当触发器激活时运行的查询或检测
- 动作 触发器被激活且条件为真时 DBMS执行的过程
### 触发器的作用
- 维护数据的完整性
- 提醒用户不寻常事情的发生
- 产生事件的日志 同时支持审计和安全性检查
- 用于工作流管理 和 保证商业规则
## 修改基本表 ALTER
ALTER TABLE 表名 ADD 完整性约束条件或者列;
DROP 删除完整性约束条件或者列;
MODIFY 用于修改属性名和数据类型;
## 删除基本表
DROP TABLE 表名;
## 创建和使用索引
CREATE UNIQUE/CLUSTER INDEX 索引名字 ON 表名
(列名 次序,列名 次序);
- 表名 指定建立索引的表 列 那就是指定列
- 次序 ASC升序 DESC 降序
- UNIQUE 对应的索引值唯一
- CLUSTER 聚簇索引 就是 物理存储两两相邻 (具体内容度娘)
### 唯一值索引
1 对于已有重复数据的属性列不能够增加UNIQUE索引
2 增加了UNIQUE后相当于给改属性列增加了 UNIQUE约束
每次输入数据都会检查
## 删除索引
DROP INDEX 索引名
## 数据查询
单表查询 连接查询 嵌套查询 集合查询
SELECT ALL/DISTINCT 属性名
FROM 表名
WHERE ()
GROUP BY () HAVING ()
ORDER BY();
- SELECT 指定要查询的属性列
- FROM 指定要查询的表或者视图
- WHERE 指定查询条件
- GROUP BY 对查询的结果按照相同的值进行分组,在组中还
通常会使用 聚集函数
- HAVING 筛选出满足条件的组
- ORDER BY 子句 将查询的结果按照指定列进行排序 ASC 升序 DESC 降序
## 单表查询
### 1选择表中的若干列
-- 查询指定列 查询全部列 查询经过计算的值
- 查询全部列 可以用 * 代替所有属性名
- 可以查询经过计算的值 ppt - ISLOWER
- 使用列别名 改变查询结果的 标题
例 : SELECT SNAME NAME FROM STUDENTS;
直接在属性名后重新命名即可
### 2选择表中的若干元组
1)消除取值重复的 行 用DISTINCT 关键字
ALL 就是 选取所有 但是 DISTINCT 就是选取不同值 ALL一般省略
DISTINCT 的作用范围是 所有目标列 该关键字紧跟SELECT
2)查询满足条件的元组
用WHERE 关键字
|查询条件 | 谓 词 |
| 比较 | > < >= <= = != !> !< not + |
| 确定范围| BETWEEN AND , NOT BETWEEN AND |
| 确定集合| IN , NOT IN |
| 字符匹配| LIKE ,NOT LIKE |
| 空值 | IS NULL, NOT IS NULL |
| 多重条件 | AND,OR |
(1)比较 大小 where + 条件 (用比较谓词)
(2)确定范围
- 可以用 BETWEEN AND 或者 NOT BETWEEN
- AND 或者用比较 谓词和 多重条件结合
-
(3)确定集合 用IN (值表 ) 或者 NOT IN (值表)
值表要用逗号分隔
(4)字符串匹配 LIKE / NOT LIKE <匹配串>
匹配串 用英文 的双引号
-> 匹配模板 : 固定字符串或者含有通配符的字符串
当匹配模板为 固定字符串时 可以用 = 或者 !=来代替 LIKE or NOT LIKE
#### 通配符
- %代表任意长度
- _ 代表单个字符
汉字 要用 俩个 __ 因为汉字是俩个字符构成单个汉字
(5)涉及空值的查询
使用 谓词 IS NULL / IS NOT NULL
IS NULL不能用 = NULL代替
(6)多重条件查询
AND OR 来联接 AND 优先级 大于 OR
多用括号
### 3对查询结果排序
使用 ORDER BY 可按照一个或者多个属性值进行排序
ASC 顺序 DESC 降序
NULL=无穷大 ——> 降序时在前 升序时在后
### 4使用聚集函数
计数 COUNT (ALL/DISTINCT 属性名)
求和 SUM(同上)
求平均 AVG(同上)
MAX() MIN () 同上
### 5 查询结果分组
使用GROUP BY 字句分组
细化 聚集函数的作用对象
(测试)未对查询结果进行分组 聚集函数将作用于整个查询结果
(测试)对查询结果分组后 聚集函数将分别作用于每个组
- GROUP BY 的对象是 查询的中间结果
- GROUP BY可以选取 属性列中的 一列 或者多列 值相等的为一组
- GROUP BY 之后 SELECT 只能够 出现选中的属性列 和 聚集函数
--使用 HAVING 语句 对GROUP BY 语句的最终结果进行筛选
只有满足 HAVING 语句的 组才会被输出
--HAVING 与 WHERE 的区别在于 HAVING 作用于组
WHERE 作用于基本表或者视图
## 连接查询
表名1.属性名 比较运算符 表名2.属性名
比较运算符 > < !>……
也可以用BETWEEN AND ……
### 1)广义笛卡尔积
SELECT STUDENT.*,SC.*
FREOM STUDENT ,SC (很少使用)
### 2)等值与非等值连接查询
等值连接
自然连接
非等值连接
#### 等值连接
等值 其实就是运算符号为 = 的连接
注意 俩表的属性列 域要相同 如果他们的属性名相同那就要带上前缀
如果属性名不相同 那可以省略
#### 自然连接
是等值连接的一种特殊情况 就是在SELECT 的时候人为的把相同属性列留下唯一项(就是只留下一个)
#### 非等值连接
- 就是除等值连接以外的连接
#### 自身连接
就是一个表和自己连接 (一个学科的先修课程)
首先要给 表起 别名好区分
因为所有属性名都是相同的所以在SELECT 的时候要带前缀
### 外连接
用外连接 表名1 LEFT OUTER JOIN 表名2 ON ()
** 外连接 和 普通连接的区别
普通连接 只会 输出满足 连接条件的元组
外连接 会输出指定的列表 为连接主图 不满足连接条件的元组也会输出
** 外连接的特点
- 外连接中 有一行万能的虚行
- 该虚行 能够和所有主连接表中不满足连接条件的元组连接
- 该虚行所有值均为空值
- 所以和主表不满足连接条件的元组链接后 那些主表中没有的属性列都会为控制
- 右外连接 右边的表为主连接表 左边则 左边的表为主连接表
** 格式
LEFT OUTER JOIN ON
LEFT JOIN ON
RIGHT OUTER JOIN ON
RIGHT JOIN ON
### 复合条件连接
WHERE 中 包含多个连接条件
用 AND 或者 OR
### 多表连接
使用多个表连接 但是这种方法我认为应该少用
通过创建视图的方式查询更为高效
## 嵌套查询
- 带有IN 的子查询
- 带有比较运算符 的子查询
- 带有ANY 或者ALL 谓词的子查询
- 带有EXISTS 谓词的子查询
概述
一般 称 一个 SELECT —FROM —WHERE 称为一个查询块
将一个查询块嵌套在另外一个查询块的 WHERE 或者 HAVING 语句中 称为 嵌套查询
约束
子查询不能够 使用 ORDER BY (提高效率)
分类 :不相关子查询 子查询的查询条件不依赖于父查询
相关子查询 子查询的查询条件 依赖于 父查询
### 不相关子查询
由内向外进行处理 先完成子查询 为父查询 提供查询的条件
### 相关子查询
首先取外层查询中标的 第一个 元组 将该元组 数值处理内层查询 若 满足 WHERE 条件 则取该元组 如此循环 直到外查询元组全部检查完为止
### 使用子查询的规则
- 1 子查询必须放在圆括号内
- 2 整个查询块 必须只能够有一个 ORDER BY 且ORDER BY
必须放在最后 子查询最好放在 运算符的右侧 便于阅读
用 TOP-n必须要使用ORDER BY
- 3 子查询可以使用俩种比较条件 单行运算符 和 多行运算符
## 集合查询
标准SQL 直接支持的集合操作类型
UNION 并操作
一般商用数据库支持的集合操作种类
UNION 并操作
INTERSECT 交操作
EXCEPT 差操作
<查询块>
UNION
<查询块>
这俩个查询结果的 属性列数量和值域必须都相同
## 杂碎知识点
### 目标列表达式
-(1) 表名 . *
-(2) 表名. 属性目标列名表达式
属性目标列表达式 可以用 聚集函数 属性列 和任意运算符来组成
### 聚集函数
格式 聚集函数名(DISTINCT/ALL *)
## 3.7 数据操纵
### 插入数据
俩种插入方式 *插入单个元组*
*插入子查询结果*
- 插入单个元组 格式
INSERT
INTO 表名(属性列1……)
VALUES (常量1……)
- INTO 子句
指定要插入数据的表名以及属性列
属性列的顺序可以和表名不同
- 没有指定属性列 :默认传入的元组包含所有数据
且顺序按照定义表时的数据
- 指定属性列: 顺序可以和建表时不同 未指定的列取值为空值
- VALUES 子句
提供的值必须与INTO子句匹配
- 值的个数
- 值的类型
### 插入子查询结果
语句格式
INSERT
INTO 表名 ()
(子查询);
子查询结果必须和INTO子句匹配 值的个数和类型
## 修改数据
* 语句格式
update 表名 set 列名 =表达式
where 条件表达式;
* 修改数据的三种修改方式
* 修改某一个元组的值 用where查询
* 修改多个元组的值 Sage=Sage-1
* 带子查询的修改语句
SET 子句
指定修改方式
要修改的列 + 修改后取值
WHERE 子句
指定要修改的元组
缺省表示要修改所有元组
可以用子查询
## 删除数据
DELETE
FROM 表名
WHERE 条件
WHERE 指定要删除的元组
缺省表示要修改表中的所有元组
- 三种删除方式
- 删除某一个元组的值
- 删除多个元组的值
- 带子查询的删除语句
更新数据与数据一致性
- DBMS在执行插入 删除 更新等操作时要保证数据库一致性
- 必须要有事物概念和原子性
- 必须要进行完整性检查和保证
## 视图
- 定义视图
- 查询视图
- 更新视图
- 视图的作用
### 定义视图
- CREATE VIEW
- 视图名
- 列名属性名
- AS
- 子查询
- [WITH CHECK OPTION];
组成视图的属性列名
全部省略 或者 全部指定
- 省略
- 以SELECT 语句中的属性名作为视图属性名
- 全部指定的情况
- 1 SELECT 后跟 *
- 2 多表查询有同名属性列
- 3 有聚集函数或者运算式
- 4 需启用更适合的更贴切的名字
### 行列子集视图
从基本表中的视图 一般是删去了某些行某些列 但是会保留码
### WITH CHECK OPTION 的作用
就是在对视图进行操作的时候 是仅仅对挑选出来的视图进行操作
在对 视图操作的时候 更新删除等等语句都会自动 添加 创建视图时候的where 条件
### 删除视图
DROP VIEW 视图名
- 该语句从数据字典中删除指定的视图定义
- 由该表导出的其他视图虽然存在但已经无意义 必须显示删除
- 该表删除之前必须把由该表导出的视图显示删除
(ps显示删除就是 DROP VIEW 视图名)
### 查询视图
从用户角度 查询视图和查询表相同
查询视图的两种方法
method 1
** 视图消解法 **
step1 首先进行有效性检查 检查视图或者表是否存在
step2 如果存在 则从数据字典中抽取视图的定义
把视图定义的子查询和用户的查询结合起来 转化成对应等价
的对基本表的查询
执行修正后的查询
method 2
** 实体化视图 **
step1 首先进行有效性检查 检查视图是否存在
step2 如果存在就将视图实体化 执行视图查询语句 将查询
建成一个实体临时表
step3 将对视图的查询 转化为对临时标的查询
查询结束 临时表被释放
### 更新视图
DBMS 实现更新视图的方法 (视图消解法和 实体化视图法)
** 带有 WITH CHECK OPTION 语句
DBMS会对更新语句进行检查 不允许更新视图范围之外的数据
***更新视图是有限制的
有些视图 他不能够更新 因为对他的更新 不能够转化成对唯一具基本表的语句
### 实际系统对视图更新 的限制
- 允许对行列子集视图进行更新
- 对其他不同的更新有不同的限制
### 视图的作用
1可以使查询表达更加清晰
2让用户从多种角度看待同一数据
3为机密数据提供安全性保护
4为重构数据库提供一定的逻辑独立性
5简化用户的操作
本文详细介绍了SQL语言的基本概要、特点及主要操作,包括数据定义、查询、操纵和控制。讨论了SQL的动词如CREATE、SELECT、UPDATE、DELETE,以及完整性约束如主键、唯一性约束、非空值约束。此外,还涵盖了数据表的创建、修改和删除,以及索引的使用。内容还包括视图的创建、更新和删除,以及数据操纵的插入、修改和删除操作。
1639

被折叠的 条评论
为什么被折叠?



