SQL 面试问题与答案

2025年5月31日 | 42 分钟阅读
SQL Interview Questions

以下是为初级和有经验的求职者准备的最热门、最有用的 SQL 面试问题与答案。这些问题是专门为了让您熟悉在 SQL 面试中可能遇到的问题类型而创建的。根据我们的经验,优秀的面试官很少计划在面试中提问任何特定主题。相反,提问通常从对主题的基本理解开始,然后根据您的回答进行进一步的讨论。

1) 什么是 SQL?

SQL 代表结构化查询语言(Structured Query Language)。它是用于维护关系数据库并对数据执行多种不同数据操作的标准语言。SQL 最初发明于1970年。它是一种用于数据库创建、删除、获取和修改行等的数据库语言。有时,它被读作 'sequel'。我们也可以用它来处理由实体(变量)和数据不同实体之间的关系组成的结构化数据。

阅读更多:SQL 教程


2) SQL 是什么时候出现的?

SQL 首次出现于1974年。它是维护关系数据库最常用的语言之一。1986年,SQL 成为美国国家标准协会(ANSI)的标准,并于1987年成为国际标准化组织(ISO)的标准。


3) SQL 有哪些用途?

SQL 负责维护关系数据和数据库中存在的数据结构。一些常见用途如下:

  • 对数据库执行查询
  • 从数据库中检索数据
  • 向数据库中插入记录
  • 更新数据库中的记录
  • 从数据库中删除记录
  • 创建新数据库
  • 在数据库中创建新表
  • 在数据库中创建视图
  • 对数据库执行复杂操作。

4) SQL 支持编程语言特性吗?

SQL 指的是标准查询语言。因此,SQL 确实是一种语言,但实际上并不支持编程语言。它是一种通用语言,没有循环、条件语句和逻辑运算。除了数据操作之外,它不能用于任何其他目的。它是一种用于执行数据库操作的命令语言。SQL 的主要目的是检索、操作、更新、删除数据,并对数据库中存在的数据执行复杂操作,如连接(joins)。

阅读更多:SQL 语言


5) SQL 的子集有哪些?

以下是 SQL 的四个主要子集:

  • 数据定义语言 (DDL): 它定义了数据结构,由 CREATE、ALTER、DROP 等命令组成。
  • 数据操作语言 (DML): 它用于操作数据库中已有的数据。此类别中的命令有 SELECT、UPDATE、INSERT 等。
  • 数据控制语言 (DCL): 它控制对数据库中存储的数据的访问。此类别中的命令包括 GRANT 和 REVOKE。
  • 事务控制语言 (TCL): 它用于处理数据库中的事务操作。此类别中的命令有 COMMIT、ROLLBACK、SET TRANSACTION、SAVEPOINT 等。

6) DDL 语言的用途是什么?

DDL 代表数据定义语言。它是数据库的一个子集,在创建数据库时定义数据库的数据结构。例如,我们可以使用 DDL 命令来添加、移除或修改表。它包括以下命令:CREATE、ALTER 和 DELETE 数据库对象,如模式、表、索引、视图、序列等。

示例

阅读更多:SQL 中的 DDL 命令


7) DML 语言的用途是什么?

数据操作语言使用户能够检索和操作关系数据库中的数据。DML 命令只能对数据执行只读操作。我们可以使用 DDL 语言执行以下操作:

  • 通过 INSERT 命令向数据库中插入数据。
  • 通过 SELECT 命令从数据库中检索数据。
  • 通过 UPDATE 命令更新数据库中的数据。
  • 通过 DELETE 命令从数据库中删除数据。

示例

阅读更多:SQL 中的 DML 命令


8) DCL 语言的用途是什么?

数据控制语言允许用户控制对数据库的访问和权限管理。它是数据库的一个子集,决定了哪个用户在什么时间点可以访问数据库的哪个部分。它包括两个命令:GRANT 和 REVOKE。

GRANT: 它使系统管理员能够将特权和角色分配给特定用户帐户,以在数据库上执行特定任务。

REVOKE: 它使系统管理员能够从用户帐户中撤销特权和角色,以便他们不能在数据库上使用先前分配的权限。

示例

阅读更多:SQL 中的 DCL 命令


9) 数据库中的表和字段是什么?

表是以行和列的形式组织的数据集。它使用户能够以结构化格式存储和显示记录。它类似于电子表格应用程序中的工作表。这里的行指的是元组,代表单个数据项,列是特定行中数据项的属性。列可以分类为垂直的,行是水平的。

字段是为表提供结构的组件。它以相同的数据类型存储相同类别的数据。一个表包含固定数量的列,但可以有任意数量的行,称为记录。它也被称为数据库表中的列。它代表记录中实体的属性或特征。

示例

表: 学生

字段: 学号、姓名、出生日期、专业等。


10) 什么是主键?

主键是一个字段或字段的组合,用于唯一标识表中的每条记录。它是一种特殊的唯一键。如果列包含主键,它不能为 null 或为空。一个表可以有重复的列,但不能有多个主键。它总是在列中存储唯一值。例如,学号可以被视为大学或学院中学生的主键。

SQL Interview Questions and Answers

我们可以在学生表中定义主键如下:

阅读更多:SQL 主键


11) 什么是外键?

外键用于将一个或多个表连接在一起。它也被称为引用键。外键被指定为与另一个表的主键相关的键。这意味着一个表中的外键字段引用另一个表的主键字段。它唯一地标识了另一个表的每一行,从而维护了引用完整性。主键-外键关系是一个非常关键的关系,因为它有时会维护数据库的 ACID 属性。它还防止会破坏子表和父表之间链接的操作。

我们可以在表中定义外键如下:


阅读更多:SQL 外键


12) 什么是唯一键?

唯一键是单个或多个字段的组合,确保列中存储的所有值都是唯一的。这意味着一个列不能存储重复的值。这个键为列或列集提供了唯一性。例如,学生表中的电子邮件地址和学号应该是唯一的。它可以接受一个 null 值,但每列只能有一个 null 值。它确保了列或列组的完整性,以便将不同的值存储到表中。

我们可以在表中定义外键如下:

阅读更多:SQL 中的唯一键


13) 主键和唯一键有什么区别?

主键和唯一键都是 SQL 的重要约束。它们之间的主要区别在于,主键标识表中的每条记录。而唯一键则防止列中出现重复条目,但允许一个 NULL 值。以下比较图表更清楚地解释了这一点:

