当前位置: 首页 > news >正文

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 保留字(如 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)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 及高级对象(存储过程、触发器等)则是实现复杂业务逻辑的关键。实际开发中需根据场景选择合适的语法和优化策略(如索引优化、批量操作等),以提升数据库性能。

http://www.dtcms.com/a/356158.html

相关文章:

  • Ubuntu下配置并远程连接MySQL
  • 平安养老险深分开展“金融护航,安居鹏城”新市民金融服务宣传活动
  • Unity+URP+WebGL抗锯齿设置
  • MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)
  • PDF,HTML,md格式文件在线查看工具
  • CosyVoice win10启用记
  • 【mysql】SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考
  • 编译esp32报错解决办法
  • 光谱相机多层镀膜技术如何提高透过率
  • [新启航]白光干涉仪在太阳能电池片栅线高度 3D 轮廓测量中的应用解析
  • 【C语言】递归
  • 屏随人动+视觉魔方+多样主题+智能留言,涂鸦Wukong AI 2.0助力打造爆款带屏云台相机
  • 从0开始学习Java+AI知识点总结-28.Linux部署
  • PDF 24 Tools, PDF编辑工具, PDF压缩, PDF转换, PDF删除, PDF加密, 添加水印
  • 创业灵感第一集
  • OpsManage:基于Django的企业级AWS云资源运维管理平台
  • 《零基础入门AI:YOLOv2算法解析》
  • Vue开发准备
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(四)
  • OpenHarmony设备使用统计深度实战:从数据埋点到信息采集的全链路方案
  • 使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战
  • C++ 8.28
  • Dify学习
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 深入理解文本向量嵌入(Vector Embeddings):原理、实践与应用场景
  • Linux---gdb和cgdb
  • UML状态图中entry/do/exit动作的深入解析与C/C++实现
  • 《深度讲解 C 语言动态内存:函数用法、错误规避与经典笔试题》
  • 同类软件对比(二):VS Code 与 PyCharm 的 Python 开发对比与使用建议
  • JavaScript初识:给小白的第一堂编程课