mysql中的通用语法及分类

MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),其语法设计遵循 SQL 标准,但也有一些特有的扩展。以下从​​通用语法规范​ ​和​​SQL 语句分类​​两个维度系统梳理 MySQL 的核心语法体系。

一、MySQL 通用语法规范

通用语法是编写 SQL 语句时需遵守的基础规则,确保 MySQL 能正确解析和执行代码。

1. 注释(Comments)

用于解释代码逻辑,不会被 MySQL 执行。支持三种注释方式:

  • ​单行注释​ :以 --# 开头(-- 后需至少一个空格)。

    复制代码
    SELECT * FROM users; -- 查询所有用户(-- 后有空格)
    SELECT * FROM users; # 另一种单行注释方式
  • ​多行注释​ :以 /* 开头、*/ 结尾,可跨越多行。

    复制代码
    /*
      功能:创建用户表
      作者:张三
      时间:2023-10-01
    */
    CREATE TABLE users (...);
2. 分隔符(Delimiter)

默认语句以分号 ; 结尾,但在定义存储过程、触发器等复合语句时,需临时修改分隔符以避免冲突。

复制代码
DELIMITER $$  -- 将分隔符临时改为 $$
CREATE PROCEDURE GetUser()
BEGIN
  SELECT * FROM users;
END$$
DELIMITER ;  -- 恢复默认分隔符为 ;
3. 标识符(Identifier)

用于命名数据库对象(如数据库、表、列、索引等),需遵守以下规则:

  • ​合法字符​ :字母(a-z, A-Z)、数字(0-9)、下划线(_)、美元符号($),或 Unicode 字符(如中文)。

  • ​长度限制​:默认最大长度为 64 字符(不同存储引擎可能略有差异,如 InnoDB 支持 64 字节,MyISAM 支持 64 字符)。

  • ​区分大小写​:取决于操作系统(Linux 下默认区分表名大小写,Windows 不区分;列名始终不区分)。

  • ​保留字处理​ :若使用 MySQL 保留字(如 orderuser)作为标识符,需用反引号 ````` 包裹。

    复制代码
    CREATE TABLE `order` (id INT);  -- 正确(使用反引号转义保留字)
4. 变量(Variables)

MySQL 支持多种类型的变量,用于存储临时数据或配置参数:

  • ​用户变量​ :以 @ 开头,会话级作用域(仅当前连接有效)。

    复制代码
    SET @username = 'admin';  -- 赋值
    SELECT @username;         -- 查询(输出 'admin')
  • ​系统变量​ :控制 MySQL 运行行为,分为全局(@@global.var_name)和会话(@@session.var_name/@@var_name)级。

    复制代码
    SHOW VARIABLES LIKE 'max_connections';  -- 查看全局最大连接数
    SET GLOBAL max_connections = 200;       -- 修改全局变量(需管理员权限)
  • ​局部变量​ :在存储过程、函数中使用,以 DECLARE 声明,仅在块内有效。

    复制代码
    DELIMITER 
复制代码
  CREATE PROCEDURE CalcSum(IN a INT, IN b INT, OUT sum INT)
  BEGIN
    DECLARE temp INT;  -- 局部变量
    SET temp = a + b;
    SET sum = temp;
  END$$
  DELIMITER ;
  ```

#### 5. 流程控制语句
主要用于存储过程、函数、触发器等复合逻辑中,类似编程语言的控制结构:
- **条件判断**:`IF...ELSEIF...ELSE`、`CASE...WHEN...ELSE...END CASE`。
  ```sql
  -- IF 示例
  IF score > 90 THEN
    SET grade = 'A';
  ELSEIF score > 80 THEN
    SET grade = 'B';
  ELSE
    SET grade = 'C';
  END IF;

  -- CASE 示例
  CASE 
    WHEN status = 1 THEN '启用'
    WHEN status = 0 THEN '禁用'
    ELSE '未知'
  END CASE;
  ```
- **循环**:`LOOP`、`WHILE...DO`、`REPEAT...UNTIL...END REPEAT`。
  ```sql
  -- WHILE 循环(累加 1 到 10)
  SET i = 1;
  WHILE i <= 10 DO
    SET sum = sum + i;
    SET i = i + 1;
  END WHILE;

  -- REPEAT 循环(直到条件满足)
  REPEAT
    SET count = count + 1;
  UNTIL count >= 5 END REPEAT;
  ```


### 二、SQL 语句分类
SQL(结构化查询语言)按功能可分为五大类,MySQL 完全支持并扩展了部分语法。

#### 1. DDL(数据定义语言,Data Definition Language)
用于定义或修改数据库对象(如数据库、表、索引、视图等)的结构。