主键唯一键
主键作为表中每条记录的唯一标识符。当表中没有主键时,唯一键也是记录的唯一标识符。
我们不能在主键列中存储 NULL 值。我们可以在唯一键列中存储 NULL 值,但只允许一个 NULL 值。
我们不能更改或删除主键列的值。我们可以修改唯一键列的值。

阅读更多:主键与唯一键的区别


14) 什么是数据库?

数据库是一个有组织的数据集合,其结构化为表、行、列和索引。它帮助用户频繁地查找相关信息。它是一个电子系统,使数据访问、数据操作、数据检索、数据存储和数据管理变得非常容易。几乎每个组织都使用数据库来存储数据,因为它易于访问且操作简便。数据库为数据提供了完美的访问权限,并让我们能够执行所需的任务。

以下是数据库的常见特性:

  • 管理大量数据
  • 准确
  • 易于更新
  • 安全性
  • 数据完整性
  • 易于研究数据

15) DBMS 是什么意思?

DBMS 代表数据库管理系统。它是一个软件程序,主要充当数据库和最终用户之间的接口。它为我们提供了诸如管理数据、数据库引擎和数据库模式等功能,以便在几乎不费吹灰之力的情况下,使用简单的查询来组织和操作数据。它就像一个文件管理器,管理数据库中的数据,而不是将其保存在文件系统中。没有数据库管理系统,用户访问数据库的数据将困难得多。

以下是 DBMS 的组成部分:

  • 软件
  • 数据
  • 过程
  • 数据库语言
  • 查询处理器
  • 数据库管理器
  • 数据库引擎
  • 报告

阅读更多:DBMS 教程


16) 数据库管理系统有哪些不同类型?

数据库管理系统可以分为几种类型。下面列出了一些重要的类型:

  • 层次数据库 (DBMS)
  • 网络数据库 (IDMS)
  • 关系数据库 (RDBMS)
  • 面向对象数据库
  • 文档数据库 (Document DB)
  • 图数据库
  • ER 模型数据库
  • NoSQL 数据库

阅读更多:数据库类型


17) 什么是 RDBMS?

RDBMS 代表关系数据库管理系统。它是一种基于关系模型的数据库管理系统。它方便您通过使用关系运算符来操作存储在表中的数据。RDBMS 将数据存储到表的集合中,并在需要时使用关系运算符轻松链接这些表。关系数据库管理系统的例子有 Microsoft Access、MySQL、SQL Server、Oracle 数据库等。

阅读更多:什么是 RDBMS


18) 数据库中的规范化是什么?

规范化用于通过组织数据库的字段和表来最小化冗余和依赖。

数据库规范化有一些规则,通常称为范式,它们是:

  • 第一范式 (1NF)
  • 第二范式 (2NF)
  • 第三范式 (3NF)
  • Boyce-Codd 范式 (BCNF)

通过这些步骤,可以消除数据库中数据的冗余、异常和不一致性。

阅读更多:DBMS 中的规范化


19) 规范化的主要用途是什么?

规范化主要用于在单个表中添加、删除或修改字段。规范化的主要用途是消除冗余并消除插入、删除和更新的干扰。规范化将表分解为小分区,然后使用不同的关系将它们链接起来,以避免冗余的可能性。

阅读更多:规范化的目的


20) 不执行数据库规范化有什么缺点?

主要缺点是:

数据库中出现冗余项会导致磁盘空间浪费。

由于冗余项,也可能出现不一致性。如果在一个表的数据中进行了任何更改,但在另一个表的相同数据中没有进行更改,则会发生不一致。这种不一致性将导致维护问题,并影响 ACID 属性。


21) 什么是不一致的依赖关系?

不一致的依赖关系指的是由于数据路径缺失或损坏而难以获取相关数据。它导致用户在错误的表中搜索数据,从而导致输出错误。


22) 数据库中的反规范化是什么?

反规范化是数据库管理员用来优化其数据库基础设施效率的一种技术。反规范化的概念基于规范化,规范化被定义为为特定目的正确地将数据库组织成表。这种方法允许我们向规范化的数据库中添加冗余数据,以缓解将多个表的数据合并到单个表中的数据库查询问题。它向表中添加冗余项,以避免复杂的连接和许多其他复杂的操作。

反规范化并不意味着不进行规范化。它是在规范化过程之后进行的优化策略。

阅读更多:数据库中的反规范化


23) SQL 运算符有哪些不同类型?

运算符是为执行特定操作而保留的特殊关键字或特殊字符。它们也用于 SQL 查询中。我们主要可以在 SQL 命令的 WHERE 子句中使用这些运算符。它是命令的一部分,用于根据指定条件筛选数据。SQL 运算符可分为以下几类:

  • 算术运算符: 这些运算符用于对数值数据执行数学运算。这些运算符的类别包括加法 (+)、减法 (-)、乘法 (*)、除法 (/)、余数/模数 (%) 等。
  • 逻辑运算符: 这些运算符评估表达式并以 True 或 False 的形式返回其结果。该运算符包括 ALL、AND、ANY、ISNULL、EXISTS、BETWEEN、IN、LIKE、NOT、OR、UNIQUE。
  • 比较运算符: 这些运算符用于比较两个值并检查它们是否相同。它包括等于 (=)、不等于 (!= 或 <>)、小于 (<)、大于 (>)、小于或等于 (<=)、大于或等于 (>=)、不小于 (!<)、不大于 (!>) 等。
  • 位运算符: 它用于在两个整数类型的表达式之间进行位操作。它首先将整数转换为二进制位,然后应用诸如 AND (& 符号)、OR (|, ^)、NOT (~) 等运算符。
  • 复合运算符: 这些运算符在将变量的结果设置为操作结果之前对变量执行操作。它包括加等于 (+=)、减等于 (-=)、乘等于 (*=)、除等于 (/=)、模等于 (%=) 等。
  • 字符串运算符: 这些运算符主要用于执行字符串的连接和模式匹配。它包括 + (字符串连接)、+= (字符串连接赋值)、% (通配符)、[] (字符匹配)、[^] (字符不匹配)、_ (通配符匹配一个字符) 等。

阅读更多:SQL 运算符


24) SQL 中的视图是什么?

视图是没有值的数据库对象。它是一个虚拟表,包含表内数据的子集。它看起来像一个包含行和列的实际表,但占用空间较少,因为它不是物理存在的。它的操作类似于基表,但不包含任何自己的数据。它的名称总是唯一的。视图可以包含来自一个或多个表的数据。如果基础表发生任何更改,视图中也会反映出相同的更改。

