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()
BEGINSELECT * FROM users;
END$$
DELIMITER ; -- 恢复默认分隔符为 ;
3. 标识符(Identifier)
用于命名数据库对象(如数据库、表、列、索引等),需遵守以下规则:
- 合法字符:字母(a-z, A-Z)、数字(0-9)、下划线(
_
)、美元符号($
),或 Unicode 字符(如中文)。 - 长度限制:默认最大长度为 64 字符(不同存储引擎可能略有差异,如 InnoDB 支持 64 字节,MyISAM 支持 64 字符)。
- 区分大小写:取决于操作系统(Linux 下默认区分表名大小写,Windows 不区分;列名始终不区分)。
- 保留字处理:若使用 MySQL 保留字(如
order
、user
)作为标识符,需用反引号`
包裹。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)BEGINDECLARE 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 THENSET grade = 'A';ELSEIF score > 80 THENSET grade = 'B';ELSESET 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 DOSET sum = sum + i;SET i = i + 1;END WHILE;-- REPEAT 循环(直到条件满足)REPEATSET 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
BEGININSERT 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
DODELETE 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 及高级对象(存储过程、触发器等)则是实现复杂业务逻辑的关键。实际开发中需根据场景选择合适的语法和优化策略(如索引优化、批量操作等),以提升数据库性能。