Lazy loaded image
📡SQL
Words 12705Read Time 32 min
2026-1-5
2026-2-2
type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态

1.基本数据结构

表 — 结构化的文件,存储特定类型的数据。如:清单、目录等。

  1. 每个表中数据的类型都相同。
  1. 每个表都有独属于自己的唯一名字来表示自身。
  1. 表的一些特性定义了数据再表中的存储方式,包含怎样的数据,数据如何分解等信息。

💡
表中的一个字段,所有表都是由一个或多个竖向的列组成的。
每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。

💡
表中的一个记录
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。

主键

💡
一列(或一组列),其值能够唯一标识表中每一行。
表中的每一(几)行/列都可以唯一标识自己。而唯一标识表中每行的这个列称为 主键 。用它来表示一个特定的行。没有主键,更新或者删除表中特定行极为困难。
列可充当主键的条件:
 任意两行都不具有相同的主键值;  每一行都必须具有一个主键值(主键列不允许 NULL 值);  主键列中的值不允许修改或更新;  主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
 

2.数据检索 - SELECT

必须指明选择的对象以及从何处选择。

基本检索

检索所有列

💡
一般而言,尽量不使用 * 通配符。因为检索不需要的列会降低检索和应用程序的性能。

检索不同值 — 使用DISTINCT关键字。

尽管在id所标识的列中会有多个相同值的行,现在只会输出不同id的行。

限制结果

当我们想只返回某一数量的行时,SQL并不支'0’。
MySQL
在SQL server 和 ACCESS 中:
DB2
Oracle
 
💡

注释方法:

  1. —— 这是一条注释
  1. # 这是一条注释
3./*这是
一段注释*/

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匹配

通配符 下划线(_) 单个_只匹配单个字符

  1. DB2 不支持 _
  1. Access 中为 ?

通配符 ([])- 必须匹配指定位置(通配符的位置)的一个字符

如果使用的是 Microsoft Access,需要用!而不是^来否定一个集合。

6.计算字段

💡
运行时在SELECT 语句内创建的。

拼接字段

💡
  1. 存储在vend_name列中的名字;
  1. 包含一个空格和一个左圆括号的字符串;
  1. 存储在vend_country列中的国家;
  1. 包括一个右圆括号的字符串。
 
Mysql 或者 MariaDB 中实现相同方法:
💡
RTRIM():去掉字符串右边的空格 LTRIM()(去掉字符串左边的空格) TRIM()(去掉字符串左右两边的空格)

别名

💡
SELECT 语句可以很好地拼接地址字段,但是拼接好的字段没有名字,只是一个值。
别名(alias)是一个字段或值的替换名。用 AS 关键字赋予。
别名的名字既可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。
 

算数运算

7.函数

💡
不同的DBMS所支持的函数往往不尽相同。所以在使用函数后尽量做好注释^^

使用函数

  1. 文本处理
  1. 算术操作
  1. 处理日期和时间值并提取特定数据
  1. 返回DBMS正在使用的特殊信息