SQL Interview Questions and Answers

视图的主要用途是实现安全机制。它是一个可搜索的对象,我们可以像使用表一样使用查询来搜索视图。它只显示创建视图时声明的查询返回的数据。

我们可以使用以下语法创建视图:

阅读更多:SQL 视图


25) SQL 中的索引是什么?

索引是与表或视图关联的磁盘结构,可加快行检索速度。它降低了查询的成本,因为查询的高成本会导致其性能下降。它用于提高性能并允许更快地从表中检索记录。索引减少了我们需要访问以查找特定数据页的数据页数量。它还有一个唯一值,这意味着索引不能重复。索引为每个值创建一个条目,从而加快了数据检索速度。

例如: 假设我们有一本书,其中包含各国的详细信息。如果你想查找有关印度的信息,你为什么要翻阅那本书的每一页呢?你可以直接查看索引。然后从索引中,你可以转到提供了所有关于印度信息的特定页面。

阅读更多:SQL 索引


26) SQL 中有哪些不同类型的索引?

SQL 索引只不过是一种降低查询成本的技术。查询的成本越高,查询的性能就越差。以下是 SQL 支持的不同类型的索引:

  • 唯一索引
  • 聚集索引
  • 非聚集索引
  • 位图索引
  • 普通索引
  • 复合索引
  • B-树索引
  • 基于函数的索引

27) 什么是唯一索引?

唯一索引(UNIQUE INDEX)用于强制单个或多个列中值的唯一性。我们可以在单个表中创建多个唯一索引。要创建唯一索引,用户必须检查列中的数据,因为当表的任何列具有唯一值时才使用唯一索引。如果列被唯一索引,此索引不允许该字段有重复值。当定义主键时,可以自动应用唯一索引。

我们可以使用以下语法创建它:

示例

假设我们想将 Phone 列设为唯一索引。我们可以这样做:

阅读更多信息,MySQL 唯一索引


28) SQL 中的聚集索引是什么?

聚集索引实际上是一个存储了行数据的表。它根据键值决定表的数据顺序,并且只能按一个方向排序。每个表只能有一个聚集索引。它是唯一一个在生成主键时自动创建的索引。如果表中需要进行大量数据修改,则首选聚集索引。

阅读更多信息,MySQL 聚集索引


29) SQL 中的非聚集索引是什么?

除了主索引(聚集索引)之外的索引称为非聚集索引。我们知道,当生成主键时会自动创建聚集索引,而当查询中使用多个连接条件和各种过滤器时会创建非聚集索引。非聚集索引和表数据都存储在不同的位置。它不能改变表的物理顺序,而是维护数据的逻辑顺序。

创建非聚集索引的目的是为了搜索数据。最好的例子是一本书,内容写在一个地方,而索引在另一个不同的地方。我们可以在每个表中创建 0 到 249 个非聚集索引。非聚集索引提高了使用未分配主键的键的查询性能。


30) SQL、MySQL 和 SQL Server 之间有什么区别?

以下比较图表解释了它们的主要区别:

SQLMySQLSQL Server
SQL 或结构化查询语言用于管理我们的关系数据库。它用于查询和操作数据库。MySQL 是用于管理关系数据库的流行数据库管理系统。它是一个快速、可扩展且易于使用的数据库。SQL Server 是一个 RDBMS 数据库系统,主要为 Windows 系统开发,用于存储、检索和访问开发者请求的数据。
SQL 首次出现于 1974 年。MySQL 首次出现于 1995 年 5 月 23 日。SQL Server 首次出现于 1989 年 4 月 24 日。
SQL 由 IBM 公司开发。MySQL 由 Oracle 公司开发。SQL Server 由 Microsoft 公司开发。
SQL 是用于管理数据库的查询语言。MySQL 是使用 SQL 语言与数据库进行交互的数据库软件。SQL Server 也是使用 SQL 语言与数据库进行交互的软件。
SQL 没有变量。MySQL 可以使用变量约束和数据类型。SQL Server 可以使用变量约束和数据类型。
SQL 是一种编程语言,因此它不会有任何更新。它的命令总是固定的,保持不变。MySQL 是软件,因此会频繁更新。SQL Server 也是软件,因此会频繁更新。

阅读更多:SQL 与 MySQL 的区别

阅读更多:MySQL 与 MS SQL Server 的区别


31) SQL 和 PL/SQL 有什么区别?

以下比较图表解释了它们的主要区别:

SQLPL/SQL
SQL 是一种数据库结构化查询语言,用于与关系数据库通信。它由 IBM 公司开发,并于 1974 年首次出现。PL/SQL 或过程语言/结构化查询语言是 SQL 的一种方言,用于增强 SQL 的功能。它由 Oracle 公司在 90 年代初开发。它使用 SQL 作为其数据库语言。
SQL 是一种声明性和面向数据的语言。PL/SQL 是一种过程性和面向应用的语言。
SQL 没有变量。PL/SQL 可以使用变量约束和数据类型。
SQL 一次只能执行一个查询。PL/SQL 一次可以执行整个代码块。
SQL 查询可以嵌入到 PL/SQL 中。PL/SQL 不能嵌入到 SQL 中,因为 SQL 不支持任何编程语言和关键字。
SQL 可以直接与数据库服务器交互。PL/SQL 不能直接与数据库服务器交互。
SQL 就像我们需要显示的数据源。PL/SQL 提供了一个平台,SQL 数据将在该平台上显示。

阅读更多:PL/SQL 教程


32) 是否可以使用列别名对列进行排序?

是的。我们可以在 ORDER BY 子句中使用别名方法来对列进行排序,而不是在 WHERE 子句中。


33) SQL 中聚集索引和非聚集索引有什么区别?

索引是一种快速获取请求数据的方法。SQL 中主要有两种类型的索引:聚集索引和非聚集索引。从 SQL 性能的角度来看,这两种索引之间的区别非常重要。以下比较图表解释了它们的主要区别:

