SQL语法基础知识总结
> 本文整理完善自下面这两份资料: > > - [SQL 语法速成手册](https://juejin.cn/post/6844903790571700231) > - [MySQL 超全教程](ht
本文整理完善自下面这两份资料: SQL 语法速成手册 MySQL 超全教程 基本概念 数据库术语 保存有组织的数据的容器(通常是一个文件或一组文件)。 某种特定类型数据的结构化清单。 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。 表中的一个字段。所有表都是由一个或多个列组成的。 表中的一个记录。 一列(或一组列),其值能够唯一标识表中每一行。 SQL 语法 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact SQL 等。 SQL 语法结构 SQL 语法结构包括: 是语句和查询的组成成分。(在某些情况下,这些都是可选的。) 可以产生任何标量值,或由列和行的数据库表 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。 基于特定条件检索数据。这是 SQL 的一个重要组成部分。 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。 SQL 语法要点 SQL 语句不区分大小写 ,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。例如: 与 、 是相同的。 多条 SQL 语句必须以分号( )分隔 。 处理 SQL 语句时, 所有空格都被忽略 。 SQL 语句可以写成一行,也可以分写为多行。 SQL 支持三种注释: SQL 分类 数据定义语言(DDL) 数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。 DDL 的主要功能是 定义数据库对象 。 DDL 的核心指令是 、 、 。 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。 DML 的主要功能是 访问数据 ,因此其语法都是以 读写数据库 为主。 DML 的核心指令是 、 、 、 。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。 事务控制语言(TCL) 事务控制语言 (Transaction Control Language, TCL) 用于 管理数据库中的事务 。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。 TCL 的核心指令是 、 。 数据控制语言(DCL) 数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。 DCL 的核心指令是 、 。 DCL 以 控制用户的访问权限 为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有: 、 、 、 、 、 、 、 。 根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同。 我们先来介绍 DML 语句用法。 DML 的主要功能是读写数据库实现增删改查。 增删改查 增删改查,又称为 CRUD,数据库基本操作中的基本操作。 插入数据 语句用于向表中插入新记录。 插入完整的行 插入行的一部分 插入查询出来的数据 更新数据 语句用于更新表中的记录。 删除数据 语句用于删除表中的记录。 可以清空表,也就是删除所有行。说明: 语句不属于 DML 语法而是 DDL 语法。 删除表中的指定数据 清空表中的数据 查询数据 语句用于从数据库中查询数据。 用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。 :升序(默认) :降序 查询单列 查询多列 查询所有列 查询不同的值 限制查询结果 排序 用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,可以使用 关键字。 对多列排序的时候,先排序的列放前面,后排序的列放后面。并且,不同的列可以有不同的排序规则。 分组 : 子句将记录分组到汇总行中。 为每个组返回一个记录。 通常还涉及聚合 , , , 等。 可以按一列或多列进行分组。 按分组字段进行排序后, 可以以汇总字段来进行排序。 分组 分组后排序 : 用于对汇总的 结果进行过滤。 一般都是和 连用。 和 可以在相同的查询中。 使用 WHERE 和 HAVING 过滤数据 vs : :过滤过滤指定的行,后面不能加聚合函数(分组函数)。 在 前。 :过滤分组,一般都是和 连用,不能单独使用。 在 之后。 子查询 子查询是嵌套在较大查询中的 SQL 查询,也称内部查询或内部选择,包含子查询的语句也称为外部查询或外部选择。简单来说,子查询就是指将一个 查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。 子查询可以嵌入 、 、 和 语句中,也可以和 、 、 、 、 、 等运算符一起使用。 子查询常用在 子句和 子句后边: 当用于 子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 子句查询条件的值。 当用于 子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合 后面是表的规则。这种做法能够实现多表联合查询。 注意:MYSQL 数据库从 4.1 版本才开始支持子查询,早期版本是不支持的。 用于 子句的子查询的基本语法如下: 子查询需要放在括号 内。 表示用于 where 子句的运算符。 用于 子句的子查询的基本语法如下: 用于 的子查询返回的结果相当于一张临时表,所以需要使用 AS 关键字为该临时表起一个名字。 子查询的子查询 内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询。执行过程可以参考下图: WHERE 子句用于过滤记录,即缩小访问数据的范围。 后跟一个返回 或 的条件。 可以与 , 和 一起使用。 可以在 子句中使用的操作符。 | 运算符 | 描述 | | | | | = | 等于 | | < | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != | | | 大于 | | < | 小于 | | = | 大于等于 | | <= | 小于等于 | | BETWEEN | 在某个范围内 | | LIKE | 搜索某种模式 | | IN | 指定针对某个列的多个可能值 | 语句中的 子句 语句中的 子句 语句中的 子句 IN 和 BETWEEN 操作符在 子句中使用,作用是在指定的几个特定值中任选一个值。 操作符在 子句中使用,作用是选取介于某个范围内的值。 IN 示例 BETWEEN 示例 AND、OR、NOT 、 、 是用于对过滤条件的逻辑处理指令。 优先级高于 ,为了明确处理顺序,可以使用 。 操作符表示左右条件都要满足。 操作符表示左右条件满足任意一个即可。 操作符用于否定一个条件。 AND 示例 OR 示例 NOT 示例 LIKE 操作符在 子句中使用,作用是确定字符串是否匹配模式。 只有字段是文本值时才使用 。 支持两个通配符匹配选项: 和 。 不要滥用通配符,通配符位于开头处匹配会非常慢。 表示任何字符出现任意次数。 表示任何字符出现一次。 % 示例 \ 示例 连接 JOIN 是“连接”的意思,顾名思义,SQL JOIN 子句用于将两个或者多个表联合起来进行查询。 连接表时需要在每个表中选择一个字段,并对这些字段的值进行比较,值相同的两条记录将合并为一条。 连接表的本质就是将不同表的记录合并起来,形成一张新表。当然,这张新表只是临时的,它仅存在于本次查询期间 。 使用 连接两个表的基本语法如下: 是连接条件,只有满足此条件的记录才会合并为一行。您可以使用多个运算符来连接表,例如 =、 、<、< 、<=、 =、!=、 、 或者 ,但是最常见的是使用 =。 当两个表中有同名的字段时,为了帮助数据库引擎区分是哪个表的字段,在书写同名字段名时需要加上表名。当然,如果书写的字段名在两个表中是唯一的,也可以不使用以上格式,只写字段名即可。 另外,如果两张表的关联字段名相同,也可以使用 子句来代替 ,举个例子: 和 的区别 : 连接表时,SQL 会根据连接条件生成一张新的临时表。 就是连接条件,它决定临时表的生成。 是在临时表生成以后,再对临时表中的数据进行过滤,生成最终的结果集,这个时候已经没有 JOIN ON 了。 所以总结来说就是: SQL 先根据 ON 生成一张临时表,然后再根据 WHERE 对临时表进行筛选 。 SQL 允许在 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示: | 连接类型 | 说明 | | | | | INNER JOIN 内连接 | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 | | LEFT JOIN / LEFT OUTER JOIN 左(外)连接 | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 | | RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 | | FULL JOIN / FULL OUTER JOIN 全(外)连接 | 只要其中有一个表存在满足条件的记录,就返回行。 | | SELF JOIN | 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 | | CROSS JOIN | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 | 下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。 如果不加任何修饰词,只写 ,那么默认为 对于 来说,还有一种隐式的写法,称为 “ 隐式内连接 ”,也就是没有 关键字,使用 语句实现内连接的功能 组合 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 中参与查询的提取行。 基本规则: 所有查询的列数和列顺序必须相同。 每个查询中涉及表的列的数据类型必须相同或兼容。 通常返回的列名取自第一个查询。 默认地, 操作符选取不同的值。如果允许重复的值,请使用 。 结果集中的列名总是等于 中第一个 语句中的列名。 vs : 中连接表的列可能不同,但在 中,所有查询的列数和列顺序必须相同。 将查询之后的行放在一起(垂直放置),但 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。 函数 不同数据库的函数往往各不相同,因此不可移植。本节主要以 MySQL 的函数为例。 文本处理 | 函数 | 说明 | | | | | 、 | 左边或者右边的字符 | | 、 | 转换为小写或者大写 | | 、 | 去除左边或者右边的空格 | | | 长度,以字节为单位 | | | 转换为语音值 | 其中, 可以将一个字符串转换为描述其语音表示的字母数字模式。 日期和时间处理 日期格式: 时间格式: | 函 数 | 说 明 | | | | | | 增加一个日期(天、周等) | | | 增加一个时间(时、分等) | | | 返回当前日期 | | | 返回当前时间 | | | 返回日期时间的日期部分 | | | 计算两个日期之差 | | | 高度灵活的日期运算函数 | | | 返回一个格式化的日期或时间串 | | | 返回一个日期的天数部分 | | | 对于一个日期,返回对应的星期几 | | | 返回一个时间的小时部分 | | | 返回一个时间的分钟部分 | | | 返回一个日期的月份部分 | | | 返回当前日期和时间 | | | 返回一个时间的秒部分 | | | 返回一个日期时间的时间部分 | | | 返回一个日期的年份部分 | 数值处理 | 函数 | 说明 | | | | | SIN() | 正弦 | | COS() | 余弦 | | TAN() | 正切 | | ABS() | 绝对值 | | SQRT() | 平方根 | | MOD() | 余数 | | EXP() | 指数 | | PI() | 圆周率 | | RAND() | 随机数 | 汇总 | 函 数 | 说 明 | | | | | | 返回某列的平均值 | | | 返回某列的行数 | | | 返回某列的最大值 | | | 返回某列的最小值 | | | 返回某列值之和 | 会忽略 NULL 行。 使用 可以让汇总函数值汇总不同的值。 接下来,我们来介绍 DDL 语句用法。DDL 的主要功能是定义数据库对象(如:数据库、数据表、视图、索引等) 数据定义 数据库(DATABASE) 创建数据库 删除数据库 选择数据库 数据表(TABLE) 创建数据表 普通创建 根据已有的表创建新表 删除数据表 修改数据表 添加列 删除列 修改列 添加主键 删除主键 视图(VIEW) 定义: 视图是基于 SQL 语句的结果集的可视化的表。 视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。 作用: 简化复杂的 SQL 操作,比如复杂的联结; 只使用实际表的一部分数据; 通过只给用户访问视图的权限,保证数据的安全性; 更改数据格式和表示。 创建视图 删除视图 索引(INDEX) 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。 优点 : 使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 缺点 : 创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。 索引需要使用物理文件存储,也会耗费一定空间。 但是, 使用索引一定能提高查询性能吗? 大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。 关于索引的详细介绍,请看我写的 MySQL 索引详解 这篇文章。 创建索引 添加索引 创建唯一索引 删除索引 约束 SQL 约束用于规定表中的数据规则。 如果存在违反约束的数据行为,行为会被约束终止。 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。 约束类型: 指示某列不能存储 NULL 值。 保证某列的每行必须有唯一的值。 NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。 保证一个表中的数据匹配另一个表中的值的参照完整性。 保证列中的值符合指定的条件。 规定没有给列赋值时的默认值。 创建表时使用约束条件: 接下来,我们来介绍 TCL 语句用法。TCL 的主要功能是管理数据库中的事务。 事务处理 不能回退 语句,回退 语句也没意义;也不能回退 和 语句。 MySQL 默认是隐式提交 ,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 语句时,会关闭隐式提交;当 或 语句执行后,事务会自动关闭,重新恢复隐式提交。 通过 可以取消自动提交,直到 才会提交; 标记是针对每个连接而不是针对服务器的。 指令: 指令用于标记事务的起始点。 指令用于创建保留点。 指令用于回滚到指定的保留点;如果没有设置保留点,则回退到 语句处。 提交事务。 接下来,我们来介绍 DCL 语句用法。DCL 的主要功能是控制用户的访问权限。 权限控制 要授予用户帐户权限,可以用 命令。要撤销用户的权限,可以用 命令。这里以 MySQL 为例,介绍权限控制实际应用。 授予权限语法: 简单解释一下: 1. 在 关键字后指定一个或多个权限。如果授予用户多个权限,则每个权限由逗号分隔。 2. 确定权限应用级别。MySQL 支持 global( ),database( ),table( )和列级别。如果使用列权限级别,则必须在每个权限之后指定一个或逗号分隔列的列表。 3. 是要授予权限的用户。如果用户已存在,则 语句将修改其权限。否则, 语句将创建一个新用户。可选子句 允许您为用户设置新的密码。 4. 指定用户是否必须通过 SSL,X059 等安全连接连接到数据库服务器。 5. 可选 子句允许您授予其他用户或从其他用户中删除您拥有的权限。此外,您可以使用 子句分配 MySQL 数据库服务器的资源,例如,设置用户每小时可以使用的连接数或语句数。这在 MySQL 共享托管等共享环境中非常有用。 撤销权限语法: 简单解释一下: 1. 在 关键字后面指定要从用户撤消的权限列表。您需要用逗号分隔权限。 2. 指定在 子句中撤销特权的特权级别。 3. 指定要撤消 子句中的权限的用户帐户。 和 可在几个层次上控制访问权限: 整个服务器,使用 和 ; 整个数据库,使用 ; 特定的表,使用 ; 特定的列; 特定的存储过程。 新创建的账户没有任何权限。账户用 的形式定义, 使用的是默认主机名。MySQL 的账户信息保存在 mysql 这个数据库中。 下表说明了可用于 和 语句的所有允许权限: | 特权 | 说明 | 级别 | | | | | | | | | | | | | | | | 全局 | 数据库 | 表 | 列 | 程序 | 代理 | | | | ALL [PRIVILEGES] | 授予除 GRANT OPTION 之外的指定访问级别的所有权限 | | | | | | | | ALTER | 允许用户使用 ALTER TABLE 语句 | X | X | X | | | | | ALTER ROUTINE | 允许用户更改或删除存储的例程 | X | X | | | X | | | CREATE | 允许用户创建数据库和表 | X | X | X | | | | | CREATE ROUTINE | 允许用户创建存储的例程 | X | X | | | | | | CREATE TABLESPACE | 允许用户创建,更改或删除表空间和日志文件组 | X | | | | | | | CREATE TEMPORARY TABLES | 允许用户使用 CREATE TEMPORARY TABLE 创建临时表 | X | X | | | | | | CREATE USER | 允许用户使用 CREATE USER,DROP USER,RENAME USER 和 REVOKE ALL PRIVILEGES 语句。 | X | | | | | | | CREATE VIEW | 允许用户创建或修改视图。 | X | X | X | | | | | DELETE | 允许用户使用 DELETE | X | X | X | | | | | DROP | 允许用户删除数据库,表和视图 | X | X | X | | | | | EVENT | 启用事件计划程序的事件使用。 | X | X | | | | | | EXECUTE | 允许用户执行存储的例程 | X | X | X | | | | | FILE | 允许用户读取数据库目录中的任何文件。 | X | | | | | | | GRANT OPTION | 允许用户拥有授予或撤消其他帐户权限的权限。 | X | X | X | | X | X | | INDEX | 允许用户创建或删除索引。 | X | X | X | | | | | INSERT | 允许用户使用 INSERT 语句 | X | X | X | X | | | | LOCK TABLES | 允许用户对具有 SELECT 权限的表使用 LOCK TABLES | X | X | | | | | | PROCESS | 允许用户使用 SHOW PROCESSLIST 语句查看所有进程。 | X | | | | | | | PROXY | 启用用户代理。 | | | | | | | | REFERENCES | 允许用户创建外键 | X | X | X | X | | | | RELOAD | 允许用户使用 FLUSH 操作 | X | | | | | | | REPLICATION CLIENT | 允许用户查询以查看主服务器或从属服务器的位置 | X | | | | | | | REPLICATION SLAVE | 允许用户使用复制从属从主服务器读取二进制日志事件。 | X | | | | | | | SELECT | 允许用户使用 SELECT 语句 | X | X | X | X | | | | SHOW DATABASES | 允许用户显示所有数据库 | X | | | | | | | SHOW VIEW | 允许用户使用 SHOW CREATE VIEW 语句 | X | X | X | | | | | SHUTDOWN | 允许用户使用 mysqladmin shutdown 命令 | X | | | | | | | SUPER | 允许用户使用其他管理操作,例如 CHANGE MASTER TO,KILL,PURGE BINARY LOGS,SET GLOBAL 和 mysqladmin 命令 | X | | | | | | | TRIGGER | 允许用户使用 TRIGGER 操作。 | X | X | X | | | | | UPDATE | 允许用户使用 UPDATE 语句 | X | X | X | X | | | | USAGE | 相当于“没有特权” | | | | | | | 创建账户 修改账户名 删除账户 查看权限 授予权限 删除权限 更改密码 存储过程 存储过程可以看成是对一系列 SQL 操作的批处理。存储过程可以由触发器,其他存储过程以及 Java, Python,PHP 等应用程序调用。 使用存储过程的好处: 代码封装,保证了一定的安全性; 代码复用; 由于是预先编译,因此具有很高的性能。 创建存储过程: 命令行中创建存储过程需要自定义分隔符,因为命令行是以 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误。 包含 、 和 三种参数。 给变量赋值都需要用 语句。 每次只能给一个变量赋值,不支持集合的操作。 需要注意的是: 阿里巴巴《Java 开发手册》强制禁止使用存储过程。因为存储过程难以调试和扩展,更没有移植性。 至于到底要不要在项目中使用,还是要看项目实际需求,权衡好利弊即可! 创建存储过程 使用存储过程 游标 游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 语句,而是被该语句检索出来的结果集。 在存储过程中使用游标可以对一个结果集进行移动遍历。 游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。 使用游标的几个明确步骤: 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据, 它只是定义要使用的 语句和游标选项。 一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT 语句把数据实际检索出来。 对于填有数据的游标,根据需要取出(检索)各行。 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具 体的 DBMS)。 触发器 触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。 我们可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。 使用触发器的优点: SQL 触发器提供了另一种检查数据完整性的方法。 SQL 触发器可以捕获数据库层中业务逻辑中的错误。 SQL 触发器提供了另一种运行计划任务的方法。通过使用 SQL 触发器,您不必等待运行计划任务,因为在对表中的数据进行更改之前或之后会自动调用触发器。 SQL 触发器对于审计表中数据的更改非常有用。 使用触发器的缺点: SQL 触发器只能提供扩展验证,并且不能替换所有验证。必须在应用程序层中完成一些简单的验证。例如,您可以使用 JavaScript 在客户端验证用户的输入,或者使用服务器端脚本语言(如 JSP,PHP,ASP.NET,Perl)在服务器端验证用户的输入。 从客户端应用程序调用和执行 SQL 触发器是不可见的,因此很难弄清楚数据库层中发生了什么。 SQL 触发器可能会增加数据库服务器的开销。 MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。 注意:在 MySQL 中,分号 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。 这时就会用到 命令(DELIMITER 是定界符,分隔符的意思)。它是一条命令,不需要语句结束标识,语法为: 。 可以设为 1 个或多个长度的符号,默认的是分号 ,我们可以把它修改为其他符号,如 。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 ,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。 在 MySQL 5.7.2 版之前,可以为每个表定义最多六个触发器。 在将数据插入表格之前激活。 将数据插入表格后激活。 在更新表中的数据之前激活。 更新表中的数据后激活。 在从表中删除数据之前激活。 从表中删除数据后激活。 但是,从 MySQL 版本 5.7.2+开始,可以为同一触发事件和操作时间定义多个触发器。 和 : MySQL 中定义了 和 关键字,用来表示触发器的所在表中,触发了触发器的那一行数据。 在 型触发器中, 用来表示将要( )或已经( )插入的新数据; 在 型触发器中, 用来表示将要或已经被修改的原数据, 用来表示将要或已经修改为的新数据; 在 型触发器中, 用来表示将要或已经被删除的原数据; 使用方法: (columnName 为相应数据表某一列名) 创建触发器 提示:为了理解触发器的要点,有必要先了解一下创建触发器的指令。 指令用于创建触发器。 语法: 说明: :触发器名 : 触发器的触发时机。取值为 或 。 : 触发器的监听事件。取值为 、 或 。 : 触发器的监听目标。指定在哪张表上建立触发器。 : 行级监视,Mysql 固定写法,其他 DBMS 不同。 : 触发器执行动作。是一条或多条 SQL 语句的列表,列表内的每条语句都必须用分号 来结尾。 当触发器的触发条件满足时,将会执行 和 之间的触发器执行动作。 示例: 查看触发器 删除触发器 文章推荐 后端程序员必备:SQL 高性能优化指南!35+条优化建议立马 GET! 后端程序员必备:书写高质量 SQL 的 30 条建议 写在最后 如果内容对你有帮助的话,欢迎顺手给 JavaGuide 点一个免费的 Star 支持一下:GitHub | Gitee。 JavaGuide 已持续维护近七年,累计 6100+ 次提交,来自 620+ 位贡献者共同完善。你的 Star、反馈和 PR,都是这个项目继续更新的动力。 如果你正在准备后端/AI 应用开发面试,也可以了解一下我的知识星球,里面包括后端和 AI 实战项目、简历优化、一对一提问和高频考点资料,已经持续维护六年。