文本处理函数

  1. upper():将文本转换为大写
    1. 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
      返回订单中所有物品数量之和

      聚集不同值

      1. 对所有行执行运算,指定ALL参数或者不指定参数
      1. 只包含不同的值,指定DISTINCT参数
      💡
      在使用了 DISTINCT 后,此例子中的 avg_price 比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。
      DISTINCT 不能用于 COUNT(*)

      组合聚集函数

      9.分组数据

      创建分组 - SELECT 语句的 GROUP BY 子句

      1. GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
      1. 如果在 GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。
      1. GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在 GROUP BY子句中指定相同的表达式。不能使用别名。
      1. 大多数 SQL 实现不允许 GROUP BY 列带有长度可变的数据类型(如文本或备注型字段)。
      1. 除聚集计算语句外,SELECT 语句中的每一列都必须在 GROUP BY 子句 中给出。
      1. 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。 如果列中有多行 NULL 值,它们将分为一组。
      1. 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.子查询

      子查询进行过滤

      若现在我们希望:
      1. 检索包含物品 RGAN01 的所有订单的编号。
      1. 检索具有前一步骤列出的订单编号的所有顾客的 ID。
      1. 检索前一步骤返回的所有顾客 ID 的顾客信息。

      子查询作为计算字段

      如需要显示 Customers 表中每个顾客的订单总数。订单与相应的顾客 ID 存储在 Orders 表中:
      1. 从 Customers 表中检索顾客列表;
      1. 对于检索出的每个顾客,统计其在 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),它检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表的不关联的行不同,全外联结包含两个表的不关联的行。

      使用带聚集函数的联结

      💡
      使用联结和联结条件:
      1. 在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前分别测试每个联结。
      1. 应该总是提供联结条件,否则会得出笛卡儿积

      13.组合查询

      允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结果集返回。
      1. 在一个查询中从不同的表返回数据结构。
      1. 对一个表执行多个查询,按一个查询返回数据。
      💡
      组合查询和多个 WHERE 条件
      任何具有多个WHERE 子句的 SELECT 语句都可以作为一个组合查询

      创建组合查询 - union

      使用 union

      💡
      给出每条 SELECT 语句,在各条语句之间放上关键字 UNION。

      使用规则

      1. UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔。
      1. UNION 中的每个查询必须包含相同的列、表达式或聚集函数。
      1. 列数据类型必须兼容:类型不必完全相同,但必须是 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;
      1. 可利用联结从多个表插入数据;
      1. 不管从多少个表中检索数据,数据都只能插入到一个表中。

      15.更新与删除

      更新 - UPDATE

      💡
      两种使用方式:
      1. 更新表中的特定行;
      1. 更新表中的所有行。
      UPDATE 语句组成部分:
      1. 要更新的表;
      1. 列名和它们的新值;
      1. 确定要更新哪些行的过滤条件。

      删除数据 - DELETE

      💡
      两种方式:
      1. 从表中删除特定的行
      1. 从表中删除所有行
      DELETE 不需要列名或通配符。DELETE 删除整行而不是删除列。要删除指定的列,请使用 UPDATE 语句

      更新和删除的指导原则

      1. 除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。(如果执行 UPDATE/DELETE 而不带 WHERE 子句,则表中每一行都将用新值更新。)
      1. 保证每个表都有主键。
      1. 在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
      1. 使用强制实施引用完整性的数据库,这样 DBMS 将不允许删除其数据与其他表相关联的行。
      1. 有的 DBMS 允许数据库管理员施加约束,防止执行不带 WHERE 子句的 UPDATE 或 DELETE 语句。

      16.创建与操纵表

      创建表 - CRFEATE -TABLE

      NULL 值

      💡
      NULL 值就是没有值或缺值。
      允许 NULL 值的列也允许在插入行时不给出该列的值。不允许 NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。s

      指定默认值

      💡
      SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。默认值在 CREATE TABLE 语句的列定义中用关键字 DEFAULT 指定。

      更新表 - ALTER TABLE

      1. 所有的 DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及 NULL 和 DEFAULT 的使用)有所限制。
      1. 许多 DBMS 不允许删除或更改表中的列。
      1. 多数 DBMS 允许重新命名表中的列。
      1. 许多 DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几 乎没有限制。
      1. 在 ALTER TABLE 之后给出要更改的表名。
      1. 列出要做哪些更改。
       

      删除表 — DROP TABLE

      重命名表 - 不同DBMS标准不同

      17.视图

      💡
      视图的常见应用:
      1. 重用 SQL 语句。
      1. 简化复杂的 SQL 操作。
      1. 使用表的一部分而不是整个表。
      1. 保护数据。
      1. 更改数据格式和表示。
      视图的规则和限制:
      1. 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
      1. 对于可以创建的视图数目没有限制。
      1. 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
      1. 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。(所允许的嵌套层数在不同的 DBMS 中有所不同)
      1. 许多 DBMS 禁止在视图查询中使用 ORDER BY 子句。
      1. 有些 DBMS 要求对返回的所有列进行命名,如果列是计算字段,则需 要使用别名。
      1. 视图不能索引,也不能有关联的触发器或默认值。
      1. 有些 DBMS 把视图作为只读的查询,这表示可以从视图检索数据,但 不能将数据写回底层表。
      1. 有些 DBMS 允许创建这样的视图,它不能进行导致行不再属于视图的 插入或更新。

      创建视图 - CREATE VIEW

      利用视图简化复杂的联结

      用视图重新格式化检索出的数据

      💡
      上述语句中的 “+” 也可写作“||”

      用视图过滤不想要的数据

      视图与计算字段

       

      18.存储过程

      💡
      单独编写每条 SQL 语句,并根据结果有条件地执行其他语句。
      简单来说,存储过程就是为以后使用而保存的一条或多条 SQL 语句。可将其视为批文件,虽然它们的作用不仅限于批处理
      存储过程的优势
      1. 通过把处理封装在一个易用的单元中,可以简化复杂的操作
      1. 由于不要求反复建立一系列处理步骤,因而保证了数据的一致性。
      1. 简化对变动的管理。
      1. 因为存储过程通常以编译过的形式存储,所以 DBMS 处理命令所需的工作量少,提高了性能。
      1. 存在一些只能用在单个请求中的 SQL 元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。
      存储过程的缺陷
      1. 不同 DBMS 中的存储过程语法有所不同。
      1. 一般来说,编写存储过程比编写基本 SQL 语句复杂

      执行存储过程 - EXECUTE

      💡
      存储过程所完成的工作:
      1. 验证传递的数据,保证所有 4 个参数都有值;
      1. 生成用作主键的唯一 ID;
      1. 将新产品插入 Products 表,在合适的列中存储生成的主键和传递的数据。

      创建存储过程

      19.管理事务处理

      💡
      使用事务处理(transaction processing),通过确保成批的 SQL 操作要么完全执行,要么完全不执行,来维护数据库的完整性。
      一些相关术语:
      1. 事务(transaction)指一组 SQL 语句。
      1. 回退(rollback)指撤销指定 SQL 语句的过程;
      1. 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
      1. 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退(与回退整个事务处理不同)。

      控制事务处理

      💡
      管理事务的关键在于将 SQL 语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。
      有的 DBMS 要求明确标识事务处理块的开始和结束,

      使用ROLLBACK

      使用COMMIT

      💡
      一般的 SQL 语句都是针对数据库表直接执行和编写的。这就是所谓的隐式提交(implicit commit),即提交(写或保存)操作是自动进行的。但是在事务处理块中,提交不会隐式进行。

      使用保留点

      💡
      要支持回退部分事务,必须在事务处理块中的合适位置放置占位符。这样,如果需要回退,可以回退到某个占位符。在 SQL 中,这些占位符称为保留点。
      每个保留点都要取能够标识它的唯一名字,以便在回退时,DBMS 知道回退到何处。

      20.游标

      💡
      简单地使用 SELECT 语句,没有办法得到第一行、下一行或前 10 行。
      需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。
      游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
      💡
      常见的一些选项和特性:
      1. 能够标记游标为只读,使数据能读取,但不能更新和删除。
      1. 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)
      1. 能标记某些列为可编辑的,某些列为不可编辑的。
      1. 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
      1. 指示 DBMS 对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。

      使用游标

      💡
      步骤: 1. 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT 语句和游标选项。
      1. 一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT语句把数据实际检索出来。
      1. 对于填有数据的游标,根据需要取出(检索)各行。
      1. 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的 DBMS)。

      创建游标 - DECLARE

      💡
      DECLARE 命名游标,并定义相应的 SELECT 语句,根据需要带 WHERE 和其他子句。

      使用游标 - OPEN CURSOR

      关闭游标

      21.高级SQL特性

      约束

      主键

      💡
      主键是一种特殊的约束,用来保证一列(或一组列)中的值是唯一的,而且永不改动。
      表中的一列(或多个列)的值唯一标识表中的每一行。这方便了直接或交互地处理表中 的行。
      没有主键,要安全地 UPDATE 或 DELETE 特定行而不影响其他行会非常困难。
      使用主键的条件:
      1. 任意两行的主键值都不相同。
      1. 包含主键值的列从不修改或更新。
      1. 每行都具有一个主键值
      1. 主键值不能重用。如果从表中删除某一行,其主键值不分配给新行。

      外键

      💡
      外键是表中的一列,其值必须列在另一表的主键中。外键是保证引用完整性的极其重要部分。
      例:Orders 表将录入到系统的每个订单作为一行包含其中。顾客信息存储在 Customers 表中。Orders 表中的订单通过顾客 ID 与 Customers 表中的特定行相关联。顾客 ID 为 Customers 表的主键,每个顾客都有唯一的ID。订单号为 Orders 表的主键,每个订单都有唯一的订单号。
      Orders 表中顾客 ID 列的值不一定是唯一的。如果某个顾客有多个订单,则有多个行具有相同的顾客 ID(虽然每个订单都有不同的订单号)。同时,Orders 表中顾客 ID 列的合法值为 Customers 表中顾客的 ID。

      唯一约束

      💡
      唯一约束的语法类似于其他约束的语法。唯一约束既可以用 UNIQUE 关键字在表定义中定义,也可以用单独的 CONSTRAINT 定义。

      检查约束

      💡
      用来保证一列(或一组列)中的数据满足一组指定的条件。
      常见用途:
      1. 检查最小或最大值。
      1. 指定范围。
      1. 只允许特定值。

      索引

      💡
      索引用来排序数据以加快搜索和排序操作的速度。
      在一个或多个列上定义索引,使 DBMS 保存其内容的一个排过序的列表。在定义了索引后,DBMS 以使用书的索引类似的方法使用它。DBMS 搜索排过序的索引,找出匹配的位置,然后检索这些行。
      索引必须唯一命名。

      触发器

      💡
      触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。
      触发器可以与特定表上的 INSERT、UPDATE 和 DELETE 操作(或组合)相关联。
      触发器内代码的数据访问权:
      1. INSERT 操作中的所有新数据;
      1. UPDATE 操作中的所有新数据和旧数据;
      1. DELETE 操作中删除的数据。
      常见用途:
      1. 保证数据一致。
      1. 基于某个表的变动在其他表上执行活动。
      1. 进行额外的验证并根据需要回退数据。
      1. 计算计算列的值或更新时间戳。

      22.语法速记

      ALTER TABLE - 更新已存在表的结构

      COMMIT - 将事务写入数据库

      CREATE INDEX - 在一个或多个列上创建索引

      CREATE PROCEDURE - 创建存储过程

      CREATE TABLE - 创建新数据库表

      CREATE VIEW - 创建一个或多个表上的新视图

      DELETE - 从表中删除一行或多行

      DROP - 永久地删除数据库对象(表、视图、索引等)

      INSERT - 为表添加一行

      INSERT SELECT - 将 SELECT 的结果插入到一个表

      ROLLBACK - 撤销一个事务块

      SELECT - 从一个或多个表(视图)中检索数据

      UPDATE - 更新表中的一行或多行

       
      上一篇
      分段
      下一篇
      随记-1
      Catalog