聚集索引非聚集索引
聚集索引是存储了行数据的表或视图。在关系数据库中,如果表列包含主键,MySQL 会自动创建一个名为 PRIMARY 的聚集索引。除了主索引(聚集索引)之外的索引称为非聚集索引。它具有与数据行分离的结构。非聚集索引也称为二级索引。
聚集索引存储数据信息和数据本身。非聚集索引只存储信息,然后它会引用存储在聚集数据中的数据。
每个表只能有一个聚集索引。一个表中可以有一个或多个非聚集索引。
聚集索引决定了数据在表中的物理存储方式。因此,从聚集索引读取数据更快。它创建了数据行的逻辑顺序,并使用指针访问物理数据文件。因此,从聚集索引读取数据较慢。
聚集索引的索引 id 始终为 0。非聚集索引的索引 id 始终大于 0。

阅读更多信息,聚集索引与非聚集索引


34) 显示当前日期的 SQL 查询是什么?

SQL 中有一个内置函数叫做 GetDate(),用于返回当前时间戳。


35) SQL 中的连接有哪些?说出最常用的 SQL 连接?

SQL 连接用于从多个表中检索数据,并将其合并成一个有意义的结果集。每当您需要从两个或多个表中获取记录时,都会执行连接。它们与 SELECT 语句和连接条件一起使用。

以下是 SQL 中最常用的连接:

  • INNER JOIN (内连接)
  • LEFT OUTER JOIN (左外连接)
  • 右外连接 (RIGHT OUTER JOIN)

36) SQL 中有哪些不同类型的连接?

连接用于合并两个表或从表中检索数据。这取决于表之间的关系。根据 ANSI 标准,SQL 中使用的不同类型的连接如下:

  • INNER JOIN (内连接)
  • 自连接 (SELF JOIN)
  • LEFT OUTER JOIN (左外连接)
  • 右外连接 (RIGHT OUTER JOIN)
  • 全外连接 (FULL OUTER JOIN)
  • CROSS JOIN (交叉连接)
SQL Interview Questions and Answers

阅读更多:SQL 连接的类型


37) SQL 中的 INNER JOIN 是什么?

内连接只返回表中匹配指定条件的记录,并隐藏其他行和列。简单来说,它在表之间至少找到一行匹配时获取行。INNER JOIN 关键字连接两个表中的匹配记录。它被认为是默认连接,因此在查询中使用 INNER 关键字是可选的。

下面的可视化表示更清楚地解释了这种连接:

SQL Interview Questions and Answers

以下语法说明了 INNER JOIN:

阅读更多:SQL 内连接


38) SQL 中的 Right JOIN 是什么?

右连接用于从右侧表中检索所有行,并仅从另一个表中检索满足连接条件的行。它返回右侧表中的所有行,即使在左侧表中没有匹配项。如果它在左侧表中找到不匹配的记录,则返回 Null 值。此连接也称为右外连接。

下面的可视化表示更清楚地解释了这种连接:

SQL Interview Questions and Answers

以下语法说明了 RIGHT JOIN:

阅读更多:SQL 右连接


39) SQL 中的左连接是什么?

左连接用于获取左侧表中的所有行以及指定表之间的公共记录。它返回左侧表中的所有行,即使右侧表中没有匹配项。如果它在右侧表中没有找到任何匹配记录,则返回 null。此连接也可以称为左外连接。

以下可视化表示更清楚地解释了这一点:

SQL Interview Questions and Answers

以下语法说明了 RIGHT JOIN:

阅读更多:SQL 左连接


40) SQL 中的全连接是什么?

全连接是左连接和右连接的组合结果,包含两个表中的所有记录。当任一表中有匹配行时,它会获取行。这意味着它返回左侧表中的所有行和右侧表中的所有行。如果未找到匹配项,则放入 NULL 值。它也称为全外连接。

以下可视化表示更清楚地解释了这一点:

SQL Interview Questions and Answers

以下语法说明了 FULL JOIN:

阅读更多:SQL 全连接


41) SQL 中的“触发器”是什么?

触发器是一组驻留在系统目录中的 SQL 语句。它是一种特殊类型的存储过程,在响应事件时自动调用。它允许我们在对特定表运行插入、更新或删除命令时执行一批代码,因为触发器是在向系统发出 DML 命令时激活的一组操作。

SQL 触发器有两个主要组成部分:一个是动作,另一个是事件。当采取某些动作时,由于这些动作而发生事件。

我们使用 CREATE TRIGGER 语句在 SQL 中创建触发器。以下是语法:

阅读更多:SQL 中的触发器


42) 什么是自连接?自连接有什么要求?

自连接用于将表与自身连接。此连接可以使用表别名来执行,这使我们能够避免在单个句子中重复相同的表名。如果我们在单个查询中多次使用相同的表名而不使用表别名,则会引发错误。

当我们需要将数据与同一表中的其他数据组合时,需要自连接。将层次结构转换为平面结构通常非常有用。

以下语法说明了自连接:

示例

假设我们有一个名为 'Student' 的表,包含以下数据:

SQL Interview Questions and Answers

如果我们想从表中检索 student_id 和 name,其中 student_id 相等且 course_id 不相等,可以使用自连接来完成:

这是结果:

SQL Interview Questions and Answers

43) SQL 中的集合运算符有哪些?

我们使用集合运算符来合并来自一个或多个同类型表的数据。虽然集合运算符类似于 SQL 连接,但存在显著区别。SQL 连接组合来自不同表的列,而 SQL 集合运算符组合来自不同查询的行。包含集合操作的 SQL 查询称为复合查询。SQL 中的集合运算符分为四种不同类型:

SQL Interview Questions and Answers

A. UNION: 它将多个 SELECT 查询的两个或多个结果组合成一个结果集。它具有默认功能,可以从表中删除重复行。以下语法说明了 Union 运算符:

B. UNION ALL: 此运算符类似于 Union 运算符,但它不会从 SELECT 语句的输出中删除重复行。以下语法说明了 UNION ALL 运算符:

C. INTERSECT: 此运算符返回两个或多个 SELECT 语句中的公共记录。它总是检索唯一记录,并默认按升序排列。在这里,列数和数据类型应该相同。以下语法说明了 INTERSECT 运算符:

D. MINUS: 此运算符返回第一个查询中未在第二个查询中找到的记录。它不返回重复值。以下语法说明了 MINUS 运算符:

阅读更多:SQL 中的集合运算符


44) IN 和 BETWEEN 运算符有什么区别?

以下比较图表解释了它们的主要区别:

