MySQL所有关键字详细含义说明

文章目录

  • 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关键字使用注意事项

  1. 关键字大小写:MySQL关键字不区分大小写,但建议使用大写以提高可读性
  2. 关键字冲突:如果需要使用关键字作为表名或列名,必须用反引号(`)括起来
  3. 分号结尾:MySQL要求SQL语句以分号结尾
  4. WHERE条件:UPDATE和DELETE语句一定要加WHERE条件,否则会影响所有行
  5. NULL值处理:NULL表示"未知值",不能用=或!=比较,应使用IS NULL或IS NOT NULL
  6. 事务隔离级别 :MySQL支持多种事务隔离级别,可通过SET TRANSACTION ISOLATION LEVEL设置
  7. 索引优化:合理创建索引可以提高查询性能,但会降低写入性能
  8. 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数据库进行数据管理和查询操作。建议结合实际练习,加深对这些关键字的理解和应用。

相关推荐
QQ12958455042 小时前
sqlite是什么
数据库·sqlite
豆豆·丁2 小时前
kettle 执行java脚本生成SQL
java·开发语言·数据库
wow_DG3 小时前
【MySQL✨】MySQL 入门之旅 · 第十篇:数据库备份与恢复
android·数据库·mysql
OG one.Z3 小时前
MySQL基础
数据库·mysql·oracle
陈尕六3 小时前
SQL优化实战经验指南
mysql·性能优化
用户6279947182623 小时前
南大通用GBase8a v953.27.20节点替换操作手顺
数据库
重启的码农3 小时前
kv数据库-leveldb (14) 比较器 (Comparator)
数据库
vortex53 小时前
在 Kali Linux 上配置 MySQL 服务器并实现 Windows 远程连接
linux·数据库·mysql
夜晚中的人海3 小时前
C++11(2)
android·数据库·c++