MySQL所有关键字详细含义说明
文章目录
- MySQL所有关键字详细含义说明`
- 一、MySQL关键字概述
- 二、数据库操作关键字
- 1. CREATE DATABASE - 创建数据库
- 2. DROP DATABASE - 删除数据库
- 3. USE - 选择数据库
- 4. SHOW DATABASES - 查看所有数据库
- 三、表操作关键字
- 1. CREATE TABLE - 创建表
- 2. DROP TABLE - 删除表
- 3. ALTER TABLE - 修改表结构
- 4. TRUNCATE TABLE - 清空表
- 5. SHOW TABLES - 查看所有表
- 6. DESCRIBE / DESC - 查看表结构
- 四、数据查询关键字 (SELECT语句)
- 1. SELECT - 选择数据
- 2. FROM - 指定数据来源
- 3. WHERE - 过滤数据
- 4. ORDER BY - 排序数据
- 5. LIMIT - 限制结果数量
- 6. DISTINCT - 去重
- 7. AS - 列别名/表别名
- 8. GROUP BY - 分组查询
- 9. HAVING - 分组后过滤
- 10. WITH - 公共表表达式(CTE)
- 五、数据操作关键字 (DML)
- 1. INSERT - 插入数据
- 2. UPDATE - 更新数据
- 3. DELETE - 删除数据
- 4. REPLACE - 替换数据
- 5. LOAD DATA INFILE - 批量导入数据
- 六、表连接关键字 (JOIN)
- 1. INNER JOIN - 内连接
- 2. LEFT JOIN / LEFT OUTER JOIN - 左连接
- 3. RIGHT JOIN / RIGHT OUTER JOIN - 右连接
- 4. CROSS JOIN - 交叉连接
- 5. UNION / UNION ALL - 合并结果集
- 七、子查询关键字
- 1. IN / NOT IN - 在/不在指定集合内
- 2. EXISTS / NOT EXISTS - 存在/不存在
- 3. ANY / SOME / ALL - 比较子查询结果
- 八、索引关键字
- 1. CREATE INDEX - 创建索引
- 2. DROP INDEX - 删除索引
- 3. ALTER TABLE ... ADD INDEX - 添加索引
- 4. SHOW INDEX - 查看索引
- 九、视图关键字
- 1. CREATE VIEW - 创建视图
- 2. DROP VIEW - 删除视图
- 3. ALTER VIEW - 修改视图
- 十、存储过程与函数关键字
- 1. CREATE PROCEDURE - 创建存储过程
- 2. CREATE FUNCTION - 创建存储函数
- 3. CALL - 调用存储过程
- 4. DROP PROCEDURE / DROP FUNCTION - 删除存储过程/函数
- 十一、触发器关键字
- 1. CREATE TRIGGER - 创建触发器
- 2. DROP TRIGGER - 删除触发器
- 十二、事务控制关键字
- 1. START TRANSACTION / BEGIN - 开始事务
- 2. COMMIT - 提交事务
- 3. ROLLBACK - 回滚事务
- 4. SAVEPOINT - 设置保存点
- 5. RELEASE SAVEPOINT - 释放保存点
- 十三、MySQL特有关键字
- 1. AUTO_INCREMENT - 自动增长
- 2. LIMIT - 限制结果集
- 3. ON DUPLICATE KEY UPDATE - 重复键更新
- 4. INSERT IGNORE - 忽略重复插入
- 5. VALUES - 访问新插入的值
- 6. DELIMITER - 定义分隔符
- 7. ENGINE - 指定存储引擎
- 8. CHARSET / CHARACTER SET - 指定字符集
- 十四、MySQL关键字使用注意事项
- 十五、MySQL关键字速查表
- 数据定义语言(DDL)
- 数据操作语言(DML)
- 数据控制语言(DCL)
- 事务控制
- MySQL特有关键字
MySQL所有关键字详细含义说明`
一、MySQL关键字概述
MySQL关键字是MySQL数据库系统中具有特殊意义的保留字,用于执行特定的数据库操作或定义数据库对象。这些关键字不能用作表名、列名或其他数据库对象的名称,除非使用反引号(`)括起来。
本教程将全面介绍MySQL中常用的关键字,按照功能分类,并提供每个关键字的详细含义、语法和示例,帮助初学者系统学习MySQL。
二、数据库操作关键字
1. CREATE DATABASE - 创建数据库
含义:创建一个新的数据库。
语法:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集名称] [COLLATE 排序规则];
参数说明:
IF NOT EXISTS
:可选,如果数据库已存在则不报错CHARACTER SET
:可选,指定数据库的字符集COLLATE
:可选,指定数据库的排序规则
示例:
-- 创建名为company的数据库
CREATE DATABASE company;-- 创建时检查是否存在,避免重复创建报错
CREATE DATABASE IF NOT EXISTS company;-- 创建指定字符集和排序规则的数据库
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. DROP DATABASE - 删除数据库
含义:删除一个已存在的数据库(谨慎使用!)。
语法:
DROP DATABASE [IF EXISTS] 数据库名;
参数说明:
IF EXISTS
:可选,如果数据库不存在则不报错
示例:
-- 删除test_db数据库
DROP DATABASE test_db;-- 删除时检查是否存在,避免不存在时报错
DROP DATABASE IF EXISTS test_db;
3. USE - 选择数据库
含义:指定当前会话使用的数据库。
语法:
USE 数据库名;
示例:
-- 选择company数据库作为当前操作的数据库
USE company;
4. SHOW DATABASES - 查看所有数据库
含义:显示服务器上所有可用的数据库。
语法:
SHOW DATABASES [LIKE '模式'];
示例:
-- 列出所有数据库
SHOW DATABASES;-- 只列出以'test'开头的数据库
SHOW DATABASES LIKE 'test%';
三、表操作关键字
1. CREATE TABLE - 创建表
含义:在当前数据库中创建一个新表。
语法:
CREATE TABLE [IF NOT EXISTS] 表名 (列名1 数据类型 [约束],列名2 数据类型 [约束],...[表级约束]
) [表选项];
常用约束:
PRIMARY KEY
:主键,唯一标识表中的记录NOT NULL
:列值不能为空AUTO_INCREMENT
:数值自动增长(MySQL特有)UNIQUE
:列值必须唯一DEFAULT
:设置默认值FOREIGN KEY
:外键,建立表之间的关系
示例:
-- 创建员工表
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT CHECK (age > 18),department_id INT,hire_date DATE DEFAULT CURRENT_DATE,FOREIGN KEY (department_id) REFERENCES departments(id)
);
2. DROP TABLE - 删除表
含义:删除数据库中的一个或多个表(谨慎使用!)。
语法:
DROP TABLE [IF EXISTS] 表名1 [, 表名2, ...];
示例:
-- 删除temp表
DROP TABLE temp;-- 删除多个表
DROP TABLE IF EXISTS temp1, temp2;
3. ALTER TABLE - 修改表结构
含义:修改已存在表的结构,如添加、修改或删除列、索引、约束等。
语法:
-- 添加列
ALTER TABLE 表名 ADD [COLUMN] 列名 数据类型 [约束];-- 修改列类型
ALTER TABLE 表名 MODIFY [COLUMN] 列名 新数据类型 [约束];-- 修改列名和类型(MySQL特有语法)
ALTER TABLE 表名 CHANGE [COLUMN] 旧列名 新列名 数据类型 [约束];-- 删除列
ALTER TABLE 表名 DROP [COLUMN] 列名;-- 添加主键
ALTER TABLE 表名 ADD PRIMARY KEY (列名);-- 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
示例:
-- 向employees表添加email列
ALTER TABLE employees ADD COLUMN email VARCHAR(100) UNIQUE;-- 修改email列的长度
ALTER TABLE employees MODIFY COLUMN email VARCHAR(255);-- 将email列改名为work_email
ALTER TABLE employees CHANGE COLUMN email work_email VARCHAR(255);
4. TRUNCATE TABLE - 清空表
含义:删除表中所有数据,但保留表结构(速度比DELETE快)。
语法:
TRUNCATE TABLE 表名;
示例:
-- 清空employees表中的所有数据
TRUNCATE TABLE employees;
5. SHOW TABLES - 查看所有表
含义:显示当前数据库中的所有表。
语法:
SHOW TABLES [LIKE '模式'];
示例:
-- 列出当前数据库中的所有表
SHOW TABLES;-- 只列出以'user'开头的表
SHOW TABLES LIKE 'user%';
6. DESCRIBE / DESC - 查看表结构
含义:显示表的结构,包括列名、数据类型、是否可为空、默认值等信息。
语法:
DESCRIBE 表名;
-- 或简写为
DESC 表名;
示例:
-- 查看employees表的结构
DESC employees;
四、数据查询关键字 (SELECT语句)
1. SELECT - 选择数据
含义:从一个或多个表中选取数据。
语法:
SELECT 列名1, 列名2, ... FROM 表名 [WHERE 条件] [其他子句];-- 选择所有列
SELECT * FROM 表名;
示例:
-- 选择employees表中的name和age列
SELECT name, age FROM employees;-- 选择所有列
SELECT * FROM employees;
2. FROM - 指定数据来源
含义:指定要查询数据的表。
语法:
SELECT 列名 FROM 表名;
示例:
-- 从employees表中查询数据
SELECT name FROM employees;
3. WHERE - 过滤数据
含义:根据指定条件过滤查询结果,只返回满足条件的行。
语法:
SELECT 列名 FROM 表名 WHERE 条件;
常用运算符:
- 比较运算符:
=
,<>
,!=
,<
,>
,<=
,>=
- 逻辑运算符:
AND
,OR
,NOT
- 范围运算符:
BETWEEN ... AND ...
,IN()
- 模糊匹配:
LIKE
,RLIKE
/REGEXP
- NULL值判断:
IS NULL
,IS NOT NULL
示例:
-- 查询年龄大于30的员工
SELECT * FROM employees WHERE age > 30;-- 查询部门ID为1且年龄大于25的员工
SELECT * FROM employees WHERE department_id = 1 AND age > 25;-- 查询名字以'张'开头的员工(MySQL中LIKE默认不区分大小写)
SELECT * FROM employees WHERE name LIKE '张%';
4. ORDER BY - 排序数据
含义:对查询结果按照一个或多个列进行排序。
语法:
SELECT 列名 FROM 表名 ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...;
参数说明:
ASC
:升序(默认)DESC
:降序
示例:
-- 按年龄升序排序
SELECT * FROM employees ORDER BY age ASC;-- 先按部门ID升序,再按年龄降序
SELECT * FROM employees ORDER BY department_id ASC, age DESC;
5. LIMIT - 限制结果数量
含义:限制查询结果返回的行数(MySQL特有语法)。
语法:
SELECT 列名 FROM 表名 LIMIT [偏移量,] 行数;
示例:
-- 返回前10行
SELECT * FROM employees LIMIT 10;-- 返回从第11行开始的20行(偏移量从0开始)
SELECT * FROM employees LIMIT 10, 20;-- MySQL 8.0+ 支持的语法
SELECT * FROM employees LIMIT 20 OFFSET 10;
6. DISTINCT - 去重
含义:去除查询结果中的重复行。
语法:
SELECT DISTINCT 列名 FROM 表名;
示例:
-- 查询所有不重复的部门ID
SELECT DISTINCT department_id FROM employees;
7. AS - 列别名/表别名
含义:为列名或表名指定别名,使查询结果更易读。
语法:
-- 列别名
SELECT 列名 AS 别名 FROM 表名;-- 表别名
SELECT 别名.列名 FROM 表名 AS 别名;
示例:
-- 将name列显示为"姓名"
SELECT name AS 姓名, age AS 年龄 FROM employees;-- 使用表别名简化查询
SELECT e.name, d.department_name
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id;
8. GROUP BY - 分组查询
含义:根据一个或多个列对结果集进行分组。
语法:
SELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名1 [, 列名2, ...];
示例:
-- 按部门分组,统计每个部门的员工人数
SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id;
9. HAVING - 分组后过滤
含义:过滤分组后的结果,通常与GROUP BY一起使用。
语法:
SELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名 HAVING 条件;
示例:
-- 只显示员工人数大于10的部门
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10;
10. WITH - 公共表表达式(CTE)
含义:定义一个临时命名的结果集,可用作查询的一部分(MySQL 8.0+支持)。
语法:
WITH 临时表名 AS (SELECT 列名 FROM 表名 WHERE 条件
)
SELECT 列名 FROM 临时表名;
示例:
-- 使用CTE查询部门员工人数超过10的部门信息
WITH large_departments AS (SELECT department_id, COUNT(*) AS emp_count FROM employees GROUP BY department_id HAVING COUNT(*) > 10
)
SELECT d.id, d.department_name, ld.emp_count
FROM departments d
JOIN large_departments ld ON d.id = ld.department_id;
五、数据操作关键字 (DML)
1. INSERT - 插入数据
含义:向表中插入新数据。
语法:
-- 插入单行数据
INSERT INTO 表名 [(列名1, 列名2, ...)] VALUES (值1, 值2, ...);-- 插入多行数据
INSERT INTO 表名 [(列名1, 列名2, ...)] VALUES
(值1, 值2, ...),
(值1, 值2, ...),
...;-- 从查询结果插入数据
INSERT INTO 表名 (列名1, 列名2, ...) SELECT 列名1, 列名2, ... FROM 源表名;
示例:
-- 插入一条员工记录
INSERT INTO employees (name, age, department_id) VALUES ('张三', 28, 1);-- 插入多条员工记录
INSERT INTO employees (name, age, department_id) VALUES
('李四', 32, 2),
('王五', 45, 1);-- 从另一个表插入数据
INSERT INTO employees_backup (name, age, department_id) SELECT name, age, department_id FROM employees;
2. UPDATE - 更新数据
含义:修改表中已存在的数据。
语法:
UPDATE 表名 SET 列名1=值1 [, 列名2=值2, ...] [WHERE 条件];
示例:
-- 更新ID为1的员工年龄
UPDATE employees SET age = 30 WHERE id = 1;-- 同时更新多个字段
UPDATE employees SET age = 30, department_id = 3 WHERE id = 1;-- 更新所有30岁以上员工的部门(谨慎使用)
UPDATE employees SET department_id = 4 WHERE age > 30;
3. DELETE - 删除数据
含义:删除表中的数据。
语法:
DELETE FROM 表名 [WHERE 条件];
示例:
-- 删除ID为1的员工记录
DELETE FROM employees WHERE id = 1;-- 删除部门ID为5的所有员工
DELETE FROM employees WHERE department_id = 5;-- 删除表中所有数据(谨慎使用)
DELETE FROM employees;
4. REPLACE - 替换数据
含义:插入数据,如果发生主键或唯一索引冲突,则先删除旧数据,再插入新数据(MySQL特有)。
语法:
REPLACE INTO 表名 [(列名1, 列名2, ...)] VALUES (值1, 值2, ...);
示例:
-- 替换ID为1的员工记录
REPLACE INTO employees (id, name, age) VALUES (1, '张三', 31);
5. LOAD DATA INFILE - 批量导入数据
含义:从文本文件中批量导入数据到表中(MySQL特有)。
语法:
LOAD DATA [LOCAL] INFILE '文件路径'
INTO TABLE 表名
[FIELDS TERMINATED BY '分隔符']
[LINES TERMINATED BY '行分隔符']
[IGNORE 行数 LINES];
示例:
-- 从employees.txt文件导入数据
LOAD DATA INFILE '/tmp/employees.txt'
INTO TABLE employees
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
六、表连接关键字 (JOIN)
1. INNER JOIN - 内连接
含义:返回两个表中匹配的行(默认连接类型)。
语法:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
示例:
-- 查询员工及其所在部门信息
SELECT e.name, e.age, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
2. LEFT JOIN / LEFT OUTER JOIN - 左连接
含义:返回左表中的所有行,以及右表中匹配的行(右表没有匹配则显示NULL)。
语法:
SELECT 列名 FROM 表1 LEFT [OUTER] JOIN 表2 ON 表1.列 = 表2.列;
示例:
-- 查询所有员工及其部门信息,没有部门的员工也会显示
SELECT e.name, e.age, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
3. RIGHT JOIN / RIGHT OUTER JOIN - 右连接
含义:返回右表中的所有行,以及左表中匹配的行(左表没有匹配则显示NULL)。
语法:
SELECT 列名 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 表1.列 = 表2.列;
示例:
-- 查询所有部门及其员工信息,没有员工的部门也会显示
SELECT e.name, e.age, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
4. CROSS JOIN - 交叉连接
含义:返回两个表的笛卡尔积(所有可能的组合)。
语法:
SELECT 列名 FROM 表1 CROSS JOIN 表2;
示例:
-- 返回员工表和部门表的笛卡尔积
SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;
5. UNION / UNION ALL - 合并结果集
含义:合并两个或多个SELECT语句的结果集。
语法:
SELECT 列名 FROM 表1
UNION [ALL]
SELECT 列名 FROM 表2;
参数说明:
UNION
:合并结果并去重UNION ALL
:合并结果但不去重
示例:
-- 查询部门1和部门2的员工,合并结果并去重
SELECT name, age FROM employees WHERE department_id = 1
UNION
SELECT name, age FROM employees WHERE department_id = 2;
七、子查询关键字
1. IN / NOT IN - 在/不在指定集合内
含义:判断列值是否在指定的集合中。
语法:
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (值1, 值2, ...);-- 或与子查询结合
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 WHERE 条件);
示例:
-- 查询部门ID为1、2、3的员工
SELECT * FROM employees WHERE department_id IN (1, 2, 3);-- 查询不在研发部的员工
SELECT * FROM employees WHERE department_id NOT IN (SELECT id FROM departments WHERE department_name = '研发部');
2. EXISTS / NOT EXISTS - 存在/不存在
含义:判断子查询是否返回任何行。
语法:
SELECT 列名 FROM 表名 WHERE [NOT] EXISTS (SELECT 列名 FROM 表名 WHERE 条件);
示例:
-- 查询有员工的部门
SELECT * FROM departments d WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.id);-- 查询没有员工的部门
SELECT * FROM departments d WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.id);
3. ANY / SOME / ALL - 比较子查询结果
含义:将列值与子查询返回的一组值进行比较。
语法:
SELECT 列名 FROM 表名 WHERE 列名 运算符 ANY|SOME|ALL (子查询);
示例:
-- 查询年龄大于任何一个研发部员工的员工
SELECT * FROM employees WHERE age > ANY (SELECT age FROM employees WHERE department_id = 1);-- 查询年龄大于所有研发部员工的员工
SELECT * FROM employees WHERE age > ALL (SELECT age FROM employees WHERE department_id = 1);
八、索引关键字
1. CREATE INDEX - 创建索引
含义:为表创建索引以提高查询性能。
语法:
CREATE [UNIQUE] [FULLTEXT] [SPATIAL] INDEX 索引名
ON 表名 (列名1 [长度], 列名2 [长度], ...);
参数说明:
UNIQUE
:唯一索引,确保索引列的值唯一FULLTEXT
:全文索引,用于全文搜索SPATIAL
:空间索引,用于地理空间数据
示例:
-- 在name列上创建普通索引
CREATE INDEX idx_name ON employees(name);-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON employees(email);-- 创建复合索引
CREATE INDEX idx_dept_age ON employees(department_id, age);-- 创建全文索引
CREATE FULLTEXT INDEX idx_description ON products(description);
2. DROP INDEX - 删除索引
含义:删除表中的索引。
语法:
DROP INDEX 索引名 ON 表名;
示例:
-- 删除idx_name索引
DROP INDEX idx_name ON employees;
3. ALTER TABLE … ADD INDEX - 添加索引
含义:通过ALTER TABLE语句添加索引。
语法:
ALTER TABLE 表名 ADD [UNIQUE] [FULLTEXT] [SPATIAL] INDEX 索引名 (列名1, 列名2, ...);
示例:
-- 为employees表的age列添加索引
ALTER TABLE employees ADD INDEX idx_age (age);
4. SHOW INDEX - 查看索引
含义:显示表的所有索引信息。
语法:
SHOW INDEX FROM 表名;
示例:
-- 查看employees表的所有索引
SHOW INDEX FROM employees;
九、视图关键字
1. CREATE VIEW - 创建视图
含义:创建一个基于SELECT查询结果的虚拟表。
语法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名 [(列名1, 列名2, ...)]
AS SELECT 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
参数说明:
OR REPLACE
:如果视图已存在则替换ALGORITHM
:指定视图算法WITH CHECK OPTION
:确保通过视图修改的数据符合视图定义的条件
示例:
-- 创建员工部门视图
CREATE VIEW employee_department_view AS
SELECT e.id, e.name, e.age, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;-- 创建可更新的视图
CREATE VIEW active_employees AS
SELECT * FROM employees WHERE status = 'active'
WITH CHECK OPTION;
2. DROP VIEW - 删除视图
含义:删除一个或多个视图。
语法:
DROP VIEW [IF EXISTS] 视图名1 [, 视图名2, ...];
示例:
-- 删除employee_department_view视图
DROP VIEW IF EXISTS employee_department_view;
3. ALTER VIEW - 修改视图
含义:修改已存在的视图定义。
语法:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名 [(列名1, 列名2, ...)]
AS SELECT 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
示例:
-- 修改employee_department_view视图,增加hire_date列
ALTER VIEW employee_department_view AS
SELECT e.id, e.name, e.age, e.hire_date, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
十、存储过程与函数关键字
1. CREATE PROCEDURE - 创建存储过程
含义:创建一个存储过程(预先编译好的SQL代码块)。
语法:
CREATE [DEFINER = { user | CURRENT_USER }]
PROCEDURE 存储过程名 ([参数列表])
[ characteristic ... ]
BEGIN过程体
END;
示例:
-- 创建一个简单的存储过程,查询指定部门的员工
CREATE PROCEDURE GetEmployeesByDepartment(IN dept_id INT)
BEGINSELECT * FROM employees WHERE department_id = dept_id;
END;
2. CREATE FUNCTION - 创建存储函数
含义:创建一个存储函数(返回值的存储过程)。
语法:
CREATE [DEFINER = { user | CURRENT_USER }]
FUNCTION 函数名 ([参数列表])
RETURNS 返回类型
[ characteristic ... ]
BEGIN函数体RETURN 返回值;
END;
示例:
-- 创建一个函数,计算指定部门的员工人数
CREATE FUNCTION GetDepartmentEmployeeCount(dept_id INT)
RETURNS INT
BEGINDECLARE count INT;SELECT COUNT(*) INTO count FROM employees WHERE department_id = dept_id;RETURN count;
END;
3. CALL - 调用存储过程
含义:调用存储过程执行。
语法:
CALL 存储过程名([参数]);
示例:
-- 调用GetEmployeesByDepartment存储过程
CALL GetEmployeesByDepartment(1);
4. DROP PROCEDURE / DROP FUNCTION - 删除存储过程/函数
含义:删除存储过程或存储函数。
语法:
DROP {PROCEDURE | FUNCTION} [IF EXISTS] 名称;
示例:
-- 删除存储过程
DROP PROCEDURE IF EXISTS GetEmployeesByDepartment;-- 删除存储函数
DROP FUNCTION IF EXISTS GetDepartmentEmployeeCount;
十一、触发器关键字
1. CREATE TRIGGER - 创建触发器
含义:创建一个触发器,在特定事件发生时自动执行。
语法:
CREATE [DEFINER = { user | CURRENT_USER }]
TRIGGER 触发器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON 表名 FOR EACH ROW
BEGIN触发器体
END;
示例:
-- 创建一个触发器,在插入员工记录前设置默认部门
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGINIF NEW.department_id IS NULL THENSET NEW.department_id = 1; -- 默认部门ID为1END IF;
END;
2. DROP TRIGGER - 删除触发器
含义:删除一个触发器。
语法:
DROP TRIGGER [IF EXISTS] 触发器名;
示例:
-- 删除before_employee_insert触发器
DROP TRIGGER IF EXISTS before_employee_insert;
十二、事务控制关键字
1. START TRANSACTION / BEGIN - 开始事务
含义:开始一个新的事务。
语法:
START TRANSACTION;
-- 或
BEGIN;
示例:
-- 开始一个事务
START TRANSACTION;
2. COMMIT - 提交事务
含义:确认并永久保存事务中的所有更改。
语法:
COMMIT;
示例:
-- 提交当前事务
COMMIT;
3. ROLLBACK - 回滚事务
含义:取消事务中的所有更改。
语法:
ROLLBACK [TO SAVEPOINT 保存点名];
示例:
-- 回滚当前事务
ROLLBACK;
4. SAVEPOINT - 设置保存点
含义:在事务中设置一个保存点,可用于部分回滚。
语法:
SAVEPOINT 保存点名;
示例:
-- 在事务中设置保存点
SAVEPOINT before_update;-- 回滚到保存点
ROLLBACK TO SAVEPOINT before_update;
5. RELEASE SAVEPOINT - 释放保存点
含义:删除事务中的保存点。
语法:
RELEASE SAVEPOINT 保存点名;
示例:
-- 释放保存点
RELEASE SAVEPOINT before_update;
十三、MySQL特有关键字
1. AUTO_INCREMENT - 自动增长
含义:用于整数列,使其值自动递增(MySQL特有)。
语法:
列名 INT AUTO_INCREMENT;
示例:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50)
);
2. LIMIT - 限制结果集
含义:限制SELECT语句返回的行数(MySQL特有)。
语法:
SELECT 列名 FROM 表名 LIMIT 行数;
示例:
SELECT * FROM users LIMIT 10;
3. ON DUPLICATE KEY UPDATE - 重复键更新
含义:在INSERT时,如果发生唯一键或主键冲突,则执行UPDATE操作(MySQL特有)。
语法:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...)
ON DUPLICATE KEY UPDATE 列名1=值1, 列名2=值2, ...;
示例:
-- 插入用户,如果ID已存在则更新name和age
INSERT INTO users (id, name, age) VALUES (1, '张三', 28)
ON DUPLICATE KEY UPDATE name='张三', age=28;
4. INSERT IGNORE - 忽略重复插入
含义:在INSERT时,如果发生唯一键或主键冲突,则忽略插入操作(MySQL特有)。
语法:
INSERT IGNORE INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);
示例:
-- 插入用户,如果ID已存在则忽略
INSERT IGNORE INTO users (id, name, age) VALUES (1, '张三', 28);
5. VALUES - 访问新插入的值
含义:在触发器中访问刚插入或更新的数据(MySQL特有)。
语法:
-- 访问新插入的值
NEW.列名;-- 访问被更新或删除的旧值
OLD.列名;
示例:
-- 创建一个日志触发器
CREATE TRIGGER log_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGININSERT INTO employee_log (employee_id, old_name, new_name, update_time)VALUES (OLD.id, OLD.name, NEW.name, NOW());
END;
6. DELIMITER - 定义分隔符
含义:更改SQL语句的分隔符(MySQL客户端特有)。
语法:
DELIMITER 新分隔符;
示例:
-- 将分隔符改为//
DELIMITER //
CREATE PROCEDURE test()
BEGINSELECT 'Hello';
END//
-- 改回分号分隔符
DELIMITER ;
7. ENGINE - 指定存储引擎
含义:为表指定存储引擎(MySQL特有)。
语法:
CREATE TABLE 表名 (...)
ENGINE = 存储引擎名;
示例:
-- 创建一个使用InnoDB引擎的表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE = InnoDB;
8. CHARSET / CHARACTER SET - 指定字符集
含义:为数据库、表或列指定字符集(MySQL特有)。
语法:
-- 数据库字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集名;-- 表字符集
CREATE TABLE 表名 (...) CHARSET = 字符集名;-- 列字符集
CREATE TABLE 表名 (列名 VARCHAR(50) CHARACTER SET 字符集名
);
示例:
-- 创建一个使用utf8mb4字符集的表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
) CHARSET = utf8mb4;
十四、MySQL关键字使用注意事项
- 关键字大小写:MySQL关键字不区分大小写,但建议使用大写以提高可读性
- 关键字冲突:如果需要使用关键字作为表名或列名,必须用反引号(`)括起来
- 分号结尾:MySQL要求SQL语句以分号结尾
- WHERE条件:UPDATE和DELETE语句一定要加WHERE条件,否则会影响所有行
- NULL值处理:NULL表示"未知值",不能用=或!=比较,应使用IS NULL或IS NOT NULL
- 事务隔离级别:MySQL支持多种事务隔离级别,可通过
SET TRANSACTION ISOLATION LEVEL
设置 - 索引优化:合理创建索引可以提高查询性能,但会降低写入性能
- SQL注入防护:使用参数化查询或预处理语句,避免直接拼接用户输入到SQL语句中
十五、MySQL关键字速查表
数据定义语言(DDL)
CREATE
: 创建数据库、表、索引、视图等ALTER
: 修改数据库对象结构DROP
: 删除数据库对象TRUNCATE
: 清空表数据RENAME
: 重命名数据库对象
数据操作语言(DML)
SELECT
: 查询数据INSERT
: 插入数据UPDATE
: 更新数据DELETE
: 删除数据REPLACE
: 替换数据LOAD DATA INFILE
: 批量导入数据
数据控制语言(DCL)
GRANT
: 授予权限REVOKE
: 撤销权限COMMIT
: 提交事务ROLLBACK
: 回滚事务SAVEPOINT
: 设置事务保存点
事务控制
START TRANSACTION
/BEGIN
: 开始事务COMMIT
: 提交事务ROLLBACK
: 回滚事务SAVEPOINT
: 设置保存点RELEASE SAVEPOINT
: 释放保存点
MySQL特有关键字
AUTO_INCREMENT
: 自动增长LIMIT
: 限制结果集ON DUPLICATE KEY UPDATE
: 重复键更新INSERT IGNORE
: 忽略重复插入DELIMITER
: 定义分隔符ENGINE
: 指定存储引擎CHARSET
/CHARACTER SET
: 指定字符集NEW
/OLD
: 触发器中访问新/旧值
通过学习和掌握这些MySQL关键字,您将能够更加熟练地使用MySQL数据库进行数据管理和查询操作。建议结合实际练习,加深对这些关键字的理解和应用。