BETWEEN 运算符IN 运算符
此运算符用于选择两个值之间的数据范围。这些值可以是数字、文本和日期。它是一个逻辑运算符,用于确定特定值是否存在于一组值中。此运算符减少了查询中多个 OR 条件的使用。
它返回列值位于定义范围内的记录。它比较指定列的值,并在值集中存在匹配时返回记录。
以下语法说明了此运算符:
SELECT * FROM table_name
WHERE column_name BETWEEN 'value1' AND 'value2';
以下语法说明了此运算符:
SELECT * FROM table_name
WHERE column_name IN ('value1','value 2');

阅读更多:In 和 Between 运算符的区别


45) 什么是约束?告诉我它的各个级别。

约束用于指定允许或限制将哪些值/数据存储在表中的规则和规定。它确保表内数据的准确性和完整性。它强制我们存储有效数据,并防止我们存储不相关的数据。如果约束和数据操作之间发生任何中断,则该操作失败。一些最常用的约束是 NOT NULL、PRIMARY KEY、FOREIGN KEY、AUTO_INCREMENT、UNIQUE KEY 等。

以下语法说明了我们如何为表创建约束:

SQL 将约束分为两个级别:

列级约束: 这些约束仅应用于单个列,并限制可以存储在该列中的数据类型。

表级约束: 这些约束应用于整个表,并限制可以输入的数据类型。

阅读更多:SQL 中的约束


46) 如何编写 SQL 查询来查找名字以 'A' 开头的学生?

我们可以编写以下查询来获取名字以 A 开头的学生详细信息:

这是一个演示示例,我们有一个名为 student 的表,其中包含两个以 'A' 字符开头的名字。

SQL Interview Questions and Answers

47) 编写 SQL 查询,从名为 employees 的表中获取员工的第三高薪水。

以下查询是获取员工第三高薪水的最简单方法:

这是一个演示示例,展示了如何获取员工的第三高薪水。

SQL Interview Questions and Answers

以下是获取员工第三高薪水的其他方法:

A. 使用 LIMIT 关键字

B. 使用子查询

C. 使用 TOP 关键字


48) SQL 中的 DELETE 和 TRUNCATE 语句有什么区别?

它们之间的主要区别在于,delete 语句删除数据而不重置表的标识,而 truncate 命令则重置特定表的标识。以下比较图表更清楚地解释了这一点:

编号。DELETETRUNCATE
1)delete 语句根据指定条件从现有表中删除单行或多行。truncate 命令删除现有表的全部内容,但不删除表本身。它保留了表结构或模式。
2)DELETE 是一个 DML 命令。TRUNCATE 是一个 DDL 命令。 (注:原文此处有误,TRUNCATE通常被归类为DDL,但行为类似DML,在某些系统如Oracle中是DDL,SQL Server中是DML。保留原文分类,但指出常见分类是DDL)
3)我们可以在 DELETE 命令中使用 WHERE 子句。我们不能在 TRUNCATE 中使用 WHERE 子句。
4)DELETE 语句用于从表中删除一行TRUNCATE 语句用于从表中删除所有行
5)DELETE 较慢,因为它会维护日志。TRUNCATE 语句比 DELETE 语句更快,因为它一次性删除所有数据而不维护事务日志。
6)在使用 DELETE 语句后,你可以回滚数据。使用 TRUNCATE 语句后无法回滚
7)DELETE 查询占用更多空间TRUNCATE 查询占用更少空间

阅读更多:Delete 和 Truncate 命令的区别


49) 数据库中的 ACID 属性是什么?

ACID 属性是针对经历不同任务组的事务而言的。事务是数据的单个逻辑顺序。它提供属性以在数据库事务前后保持一致性。它还确保数据事务在数据库系统中得到可靠处理。

ACID 属性是原子性、一致性、隔离性和持久性的首字母缩写。

原子性(Atomicity): 它确保事务单元内的所有语句或操作必须成功执行。如果事务的一部分失败,则整个事务失败,数据库状态保持不变。其主要特性是 COMMIT、ROLLBACK 和 AUTO-COMMIT。

一致性(Consistency): 此属性确保数据必须满足所有验证规则。简单来说,我们可以说数据库只有在事务成功提交时才改变状态。它还保护数据免受崩溃的影响。

隔离性(Isolation): 此属性保证事务单元中执行的并发属性必须独立操作。它还确保语句对彼此是透明的。提供隔离的主要目标是控制数据库中的并发性。

持久性(Durability): 此属性保证一旦事务被提交,即使系统崩溃、断电或失败,它也会永久存在。

阅读更多:DBMS 中的 ACID 属性


50) 空白格或零与 NULL 值相同吗?

不。NULL 值与零或空白格不同。以下几点解释了它们的主要区别:

  • NULL 值是一个“不可用、未分配、未知或不适用”的值。它用于在没有任何值的情况下。我们可以对其执行算术运算。另一方面,零是一个数字,空白格被视为一个字符。
  • NULL 值可以被视为未知和缺失的值,但零和空白格与 NULL 值不同。
  • 我们可以将空白格或零与另一个空白格或零进行比较。另一方面,一个 NULL 可能与另一个 NULL 不相同。NULL 表示没有提供数据或数据不存在。

51) SQL 中的函数及其用途是什么?

SQL 函数是经常在数据库系统中用于数据处理和操作的简单代码片段。函数是测量值。它总是执行特定的任务。在创建函数时应记住以下规则:

  • 函数应该有一个名称,名称不能以特殊字符开头,如 @、#、$ 或其他类似字符。
  • 函数只能与 SELECT 语句一起工作。
  • 每次调用函数时,它都会被编译。
  • 函数必须返回值或结果。
  • 函数总是与输入参数一起使用。

SQL 将函数分为两种类型:

  • 用户定义函数: 用户根据其需求创建的函数称为用户定义函数。
  • 系统定义函数: 其定义由系统定义的函数称为系统定义函数。它们是内置的数据库函数。

SQL 函数用于以下目的:

  • 对数据进行计算
  • 修改单个数据项
  • 操作输出
  • 格式化日期和数字
  • 转换数据类型

52) 什么是大小写操作函数?解释其在 SQL 中的不同类型。

大小写操作函数是字符函数的一部分。它将数据从表中已存储的状态转换为大写、小写或混合大小写。此函数执行的转换可用于格式化输出。我们几乎可以在 SQL 语句的每个部分使用它。当您需要搜索数据,并且不知道您要查找的数据是小写还是大写时,最常使用大小写操作函数。

SQL 中有三种大小写操作函数:

