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