type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态
1.基本数据结构
表 — 结构化的文件,存储特定类型的数据。如:清单、目录等。
- 每个表中数据的类型都相同。
- 每个表都有独属于自己的唯一名字来表示自身。
- 表的一些特性定义了数据再表中的存储方式,包含怎样的数据,数据如何分解等信息。
列
表中的一个字段,所有表都是由一个或多个竖向的列组成的。
每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。
行
表中的一个记录
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。
主键
一列(或一组列),其值能够唯一标识表中每一行。
表中的每一(几)行/列都可以唯一标识自己。而唯一标识表中每行的这个列称为 主键 。用它来表示一个特定的行。没有主键,更新或者删除表中特定行极为困难。
列可充当主键的条件:
任意两行都不具有相同的主键值;
每一行都必须具有一个主键值(主键列不允许 NULL 值);
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
2.数据检索 - SELECT
必须指明选择的对象以及从何处选择。
基本检索
检索所有列
一般而言,尽量不使用 * 通配符。因为检索不需要的列会降低检索和应用程序的性能。
检索不同值 — 使用DISTINCT关键字。
尽管在id所标识的列中会有多个相同值的行,现在只会输出不同id的行。
限制结果
当我们想只返回某一数量的行时,SQL并不支'0’。
MySQL
在SQL server 和 ACCESS 中:
DB2
Oracle
3.排序检索数据 - ORDER BY
排序
子句SQL语句由子句构成,有些子句可选有些必须。一个子句通常由一个关键字加上所提供的数据组成。如上面提到的FROM就是 SELECT 的子句。
在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一
条子句。如果它不是最后的子句,将会出现错误消息。
按多个列排序
简单指定列名,在ORDER BY 后的两个列名用逗号分开即可。
按列位置排序
ORDER BY 还支持按相对列位置进行排序。
若我们希望先按照SELECT清单中的第二个列排序然后按照第三个列排序:
指定排序方向
降序: DESC
升序: ASC
4. 过滤 - WHERE
通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指
定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
数据根据 WHERE 子句中指定的搜索条件进行过滤。
在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于
WHERE 之后,否则将会产生错误
WHERE 子句操作符
表 4-1 WHERE 子句操作符
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
BETWEEN | 在指定的两个值之间 |
IS NULL | 为 NULL 值 |
!=和<>通常可以互换。但是,并非所有 DBMS 都支持这两种不等于操
作符。
不匹配检查 - != 和 <>
单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。
用来与数值列进行比较的值不用引号。
范围值检查 - BETWEEN
它需要两个值,即范围的开始值和结束值。
空值检查 - IS NULL
NULL
无值(no value),它与字段包含 0、空字符串或仅仅包含空格不同。
组合 WHERE 子句
AND 操作符 — 给 WHERE 子句附加条件
OR 操作符 - 检索匹配任一条件的行
第一个条件得到满足的情况下,就不再计算第二个条件
求值顺序
SQL在处理 OR 操作符前,优先处理 AND 操作符
IN 操作符号 - 指定条件范围
范围中的每个条件都可以进行匹配。
其实IN 和 OR 具有相同的功能,但是IN的最大优点在于可以包含其他SELECT语句,能动态地建立WHERE子句。
NOT 操作符 - 否定其后所跟的任何条件。
5 用通配符进行过滤
1、通配符(wildcard)
用来匹配值的一部分的特殊字符。为在搜索子句中使用通配符,必须使用 LIKE 操作符。但是通配符只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
2、搜索模式(search pattern)
由字面值、通配符或两者构成的搜索条件。
谓词 - 当操作符作为谓词时就不再充当操作符
通配符 %(in DBMS) * (in MA)
%表示任何字符出现任意次数。
% 不能与NULL匹配
通配符 下划线(_) 单个_只匹配单个字符
- DB2 不支持 _
- Access 中为 ?
通配符 ([])- 必须匹配指定位置(通配符的位置)的一个字符
如果使用的是 Microsoft Access,需要用!而不是^来否定一个集合。
6.计算字段
运行时在SELECT 语句内创建的。
拼接字段
- 存储在vend_name列中的名字;
- 包含一个空格和一个左圆括号的字符串;
- 存储在vend_country列中的国家;
- 包括一个右圆括号的字符串。
Mysql 或者 MariaDB 中实现相同方法:
RTRIM():去掉字符串右边的空格
LTRIM()(去掉字符串左边的空格)
TRIM()(去掉字符串左右两边的空格)
别名
SELECT 语句可以很好地拼接地址字段,但是拼接好的字段没有名字,只是一个值。
别名(alias)是一个字段或值的替换名。用 AS 关键字赋予。
别名的名字既可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。
算数运算
7.函数
不同的DBMS所支持的函数往往不尽相同。所以在使用函数后尽量做好注释^^
使用函数
- 文本处理
- 算术操作
- 处理日期和时间值并提取特定数据
- 返回DBMS正在使用的特殊信息
文本处理函数
- upper():将文本转换为大写
- SOUNDEX() :是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。
表7-1 常用的文本处理函数
函数 | 说明 |
LEFT()(或使用子字符串函数) | 返回字符串左边的字符 |
RIGHT()(或使用子字符串函数) | 返回字符串右边的字符 |
LENGTH()(也使用 DATALENGTH() 或 LEN()) | 返回字符串的长度 |
LOWER()(Access 使用 LCASE()) | 将字符串转换为小写 |
UPPER()(Access 使用 UCASE()) | 将字符串转换为大写 |
LTRIM() | 去掉字符串左边的空格 |
RTRIM() | 去掉字符串右边的空格 |
SOUNDEX() | 返回字符串的 SOUNDEX 值 |
UPPER()(Access使用UCASE()) | 将字符串转换为大写 |
时间和日期处理函数
数值处理函数
表7-2 常用数值处理函数
函数 | 说明 |
ABS() | 返回一个数的绝对值 |
COS() | 返回一个角度的余弦 |
EXP() | 返回一个数的指数值 |
PI() | 返回圆周率 |
SIN() | 返回一个角度的正弦 |
SQRT() | 返回一个数的平方根 |
TAN() | 返回一个角度的正切 |
8.汇总
聚集函数
对某些行运行的函数,计算并返回一个值。
表8-1 SQL聚集函数
函数 | 说明 | 例子 | 用法 |
AVG() | 返回某列的平均值 | AVG(prod_price) AS avg_price | 返回 Products 表中所有产品的平均价格 |
COUNT() | 返回某列的行数 | COUNT(*) AS num_cust | 返回 Customers 表中顾客的总数 |
MAX() | 返回某列的最大值 | MAX(prod_price) AS max_price | 返回 Products 表中最贵物品的价格 |
MIN() | 返回某列的最小值 | MIN(prod_price) AS min_price | 返回 Products 表中最便宜物品的价格 |
SUM() | 返回某列值之和 | SUM(quantity) AS items_ordered | 返回订单中所有物品数量之和 |
聚集不同值
- 对所有行执行运算,指定ALL参数或者不指定参数
- 只包含不同的值,指定DISTINCT参数
在使用了 DISTINCT 后,此例子中的 avg_price 比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。
DISTINCT 不能用于 COUNT(*)
组合聚集函数
9.分组数据
创建分组 - SELECT 语句的 GROUP BY 子句
- GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
- 如果在 GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。
- GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在 GROUP BY子句中指定相同的表达式。不能使用别名。
- 大多数 SQL 实现不允许 GROUP BY 列带有长度可变的数据类型(如文本或备注型字段)。
- 除聚集计算语句外,SELECT 语句中的每一列都必须在 GROUP BY 子句 中给出。
- 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。 如果列中有多行 NULL 值,它们将分为一组。
- GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前
过滤分组 - HAVING 子句
HAVING 非常类似于 WHERE。事实上,目前为止所学过的所有类型的 WHERE 子句都可以用 HAVING 来替代。唯一的差别是,WHERE过滤行,而 HAVING 过滤分组。
WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。
使用 HAVING 时应该结合 GROUP BY 子句,而 WHERE 子句用于标准的行级过滤。
分组和排序
表9-1 ORDER BY 与 GROUP BY
特性 | ORDER BY | GROUP BY |
作用 | 对产生的输出排序 | 对行分组,但输出可能不是分组的顺序 |
可使用的列 | 任意列都可以使用(甚至非选择的列也可以使用) | 只可能使用选择列或表达式列,而且必须使用每个选择列/表达式 |
是否必须 | 不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
不要忘记 ORDER BY
一般在使用 GROUP BY 子句时,应该也给出 ORDER BY 子句。这是保证数据正确排序的唯一方法。千万不要仅依赖 GROUP BY 排序数据。
SELECT 子句顺序
表9-2 SELECT子句及其顺序
子句 | 说明 | 是否必须使用 |
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
10.子查询
子查询进行过滤
若现在我们希望:
- 检索包含物品 RGAN01 的所有订单的编号。
- 检索具有前一步骤列出的订单编号的所有顾客的 ID。
- 检索前一步骤返回的所有顾客 ID 的顾客信息。
子查询作为计算字段
如需要显示 Customers 表中每个顾客的订单总数。订单与相应的顾客 ID 存储在 Orders 表中:
- 从 Customers 表中检索顾客列表;
- 对于检索出的每个顾客,统计其在 Orders 表中的订单数目。
11.联结表
联结
关系表 - 把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联
关系数据可以有效地存储,方便地处理。因此,关系数据库的可伸缩性(能够适应不断增加的工作量而不失败。)远比非关系数据库要好。
主键(PRIMIRY):用于唯一标识每一行记录的一列或若干列的集合。每个表只能有一个主键,主键列的值必须是唯一且不能为 NULL。
建立联结 - 指定要联结的所有表以及关联它们的方式即可
在引用的列可能出现歧义时,必须使用完全限定列名(用一个句点分隔表名和列名)。如果引用一个没有用表名限制的具有歧义的列名,大多数 DBMS 会返回错误。
如上例中,要匹配的两列指定为 Vendors.vend_id 和 Products.vend_id。这里需要这种完全限定列名,如果只给出 vend_id,DBMS 就不知道指的是哪一个(每个表中有一个)。从前面的输出可以看到,一条 SELECT 语句返回了两个不同表中的数据。
WHERE 子句
在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE 子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。
没有 WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。
要保证所有联结都有 WHERE 子句,否则 DBMS 将返回比想要的数据多
得多的数据。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
有时,返回笛卡儿积的联结,也称叉联结(cross join)。
内联结 - 等值联结(equijoin),基于两个表之间的相等测试。
联结多个表
下面是用 子查询 和 联结 方式返回订购产品RGAN01 的顾客列表:
12.高级联结
表别名
在 oracle 中应该是 Customers C,而不是 Customers AS C
不同类型的联结
自联结
此查询中需要的两个表实际上是相同的表,因此 Customers 表在 FROM子句中出现了两次。
自然联结
自然联结要求用户只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。
外联结
联结包含了那些在相关表中没有关联行的行。
在使用 OUTER JOIN 语法时,必须使用 RIGHT 或 LEFT 关键字指定包括其所有行的表
(RIGHT 指出的是 OUTER JOIN 右边的表,而 LEFT 指出的是 OUTER JOIN
左边的表)。
还存在另一种外联结,就是全外联结(full outer join),它检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表的不关联的行不同,全外联结包含两个表的不关联的行。
使用带聚集函数的联结
使用联结和联结条件:
- 在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前分别测试每个联结。
- 应该总是提供联结条件,否则会得出笛卡儿积
13.组合查询
允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结果集返回。
- 在一个查询中从不同的表返回数据结构。
- 对一个表执行多个查询,按一个查询返回数据。
组合查询和多个 WHERE 条件
任何具有多个WHERE 子句的 SELECT 语句都可以作为一个组合查询
创建组合查询 - union
使用 union
给出每条 SELECT 语句,在各条语句之间放上关键字 UNION。
使用规则
- UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔。
- UNION 中的每个查询必须包含相同的列、表达式或聚集函数。
- 列数据类型必须兼容:类型不必完全相同,但必须是 DBMS 可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。
包含或者取消重复行
使用 union 时,重复的行会被自动取消。
uonion all: 让 DBSM 不再自动取消重复的行。
UNION 几乎总是完成与多个 WHERE 条件相同的工作。UNION ALL 为 UNION 的一种形式,它完成 WHERE 子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),就必须使用 UNION ALL,而不是 WHERE。
排序
在用 UNION 组合查询时,只能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后,并且不允许使用多条 ORDER BY 子句。
14.插入数据 - INSERT
插入完整的行
存储到表中每一列的数据在 VALUES 子句中给出,必须给每一列提供一个值。如果某列没有值,则使用NULL值。各列必须以它们在表定义中出现的次序填充。
虽然这种语法很简单,但并不安全。
高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。
插入行的一部分
插入某些查询的结果 - INSERT SELECT
DBMS 不关心 SELECT返回的列名。它使用的是列的位置,因此 SELECT 中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。
INSERT SELECT 中 SELECT 语句可以包含 WHERE 子句,以过滤插入的数据。
INSERT 通常只插入一行。要插入多行,必须执行多个 INSERT 语句。
复制表 - SELECT INTO
在使用 SELECT INTO 时:
1. 任何 SELECT 选项和子句都可以使用,包括 WHERE 和 GROUP BY;
- 可利用联结从多个表插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
15.更新与删除
更新 - UPDATE
两种使用方式:
- 更新表中的特定行;
- 更新表中的所有行。
UPDATE 语句组成部分:
- 要更新的表;
- 列名和它们的新值;
- 确定要更新哪些行的过滤条件。
删除数据 - DELETE
两种方式:
- 从表中删除特定的行
- 从表中删除所有行
DELETE 不需要列名或通配符。DELETE 删除整行而不是删除列。要删除指定的列,请使用 UPDATE 语句。
更新和删除的指导原则
- 除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。(如果执行 UPDATE/DELETE 而不带 WHERE 子句,则表中每一行都将用新值更新。)
- 保证每个表都有主键。
- 在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
- 使用强制实施引用完整性的数据库,这样 DBMS 将不允许删除其数据与其他表相关联的行。
- 有的 DBMS 允许数据库管理员施加约束,防止执行不带 WHERE 子句的 UPDATE 或 DELETE 语句。
16.创建与操纵表
创建表 - CRFEATE -TABLE
NULL 值
NULL 值就是没有值或缺值。
允许 NULL 值的列也允许在插入行时不给出该列的值。不允许 NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。s
指定默认值
SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。默认值在 CREATE TABLE 语句的列定义中用关键字 DEFAULT 指定。
更新表 - ALTER TABLE
- 所有的 DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及 NULL 和 DEFAULT 的使用)有所限制。
- 许多 DBMS 不允许删除或更改表中的列。
- 多数 DBMS 允许重新命名表中的列。
- 许多 DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几 乎没有限制。
- 在 ALTER TABLE 之后给出要更改的表名。
- 列出要做哪些更改。
删除表 — DROP TABLE
重命名表 - 不同DBMS标准不同
17.视图
视图的常见应用:
- 重用 SQL 语句。
- 简化复杂的 SQL 操作。
- 使用表的一部分而不是整个表。
- 保护数据。
- 更改数据格式和表示。
视图的规则和限制:
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
- 对于可以创建的视图数目没有限制。
- 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
- 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。(所允许的嵌套层数在不同的 DBMS 中有所不同)
- 许多 DBMS 禁止在视图查询中使用 ORDER BY 子句。
- 有些 DBMS 要求对返回的所有列进行命名,如果列是计算字段,则需 要使用别名。
- 视图不能索引,也不能有关联的触发器或默认值。
- 有些 DBMS 把视图作为只读的查询,这表示可以从视图检索数据,但 不能将数据写回底层表。
- 有些 DBMS 允许创建这样的视图,它不能进行导致行不再属于视图的 插入或更新。
创建视图 - CREATE VIEW
利用视图简化复杂的联结
用视图重新格式化检索出的数据
上述语句中的 “+” 也可写作“||”
用视图过滤不想要的数据
视图与计算字段
18.存储过程
单独编写每条 SQL 语句,并根据结果有条件地执行其他语句。
简单来说,存储过程就是为以后使用而保存的一条或多条 SQL 语句。可将其视为批文件,虽然它们的作用不仅限于批处理
存储过程的优势:
- 通过把处理封装在一个易用的单元中,可以简化复杂的操作
- 由于不要求反复建立一系列处理步骤,因而保证了数据的一致性。
- 简化对变动的管理。
- 因为存储过程通常以编译过的形式存储,所以 DBMS 处理命令所需的工作量少,提高了性能。
- 存在一些只能用在单个请求中的 SQL 元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。
存储过程的缺陷:
- 不同 DBMS 中的存储过程语法有所不同。
- 一般来说,编写存储过程比编写基本 SQL 语句复杂
执行存储过程 - EXECUTE
存储过程所完成的工作:
- 验证传递的数据,保证所有 4 个参数都有值;
- 生成用作主键的唯一 ID;
- 将新产品插入 Products 表,在合适的列中存储生成的主键和传递的数据。
创建存储过程
19.管理事务处理
使用事务处理(transaction processing),通过确保成批的 SQL 操作要么完全执行,要么完全不执行,来维护数据库的完整性。
一些相关术语:
- 事务(transaction)指一组 SQL 语句。
- 回退(rollback)指撤销指定 SQL 语句的过程;
- 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
- 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退(与回退整个事务处理不同)。
控制事务处理
管理事务的关键在于将 SQL 语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。
有的 DBMS 要求明确标识事务处理块的开始和结束,
使用ROLLBACK
使用COMMIT
一般的 SQL 语句都是针对数据库表直接执行和编写的。这就是所谓的隐式提交(implicit commit),即提交(写或保存)操作是自动进行的。但是在事务处理块中,提交不会隐式进行。
使用保留点
要支持回退部分事务,必须在事务处理块中的合适位置放置占位符。这样,如果需要回退,可以回退到某个占位符。在 SQL 中,这些占位符称为保留点。
每个保留点都要取能够标识它的唯一名字,以便在回退时,DBMS 知道回退到何处。
20.游标
简单地使用 SELECT 语句,没有办法得到第一行、下一行或前 10 行。
需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。
游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
常见的一些选项和特性:
- 能够标记游标为只读,使数据能读取,但不能更新和删除。
- 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)
- 能标记某些列为可编辑的,某些列为不可编辑的。
- 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
- 指示 DBMS 对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。
使用游标
步骤:
1. 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT 语句和游标选项。
- 一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT语句把数据实际检索出来。
- 对于填有数据的游标,根据需要取出(检索)各行。
- 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的 DBMS)。
创建游标 - DECLARE
DECLARE 命名游标,并定义相应的 SELECT 语句,根据需要带 WHERE 和其他子句。
使用游标 - OPEN CURSOR
关闭游标
21.高级SQL特性
约束
主键
主键是一种特殊的约束,用来保证一列(或一组列)中的值是唯一的,而且永不改动。
表中的一列(或多个列)的值唯一标识表中的每一行。这方便了直接或交互地处理表中
的行。
没有主键,要安全地 UPDATE 或 DELETE 特定行而不影响其他行会非常困难。
使用主键的条件:
- 任意两行的主键值都不相同。
- 包含主键值的列从不修改或更新。
- 每行都具有一个主键值
- 主键值不能重用。如果从表中删除某一行,其主键值不分配给新行。
外键
外键是表中的一列,其值必须列在另一表的主键中。外键是保证引用完整性的极其重要部分。
例:Orders 表将录入到系统的每个订单作为一行包含其中。顾客信息存储在
Customers 表中。Orders 表中的订单通过顾客 ID 与 Customers 表中的特定行相关联。顾客 ID 为 Customers 表的主键,每个顾客都有唯一的ID。订单号为 Orders 表的主键,每个订单都有唯一的订单号。
Orders 表中顾客 ID 列的值不一定是唯一的。如果某个顾客有多个订单,则有多个行具有相同的顾客 ID(虽然每个订单都有不同的订单号)。同时,Orders 表中顾客 ID 列的合法值为 Customers 表中顾客的 ID。
唯一约束
唯一约束的语法类似于其他约束的语法。唯一约束既可以用 UNIQUE 关键字在表定义中定义,也可以用单独的 CONSTRAINT 定义。
检查约束
用来保证一列(或一组列)中的数据满足一组指定的条件。
常见用途:
- 检查最小或最大值。
- 指定范围。
- 只允许特定值。
索引
索引用来排序数据以加快搜索和排序操作的速度。
在一个或多个列上定义索引,使 DBMS 保存其内容的一个排过序的列表。在定义了索引后,DBMS 以使用书的索引类似的方法使用它。DBMS 搜索排过序的索引,找出匹配的位置,然后检索这些行。
索引必须唯一命名。
触发器
触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。
触发器可以与特定表上的 INSERT、UPDATE 和 DELETE 操作(或组合)相关联。
触发器内代码的数据访问权:
- INSERT 操作中的所有新数据;
- UPDATE 操作中的所有新数据和旧数据;
- DELETE 操作中删除的数据。
常见用途:
- 保证数据一致。
- 基于某个表的变动在其他表上执行活动。
- 进行额外的验证并根据需要回退数据。
- 计算计算列的值或更新时间戳。
22.语法速记
ALTER TABLE - 更新已存在表的结构
COMMIT - 将事务写入数据库
CREATE INDEX - 在一个或多个列上创建索引
CREATE PROCEDURE - 创建存储过程
CREATE TABLE - 创建新数据库表
CREATE VIEW - 创建一个或多个表上的新视图
DELETE - 从表中删除一行或多行
DROP - 永久地删除数据库对象(表、视图、索引等)
INSERT - 为表添加一行
INSERT SELECT - 将 SELECT 的结果插入到一个表
ROLLBACK - 撤销一个事务块
SELECT - 从一个或多个表(视图)中检索数据
UPDATE - 更新表中的一行或多行
- Author:Uonlra
- URL:https://www.uonlra.blog//article/sql
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!