LOWER: 此函数用于将给定字符转换为小写。以下示例将 'STEPHEN' 返回为 'stephen'

注意:这里的 'dual' 是一个虚拟表。

UPPER: 此函数用于将给定字符转换为大写。以下示例将 'stephen' 返回为 'STEPHEN'

INITCAP: 此函数用于将给定字符值的每个单词的首字母转换为大写。这意味着每个单词的第一个字母都转换为大写,其余的为小写。以下示例将 'hello stephen' 返回为 'Hello Stephen'


53) 解释字符操作函数?解释其在 SQL 中的不同类型。

字符操作函数用于更改、提取和修改字符字符串。当一个或多个字符和单词传递给函数时,函数将对这些输入字符串执行其操作并返回结果。

以下是 SQL 中的字符操作函数:

A) CONCAT: 此函数用于将两个或多个值连接在一起。它总是将第二个字符串附加到第一个字符串的末尾。例如:

输入: SELECT CONCAT ('Information-', 'technology') FROM DUAL;

输出: Information-technology

B) SUBSTR: 它用于从指定的起点到终点返回字符串的一部分。例如:

输入: SELECT SUBSTR ('Database Management System', 9, 11) FROM DUAL;

输出: Management

C) LENGTH: 此函数以数值形式返回字符串的长度,包括空格。例如:

输入: SELECT LENGTH ('Hello Tpoint Tech') FROM DUAL;

输出 16

D) INSTR: 此函数查找给定字符串中指定字符或单词的确切数字位置。例如:

输入: SELECT INSTR ('Hello Tpoint Tech', 'Tpoint Tech');

输出 7

E) LPAD: 它为右对齐的值返回左侧字符值的填充。例如:

输入: SELECT LPAD ('200', 6,'*');

输出 ***200

F) RPAD: 它为左对齐的值返回右侧字符值的填充。例如:

输入: SELECT RPAD ('200', 6,'*');

输出 200***

G) TRIM: 此函数用于从开头、结尾或两者都删除所有定义的字符。它也修剪多余的空格。例如:

输入: SELECT TRIM ('A' FROM 'ABCDCBA');

输出: BCDCB

H) REPLACE: 此函数用于将字符串中所有出现的单词或部分(子字符串)替换为其他指定的字符串值。例如:

输入: SELECT REPLACE ( 'It is the best coffee at the famous coffee shop.', 'coffee', 'tea');

输出: It is the best tea at the famous tea shop.


54) NVL() 函数的用法是什么?

NVL() 函数用于将 NULL 值转换为其他值。如果第一个参数为 NULL,则该函数返回第二个参数的值。如果第一个参数不是 NULL,则它保持不变。此函数在 Oracle 中使用,而不是在 SQL 和 MySQL 中。MySQL 使用 IFNULL() 函数,SQL Server 使用 ISNULL() 函数来代替 NVL() 函数。


55) 在 SQL 中,哪个函数用于返回除法运算中的余数?

MOD 函数返回除法运算中的余数。


56) COALESCE 函数的语法和用途是什么?

COALESCE() 函数按顺序评估参数,并返回指定数量的表达式中的第一个非 NULL 值。如果它将参数评估为 NULL 或未找到任何非 NULL 值,则返回 NULL 结果。

COALESCE 函数的语法如下:

示例

此语句将返回以下输出:

SQL Interview Questions and Answers

阅读更多:Coalesce SQL


57) 我们如何使用 DISTINCT 语句?它的用途是什么?

DISTINCT 关键字用于确保获取的值始终是唯一的。它不允许有重复的值。DISTINCT 关键字与 SELECT 语句一起使用,并从表的列中检索不同的值。我们可以通过以下语法使用它:

假设我们有一个名为 'customer' 的表,其中包含八条记录,其中 name 列有一些重复的值。

SQL Interview Questions and Answers

如果我们想获取没有任何重复值的 name 列,就需要 DISTINCT 关键字。执行以下命令将返回具有唯一值的 name 列。

SQL Interview Questions and Answers

58) 使用 ORDER BY 子句的数据默认排序方式是什么?如何更改它?

ORDER BY 子句用于按升序或降序对表数据进行排序。默认情况下,它会按升序对表进行排序。如果我们想改变其默认行为,需要在 ORDER BY 子句中的列名后使用 DESC 关键字。

执行此操作的语法如下:

我们在前面的示例中采用了一个 customer 表。现在,我们也将对其演示 ORDER BY 子句。

在下面的输出中,我们可以看到第一个查询将根据 name 列按升序对表数据进行排序。但是,如果我们通过指定 DESC 关键字运行第二个查询,表的顺序将更改为降序。

SQL Interview Questions and Answers

阅读更多:SQL ORDER BY 子句


59) 以下查询是否返回输出?

答案: 不。上述查询不返回输出,因为我们不能使用 WHERE 子句来限制分组。我们需要使用 HAVING 子句而不是 WHERE 子句来获取正确的输出。


60) WHERE 和 HAVING 子句有什么区别?

主要区别在于,WHERE 子句用于在建立任何分组之前筛选记录,而 HAVING 子句用于从组中筛选值。以下比较图表解释了最常见的区别:

WHEREHAVING
此子句在行操作中实现。此子句在列操作中实现。
它不允许与聚合函数一起工作。它可以与聚合函数一起工作。
此子句可与 SELECT、UPDATE 和 DELETE 语句一起使用。此子句只能与 SELECT 语句一起使用。

阅读更多:WHERE 和 HAVING 的区别


61) SQL 中有多少个聚合函数?

聚合函数用于确定和计算表中的多个值,并将结果作为单个数字返回。例如,所有值的平均值、所有值的总和,以及特定值分组中的最大值和最小值。

以下语法说明了如何使用聚合函数:

SQL 提供了七 (7) 个聚合函数,如下所示:

  • AVG(): 此函数用于返回指定列的平均值。
  • COUNT(): 此函数用于返回表的行数,包括具有 null 值的行。
  • MAX(): 此函数用于返回组中的最大值。
  • MIN(): 此函数用于返回组中的最小值。
  • SUM(): 此函数用于返回指定列的总和值(非空)。
  • FIRST(): 此函数用于返回表达式的第一个值。
  • LAST(): 此函数用于返回表达式的最后一个值。

阅读更多:SQL 聚合函数


62) 什么是 SQL 注入?

