1. 首页 > MySQL教程 > 正文

MySQL教程FG064-MySQL语句分隔符与执行规则

GF-MySQL

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。

Part01-基础概念与理论知识

1.1 什么是语句分隔符

语句分隔符是用于标识SQL语句结束的符号。在MySQL中,默认的语句分隔符是分号(;)。

1.2 分隔符的作用

  • 标识SQL语句的结束
  • 告诉MySQL客户端何时执行当前语句
  • 允许在单个脚本中包含多个SQL语句

Part02-生产环境规划与建议

2.1 分号(;)

分号是MySQL的默认语句分隔符,用于结束大多数SQL语句。

示例: 01 更多视频教程www.fgedu.net.cn

-- 使用分号作为分隔符
SELECT * FROM users;
INSERT INTO users (username, email) VALUES ('admin', 'admin@fgedu.net.cn');
UPDATE users SET status = 'active' WHERE id = 1;
            

2.2 分号的使用场景

  • 单条SQL语句的结束
  • 多个SQL语句的分隔
  • 交互式命令行中的语句结束

Part03-生产环境项目实施方案

3.1 为什么需要自定义分隔符

在某些情况下,默认的分号分隔符会与SQL语句中的内容冲突,例如: 02 学习交流加群风哥微信: itpux-com

  • 存储过程中包含分号
  • 函数定义中包含分号
  • 触发器定义中包含分号
  • 复合语句中包含分号

3.2 使用DELIMITER命令

MySQL提供了DELIMITER命令来修改语句分隔符。

示例:

-- 修改分隔符为//
DELIMITER //

-- 创建存储过程
CREATE PROCEDURE GetUsers()
BEGIN
    SELECT * FROM users;
    SELECT COUNT(*) FROM users;
END //

-- 改回默认分隔符
DELIMITER ;
            

3.3 自定义分隔符的选择

  • 选择不会在SQL语句中出现的字符组合
  • 常用的自定义分隔符:
    • //:双斜杠
    • $$:双美元符号
    • ;;:双分号
  • 避免使用可能与SQL语法冲突的字符

Part04-生产案例与实战讲解

4.1 语句执行的基本规则

  • MySQL客户端会积累输入的SQL语句,直到遇到分隔符
  • 遇到分隔符后,客户端会将积累的语句发送给服务器执行
  • 服务器执行完毕后,将结果返回给客户端
  • 客户端准备接收下一条语句

4.2 交互式执行

在交互式MySQL客户端中:

  • 输入SQL语句后,按Enter键换行
  • 输入分隔符(默认分号)后,按Enter键执行语句
  • 可以在一行中输入多条语句,用分号分隔

示例:

mysql> SELECT * FROM users;
+----+----------+------------------+
| id | username | email            |
+----+----------+------------------+
|  1 | admin    | admin@fgedu.net.cn |
+----+----------+------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO users (username, email) VALUES ('user1', 'user1@fgedu.net.cn');
Query OK, 1 row affected (0.01 sec)
            

4.3 批处理执行

在批处理模式中:

  • SQL语句存储在文件中,用分号分隔
  • 使用mysql命令执行文件:mysql -u root -p database < script.sql
  • MySQL会按照顺序执行文件中的所有语句

示例:

-- script.sql文件内容
USE testdb;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);
INSERT INTO users (username, email) VALUES ('admin', 'admin@fgedu.net.cn');

-- 执行脚本
$ mysql -u root -p testdb < script.sql
            

4.4 复合语句的执行

复合语句(如存储过程、函数、触发器)的执行:

  • 需要使用自定义分隔符
  • 复合语句内部的分号不会触发执行
  • 只有遇到自定义分隔符时,整个复合语句才会被执行

示例:

DELIMITER //

CREATE FUNCTION CalculateTotal(price DECIMAL(10,2), quantity INT) RETURNS DECIMAL(10,2)
BEGIN
    DECLARE total DECIMAL(10,2);
    SET total = price * quantity;
    RETURN total;
END //

DELIMITER ;

-- 调用函数
SELECT CalculateTotal(10.50, 5);
            

Part05-风哥经验总结与分享

5.1 字符串中的分号

字符串中的分号不会被视为语句分隔符,因为它们被引号包围。

示例: 03 学习交流加群风哥QQ113257174

-- 字符串中的分号不会被视为分隔符
INSERT INTO users (username, bio) VALUES ('user1', 'Hello; World;');

-- 正确执行
SELECT * FROM users WHERE bio LIKE '%World;%';
            

5.2 注释中的分号

注释中的分号不会被视为语句分隔符。 04 风哥提示:

示例:

-- 注释中的分号; 不会被视为分隔符
SELECT * FROM users; -- 行尾注释中的分号; 也不会被视为分隔符
            

5.3 多行语句

SQL语句可以跨越多行,直到遇到分隔符才会执行。

示例:

-- 多行语句
SELECT 
    id, 
    username, 
    email 
FROM 
    users 
WHERE 
    status = 'active' 
ORDER BY 
    created_at DESC;
            

6. 常见问题与解决方案

6.1 分隔符错误

问题:存储过程创建失败,提示语法错误

原因:没有使用自定义分隔符,导致存储过程内部的分号被视为语句结束 05更多学习教程公众号风哥教程itpux_com

解决方案:使用DELIMITER命令修改分隔符

错误示例:

-- 错误:没有使用自定义分隔符
CREATE PROCEDURE GetUsers()
BEGIN
    SELECT * FROM users;
    SELECT COUNT(*) FROM users;
END;
            

正确示例:

-- 正确:使用自定义分隔符
DELIMITER //
CREATE PROCEDURE GetUsers()
BEGIN
    SELECT * FROM users;
    SELECT COUNT(*) FROM users;
END //
DELIMITER ;
            

6.2 分隔符未重置

问题:执行完存储过程后,后续SQL语句无法正常执行

原因:没有将分隔符改回默认的分号

解决方案:在创建完存储过程后,使用DELIMITER ;重置分隔符

6.3 批处理文件中的分隔符

问题:批处理文件执行失败

原因:文件中包含复合语句,但没有正确使用分隔符

解决方案:在批处理文件中正确使用DELIMITER命令

7. 最佳实践

7.1 分隔符使用建议

  • 对于简单SQL语句,使用默认的分号分隔符
  • 对于复合语句,使用自定义分隔符
  • 在复合语句定义完成后,及时将分隔符改回默认值
  • 在批处理文件中,明确使用分隔符命令

7.2 执行规则建议

  • 在交互式客户端中,每条语句后都添加分号
  • 在批处理文件中,确保每条语句都有正确的分隔符
  • 对于复杂的SQL语句,使用多行格式提高可读性
  • 在执行多条语句时,注意语句之间的顺序和依赖关系

8. 工具支持

8.1 MySQL Workbench

MySQL Workbench会自动处理分隔符:

  • 在SQL编辑器中,复合语句会自动识别
  • 可以使用工具栏中的分隔符按钮修改分隔符
  • 执行语句时会正确处理分隔符

8.2 命令行客户端

MySQL命令行客户端:

  • 使用DELIMITER命令修改分隔符
  • 使用\g\G作为替代分隔符
  • \g:执行语句并以表格形式显示结果
  • \G:执行语句并以垂直形式显示结果

示例:

mysql> SELECT * FROM users \g
+----+----------+------------------+
| id | username | email            |
+----+----------+------------------+
|  1 | admin    | admin@fgedu.net.cn |
+----+----------+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users \G
*************************** 1. row ***************************
         id: 1
   username: admin
      email: admin@fgedu.net.cn
1 row in set (0.00 sec)
            

8.3 其他工具

  • phpMyAdmin:提供图形界面执行SQL语句
  • Navicat:支持分隔符设置和SQL执行
  • VS Code:通过插件支持MySQL语法和执行

9. 示例:完整的分隔符使用

示例:创建存储过程和函数

-- 设置自定义分隔符
DELIMITER //

/* 
获取用户信息的存储过程
*/
CREATE PROCEDURE sp_get_user(IN user_id INT)
BEGIN
    -- 查询用户基本信息
    SELECT * FROM users WHERE id = user_id;
    
    -- 查询用户订单
    SELECT * FROM orders WHERE user_id = user_id;
END //

/* 
计算折扣价格的函数
*/
CREATE FUNCTION fn_calculate_discount(price DECIMAL(10,2), discount INT) RETURNS DECIMAL(10,2)
BEGIN
    DECLARE discounted_price DECIMAL(10,2);
    SET discounted_price = price * (1 - discount / 100);
    RETURN discounted_price;
END //

/* 
插入用户前的触发器
*/
CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.created_at = NOW();
    SET NEW.updated_at = NOW();
END //

-- 恢复默认分隔符
DELIMITER ;

-- 测试存储过程
CALL sp_get_user(1);

-- 测试函数
SELECT fn_calculate_discount(100.00, 20);
            

10. 总结

本教程介绍了MySQL语句分隔符与执行规则,包括: 06 from mysql视频:www.itpux.com

  • 默认分隔符(分号)的使用
  • 自定义分隔符的必要性和使用方法
  • SQL语句的执行规则
  • 特殊情况的处理
  • 常见问题与解决方案
  • 最佳实践建议
  • 工具支持情况

理解和正确使用MySQL的语句分隔符与执行规则,对于编写和执行SQL语句,特别是复杂的复合语句(如存储过程、函数和触发器)非常重要。通过遵循最佳实践,可以避免常见的语法错误,提高SQL代码的可读性和可维护性。

提示:在编写包含复合语句的SQL脚本时,始终记得使用DELIMITER命令修改分隔符,并在完成后将其改回默认值。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息