| 语句          | 功能描述                                                                 | 示例                                                                 |
|---------------|--------------------------------------------------------------------------|----------------------------------------------------------------------|
| `CREATE`      | 创建数据库对象(数据库、表、索引、视图等)                               | `CREATE DATABASE db1;`<br>`CREATE TABLE users (id INT PRIMARY KEY);` |
| `ALTER`       | 修改已有数据库对象的结构                                                 | `ALTER TABLE users ADD COLUMN age INT;`<br>`ALTER TABLE users DROP COLUMN age;` |
| `DROP`        | 删除数据库对象                                                           | `DROP DATABASE db1;`<br>`DROP TABLE users;`                          |
| `TRUNCATE`    | 清空表数据(比 `DELETE` 更快,且无法回滚)                               | `TRUNCATE TABLE users;`                                              |
| `COMMENT`     | 为对象添加注释                                                           | `COMMENT ON TABLE users IS '用户信息表';`(MySQL 不直接支持此语法,需通过元数据表设置) |
| `RENAME`      | 重命名对象                                                               | `RENAME TABLE old_table TO new_table;`                               |

**注意**:`TRUNCATE` 与 `DELETE` 的区别:  
- `TRUNCATE` 是 DDL,直接释放表空间,不记录逐行日志(仅记录页删除),无法通过事务回滚恢复;  
- `DELETE` 是 DML,逐行删除并记录日志,可通过 `ROLLBACK` 回滚(若在事务中)。

#### 2. DML(数据操作语言,Data Manipulation Language)
用于对表中的数据进行增、删、改操作(不包括查询)。

| 语句          | 功能描述                                                                 | 示例                                                                 |
|---------------|--------------------------------------------------------------------------|----------------------------------------------------------------------|
| `INSERT`      | 向表中插入新数据                                                         | `INSERT INTO users (name, age) VALUES ('张三', 25);`<br>`INSERT INTO users VALUES (1, '李四', 30);`(全列插入) |
| `UPDATE`      | 修改表中已有数据                                                         | `UPDATE users SET age = 26 WHERE name = '张三';`                     |
| `DELETE`      | 删除表中符合条件的数据                                                   | `DELETE FROM users WHERE age < 18;`                                  |

#### 3. DQL(数据查询语言,Data Query Language)
MySQL 中特指 `SELECT` 语句,用于从表中查询数据,是最复杂也最常用的语法。

**核心语法结构**:
```sql
SELECT [DISTINCT] 列名/表达式 [AS 别名]
FROM 表名 [别名]
[WHERE 条件]
[GROUP BY 分组列 HAVING 分组过滤条件]
[ORDER BY 排序列 [ASC/DESC]]
[LIMIT 限制行数];
```

**关键子句说明**:
- **`WHERE`**:过滤行(支持比较运算符、逻辑运算符、范围查询、子查询等)。  
  示例:`SELECT * FROM users WHERE age BETWEEN 18 AND 30 AND gender = '女';`
- **`GROUP BY`**:按列分组统计(常配合聚合函数 `COUNT`、`SUM`、`AVG` 等)。  
  示例:`SELECT gender, COUNT(*) AS user_count FROM users GROUP BY gender;`
- **`HAVING`**:对分组后的结果过滤(与 `WHERE` 类似,但只能用于 `GROUP BY` 后)。  
  示例:`SELECT gender, AVG(age) AS avg_age FROM users GROUP BY gender HAVING avg_age > 25;`
- **`ORDER BY`**:按列排序(升序 `ASC` 默认,降序 `DESC`)。  
  示例:`SELECT * FROM users ORDER BY age DESC, name ASC;`
- **`LIMIT`**:限制返回行数(支持 `LIMIT n` 或 `LIMIT offset, n`)。  
  示例:`SELECT * FROM users LIMIT 10;`(前10行)<br>`SELECT * FROM users LIMIT 0, 10;`(同上)<br>`SELECT * FROM users LIMIT 10, 20;`(第11-30行)