SQL 注入是网站和 Web 应用代码中的一种漏洞,允许攻击者控制后端操作,并从数据库中访问、检索和销毁敏感数据。在这种技术中,恶意的 SQL 语句被插入到数据库的输入字段中,一旦它们被执行,数据库就变得容易受到攻击者的攻击。这种技术通常通过利用数据驱动的应用程序来访问敏感数据并对数据库执行管理活动。它也被称为 SQLi 攻击。

SQL 注入的一些常见示例是:

  • 访问机密数据以修改 SQL 查询以获得期望的结果。
  • 使用 UNION 攻击从不同的数据库表中窃取数据。
  • 检查数据库以提取有关数据库版本和结构的信息。

阅读更多:SQL 注入


63) RANK() 和 DENSE_RANK() 函数有什么区别?

RANK 函数确定结果集中有序分区内每一行的排名。如果两行被分配了相同的排名,那么排名中的下一个数字将是其前一个排名加上重复数字的数量。例如,如果我们有三条记录排名为 4,那么下一个列出的排名将是 7。

DENSE_RANK 函数根据指定的列值为分区内的每一行分配一个唯一的排名,没有任何间隙。它总是按连续顺序指定排名。如果两行被分配了相同的排名,此函数将为它们分配相同的排名,并且下一个排名是下一个顺序数字。例如,如果我们有 3 条记录排名为 4,那么下一个列出的排名将是 5。


64) 是否可以为标识列隐式插入一行?

是的。我们可以为标识列隐式插入一行。下面是一个这样做的例子:


65) 什么是 SQL 注释?

注释是 SQL 查询中供程序员阅读的解释或注解。它用于使 SQL 语句更易于人类理解。在解析 SQL 代码期间,它将被忽略。注释可以写在单行或多行上。

  • 单行注释: 以两个连续的连字符 (--) 开头。
  • 多行注释: 以 /* 开头,以 */ 结尾。

66) 您对 SQL 中的窗口函数有什么理解?

在 SQL 中,窗口函数也称为分析函数,用于对与当前行相关的特定窗口(行集)进行计算。窗口是通过 OVER() 子句定义的行集。窗口函数类似于聚合函数,但聚合函数提供的结果被分组为单个输出,而窗口函数在列中提供结果,其中行将分别可见。它允许分析和比较结果集中可见的行。它是编写高级 SQL 查询的强大函数。

一些常见的窗口函数是 ROW_NUMBER()、RANK()、DENSE_RANK()、SUM()、AVG()、LAG() 和 LEAD()。

阅读更多:SQL 窗口函数


67) 索引的优缺点是什么?

索引是特殊的查找表,可提高从数据库中获取数据的速度。它们主要用于数据库中有大量数据集的情况。当您检索数据时,它会搜索和扫描整个数据库以获取所需数据,这是一项耗时的任务,但索引用于加快搜索和检索数据的过程。

以下是索引的优缺点之间的区别:

索引的优点

  • 更快的检索: 索引允许从数据库中快速搜索和获取数据,从而提供更好的性能并减少搜索时间。
  • 排序数据: 索引对数据集进行排序,并避免在执行时对数据进行排序。
  • 唯一索引: 诸如主键索引唯一索引之类的索引用于从数据库中检索唯一记录,并有助于避免重复的行数据。

索引的缺点

额外的磁盘空间: 这是索引的主要缺点之一,因为它们在数据库中占用大量空间。索引占用的存储空间取决于索引表的大小。在创建索引时,必须注意数据集。

数据修改较慢: 索引会减慢插入数据、更新数据和删除数据等 SQL 查询的速度。当创建大量索引时,它会减慢数据修改的性能。

维护复杂: 当数据库中有大量索引时,维护具有大数据集的数据库变得困难,这会降低数据库性能。

阅读更多:SQL 索引


68) SQL 中的存储过程是什么意思?

SQL 中的存储过程是一个数据库对象,它是一系列预编译的 SQL 命令,在数据库中创建和保存。存储过程可以在需要时被调用和多次运行。它们可以接收输入参数,并根据传递的值立即返回输出。

它们主要用于增强安全性、模块化代码、自动化任务、提高性能和实现业务逻辑。它会一遍又一遍地执行查询,以便在需要时可以重用代码,这有助于减少冗余。它们减少了网络流量,因为有一组查询可以一次性运行多个操作。

存储过程的语法

执行存储过程的语法

EXEC procedure_name;

阅读更多:SQL 存储过程


69) SQL 中的触发器是什么意思?

SQL 中的触发器是一个数据库对象,它包含 SQL 逻辑,即一组指令。当数据库中发生特定事件时,此 SQL 逻辑会自动运行。它们在幕后静默执行,不影响原始数据。触发器是与表关联的特殊类型的存储过程。我们可以创建一个新表来存储触发器执行获得的结果。

它们用于在数据库中插入和更新之前验证数据。它们用于自动执行业务规则。它们用于维护数据库的一致性。

语法

阅读更多:SQL 中的触发器


70) SQL 中有哪些类型的触发器?

SQL 中有以下几种类型的触发器:

1. DML 触发器: 这种类型的触发器是一个存储过程,用于强制执行业务规则和数据一致性。它包括与 DML 触发器一起使用的 INSERT、DELETE 或 UPDATE 命令。

DML 触发器的类型

  1. AFTER 触发器: 以下是三种类型的 AFTER 触发器:
    • AFTER INSERT 触发器: 当新行插入表中时,此触发器会自动执行数据库操作。
    • AFTER DELETE 触发器: 当从表中删除值时,此触发器会自动执行数据库操作。
    • AFTER UPDATE 触发器: 当更新表中的值时,此触发器会自动执行数据库操作。
  2. INSTEAD OF 触发器: 以下是三种类型的 INSTEAD OF 触发器:
    • INSTEAD OF INSERT 触发器: 此触发器在视图中自动执行插入操作。
    • INSTEAD OF DELETE 触发器: 此触发器在视图中自动执行删除操作。
    • INSTEAD OF UPDATE 触发器: 此触发器在视图中自动执行更新操作。

2. DDL 触发器: 这种类型的触发器是一个存储过程,包括 CREATE、ALTER 和 DROP 等命令。此触发器用于检查用户是否有权在数据库上执行这些命令。

3. 登录触发器: 这种类型的命令用于监视用户会话并限制用户对数据库的访问。这些触发器用于检查登录活动或限制会话数量。


高级 SQL MCQ 问题与答案

本节提供基于高级查询优化的多项选择题和答案。

1) 当您想包含值不匹配的行时,需要哪种类型的连接?

  1. 等值连接
  2. Outer Join
  3. 自然连接
  4. 以上全部。
 

答案:b

解释: 外连接返回所有匹配指定条件的行,包括一个或两个表中不匹配的行。因此,选项 (B) 是正确答案,因为外连接是唯一可以显示不匹配记录的连接。

2) 以下哪个选项与 CASE SQL 语句匹配?

  1. 一种在 SQL 中建立 IF-THEN-ELSE 的方法。
  2. 一种在 SQL 中建立循环的方法。
  3. 一种在 SQL 中建立数据定义的方法。
  4. 以上都不是。
 

答案:a

解释: CASE 表达式是一个控制流函数,它评估一组条件,并在第一个条件满足时显示输出。它主要用于处理条件语句,与其他编程语言中的 IF-THEN-ELSE 语句相同。因此,选项 (A) 是正确答案。

3) 以下哪个是 SQL 中的非法数据类型?

  1. NUMBER
  2. CLOB
  3. BLOB
  4. LINT
 

答案:d

解释:NUMBER 数据类型用于定义精确或近似的数值。CLOB 代表字符大对象,用于存储大量文本数据。BLOB 代表二进制大对象,充当对文件、图像、视频等对象的引用或指针。LINT 是一个 SQL 方言检查器。它会突出显示错误,解释错误的原因、可能的原因以及开发人员可以如何修复它们。因此选项 (D) 是正确答案。

4) 如果视图定义中使用的实际关系发生变化,视图会立即更新。这些视图被称为_________。

  1. 即时视图
  2. 瞬时视图
  3. 物化视图
  4. 唯物主义视图
 

答案:c

解释: 物化视图是存储在磁盘上的表,包含查询结果集中的数据。它有助于保持数据库的最新状态。当视图定义中使用的实际关系发生变化,并且视图立即更新时,这些视图被称为物化视图。

5) SQL 中处理 SQL 支持结构的部分被称为 _______。

  1. 持久结构经销商
  2. 持久支持中心
  3. 主存储介质
  4. 持久化存储模块
 

答案:d

解释: 持久化存储模块 (SQL/PSM) 是一项功能,允许用户通过自己的附加功能来扩展基本的 SQL 功能。

6) 关于相关子查询,以下哪项是正确的?

  1. 使用外部查询的结果来决定内部查询的处理。
  2. 使用内部查询的结果来决定外部查询的处理。
  3. 使用内部查询的结果来决定内部查询的处理。
  4. 使用外部查询的结果来决定外部查询的处理。
 

答案:a

解释: 相关子查询用于逐行处理。它引用外部查询中的一列,并对外部查询(父语句,如 SELECT、UPDATE 或 DELETE 语句)处理的每一行求值一次。另一方面,非相关子查询会先对子查询求值,然后再决定外部查询的处理。

7) 每当数据库被修改时,系统都会执行一个名为 _________ 的语句。

  1. 函数
  2. 诱因
  3. 协议
 

答案:b

解释: 触发器是一组位于系统目录中的 SQL 查询。它是一种特殊类型的存储过程,为响应某个事件而自动调用。因此,选项 (B) 是正确的,因为触发器是系统在数据库被修改时执行的语句。

8) 事务在何时开始

  1. 发出 COMMIT 语句时
  2. 发出 ROLLBACK 语句时
  3. 使用 CREATE 语句时
  4. 以上全部。
 

答案:d

解释: 事务既有开始语句,也有结束语句。当发生以下事件之一时,事务开始:CREATE、COMMIT、ROLLBACK 等。因此选项 (D) 是正确的。

9) 以下哪个顺序语句不能在函数中使用?

  1. IF
  2. WAIT
  3. CASE
  4. LOOP
 

答案:b

解释: 函数可以使用任何类型的顺序语句,例如 IF、CASE、LOOP、NEXT、EXIT 或 NULL 语句。但是,它有一个例外:不允许使用 WAIT 语句,因为它不能在函数内部使用。WAIT 语句用于调度系统工作。

10) 在数据类型 TIME(p) 中,p 代表什么?

  1. 需要添加到时间中的延迟量
  2. 允许的最大小时数
  3. 秒的小数位数
  4. 以上都不是
 

答案:c

解释: SQL TIME 数据类型使用 24 小时制表示一天中的时间。p 表示秒的小数部分的位数。其值范围为 0 到 7。如果我们不指定 p,它将默认为 7。因此选项 (C) 是正确答案。

11) 以下哪项是 SQL 标准中的一种权限?

  1. SELECT
  2. INSERT
  3. UPDATE
  4. 以上全部。
 

答案:d

解释: 权限允许用户对特定的数据库对象执行一系列活动。权限分为两类

  • 系统权限:这表示用户有能力 CREATE、ALTER 或 "DROP" 数据库组件。
  • 对象权限:这使用户能够通过权限对数据库对象执行 EXECUTE、SELECT、INSERT 或 DELETE 数据操作。

12) 以下哪项表示参照完整性约束的另一个名称?

  1. 函数依赖
  2. 子集依赖
  3. 超集依赖
  4. 主依赖
 

答案:b

解释: 参照完整性指定了两个表之间的关系。每个表都必须有一个主键。它也被称为子集依赖,因为表2中表1的外键值集合必须是表2中主键值集合的子集。

13) 触发器是存储的代码块,必须被调用才能运行。

  1. TRUE
  2. FALSE
 

答案:b

解释: 选项 (B) 是正确的,因为触发器是一组 SQL 语句,以唯一的名称驻留在系统内存中,并在数据库服务器事件发生时自动执行。

14) 外连接与等值连接相同,只是结果表中重复的一列被移除。

  1. TRUE
  2. FALSE
 

答案:b

解释: 等值连接是使用等于比较运算符来匹配两个表的键的连接。相反,外连接是一种连接,其中一个表中没有在另一个表中有匹配行的行会被选中,未知列的值为 NULL。

15) 事务是密切相关的更新命令的集合,为了使数据库有效,这些命令必须全部完成,或者全部不完成。

  1. TRUE
  2. FALSE
 

答案:a

解释: 事务是在数据库中执行单个或多个任务的一组语句。在 SQL 中,每个事务必须发生两件事之一

  • 要么在事务提交时所有修改都成功。
  • 要么在事务回滚时所有修改都被撤销。