**高级查询**:
- **连接查询**:关联多表数据(`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`FULL JOIN`(MySQL 不直接支持,需用 `UNION` 模拟))。  
  示例:`SELECT u.name, o.order_id FROM users u LEFT JOIN orders o ON u.id = o.user_id;`
- **子查询**:嵌套 `SELECT` 语句(支持标量子查询、行子查询、列子查询、表子查询)。  
  示例:`SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);`
- **联合查询**:合并多个 `SELECT` 结果(`UNION` 去重,`UNION ALL` 不去重)。  
  示例:`(SELECT name FROM users) UNION (SELECT product_name FROM products);`

#### 4. DCL(数据控制语言,Data Control Language)
用于管理数据库用户的访问权限和角色。

| 语句          | 功能描述                                                                 | 示例                                                                 |
|---------------|--------------------------------------------------------------------------|----------------------------------------------------------------------|
| `GRANT`       | 授予用户或角色权限                                                       | `GRANT SELECT, INSERT ON db1.users TO 'user1'@'localhost';`          |
| `REVOKE`      | 收回已授予的权限                                                         | `REVOKE DELETE ON db1.users FROM 'user1'@'localhost';`               |
| `SET PASSWORD`| 修改用户密码                                                             | `SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('new_pass');`(MySQL 5.7+ 已弃用 `PASSWORD()`,直接用 `SET PASSWORD = 'new_pass';`) |

#### 5. TCL(事务控制语言,Transaction Control Language)
用于管理数据库事务(保证数据的一致性和完整性)。

| 语句                | 功能描述                                                                 | 示例                                                                 |
|---------------------|--------------------------------------------------------------------------|----------------------------------------------------------------------|
| `START TRANSACTION` | 开始一个事务(等价于 `BEGIN`)                                           | `START TRANSACTION;`                                                 |
| `COMMIT`            | 提交事务(所有操作永久生效)                                             | `COMMIT;`                                                            |
| `ROLLBACK`          | 回滚事务(撤销所有未提交的操作)                                         | `ROLLBACK;`                                                          |
| `SAVEPOINT`         | 设置事务保存点(可部分回滚)                                             | `SAVEPOINT sp1;`<br>`ROLLBACK TO SAVEPOINT sp1;`(回滚到 `sp1`)     |

**事务特性(ACID)**:  
- **原子性(Atomicity)**:事务中的操作要么全成功,要么全失败。  
- **一致性(Consistency)**:事务前后数据状态合法(如转账后总金额不变)。  
- **隔离性(Isolation)**:事务间互不干扰(通过隔离级别控制,如 `READ UNCOMMITTED`、`READ COMMITTED`、`REPEATABLE READ`(MySQL 默认)、`SERIALIZABLE`)。  
- **持久性(Durability)**:提交的事务数据永久保存(通过日志 `redo log` 保证)。


### 三、其他高级语法
除上述基础语法外,MySQL 还支持以下高级功能:

#### 1. 存储过程(Stored Procedure)
封装多条 SQL 语句,可重复调用并支持逻辑控制。
```sql
DELIMITER 

CREATE PROCEDURE GetUserCount(OUT total INT)

BEGIN

SELECT COUNT(*) INTO total FROM users;

END$$

DELIMITER ;

CALL GetUserCount(@count); -- 调用存储过程

SELECT @count; -- 输出结果

复制代码
#### 2. 触发器(Trigger)
在特定事件(`INSERT`、`UPDATE`、`DELETE`)发生时自动执行的代码块。
```sql
-- 创建触发器(插入用户后记录日志)
DELIMITER 
$$
CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_log (action, user_id, create_time)
  VALUES ('INSERT', NEW.id, NOW());
END$$
DELIMITER ;
3. 事件(Event)

定时执行的任务(需开启事件调度器 event_scheduler)。

复制代码
-- 开启事件调度器(临时生效)
SET GLOBAL event_scheduler = ON;

-- 创建每日凌晨清理过期日志的事件
CREATE EVENT clean_expired_logs
ON SCHEDULE EVERY 1 DAY STARTS '2023-10-01 03:00:00'
ON COMPLETION PRESERVE
DO
  DELETE FROM logs WHERE expire_time < NOW();
4. 窗口函数(Window Functions,MySQL 8.0+ 支持)

用于复杂数据分析(如排名、累计求和等),不改变结果集行数。

复制代码
-- 计算每个部门的工资排名
SELECT 
  name, 
  department, 
  salary,
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

总结

MySQL 的语法体系以 SQL 标准为基础,结合了丰富的扩展功能。掌握通用语法(注释、分隔符、标识符等)是编写正确 SQL 的前提,而熟练使用 DDL/DML/DQL/DCL/TCL 及高级对象(存储过程、触发器等)则是实现复杂业务逻辑的关键。实际开发中需根据场景选择合适的语法和优化策略(如索引优化、批量操作等),以提升数据库性能。

相关推荐
麦麦大数据13 小时前
F010 Vue+Flask豆瓣图书推荐大数据可视化平台系统源码
vue.js·mysql·机器学习·flask·echarts·推荐算法·图书
xhbh66613 小时前
【超全汇总】MySQL服务启动命令手册(Linux+Windows+macOS)(上)
数据库·mysql·程序员·mysql启动命令·数据库启动命令
2301_8035545215 小时前
mysql(自写)
数据库·mysql
叁沐15 小时前
MySQL 30 用动态的观点看加锁
mysql
柏油17 小时前
MySQL InnoDB 架构
数据库·后端·mysql
JavaArchJourney19 小时前
MySQL 索引:原理篇
java·后端·mysql
Jasonakeke19 小时前
【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解
数据库·mysql·adb
老友@21 小时前
MySQL 索引失效全解析与优化指南
数据库·mysql·索引失效·索引
共享家952721 小时前
MySQL-事务(下)-MySQL事务隔离级别与MVCC
数据库·mysql