-----动态语句例子
set @s = 'SELECT * FROM employees where 1 = 1';-- 使用1=1的好处就是拼接的后续语句可以不加where且未查询到数据也可以显示空表
set @s = concat (@s,' and gender =''m''');-- 注意内部字符串需要两个引号,在 SQL 中,一个单引号字符需要用两个单引号进行转义,以避免语法错误
set @s = concat (@s,' and birth_date >=''1960-01-01'' ');
set @s = concat (@s,' ORDER BY emp_no LIMIT ?,?'); -- 一般会使用分页
set @page_no = 0;
set @page_count = 10;
PREPARE stmt from @s;
EXECUTE stmt USING @page_no,@page_count ;-- 传入两个参数
DEALLOCATE PREPARE stmt;
select @s -- 可以输出实际的动态语句内容
生产中更建议使用,且优势为
灵活性:PREPARE
语句允许创建动态 SQL 查询,可以根据应用程序的状态或用户输入生成查询。这使得编写更复杂和动态的 SQL 更加容易。
分离逻辑和数据:使用预处理语句可以将 SQL 逻辑与具体的数据分开,使得代码更清晰,利于维护。参数绑定的方式使得 SQL 语句和数据处理逻辑得以分离。
处理复杂查询:预处理语句特别适用于处理复杂或结构化的查询,例如涉及多个表的联接查询。在这种情况下,预处理可以帮助简化查询逻辑
标准化:预处理语句在不同的数据库系统中有类似的实现,使用预处理语句可以更容易地将 SQL 语句迁移到其他数据库系统,提高了跨平台的兼容性。
备注:-- 注释后面一定要跟空格,我是从sqlserver过来的所以没习惯跟空格,导致注释有问题。
我试了试''m'' 和 "m" 效果好像是一样的,看似一样,其实第一个双引号由两个'拼接的,第二个只有shift+’ 获得的在一起的" ,这两个有啥不一样么,知道的麻烦评论告诉我下,我测试了这两种引号在sqlserver中是有区别的。
-----简单事务的练习测试
先创建一个表
-- 以下语句按顺序执行测试事务的提交回滚等操作
create table a (aa int ,bb int);
BEGIN;-- 开启事务
insert into a (aa ,bb ) VALUEs (1,2);
SELECT * FROM a; -- 看看有啥
ROLLBACK; -- 回滚
SELECT * FROM a;-- 看看有啥
begin;-- 开启事务
insert into a (aa ,bb ) VALUEs (1,2);
SELECT * FROM a; -- 看看有啥
COMMIT;-- 提交
SELECT * FROM a;-- 看看有啥
-----存储过程
简单的从1+2+3+....+100 循环
DELIMITER //
CREATE PROCEDURE sum_from_1_to_100()
BEGIN
DECLARE sum INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
-- 使用 WHILE 循环计算从 1 到 100 的和
WHILE i <= 100 DO
SET sum = sum + i;
SET i = i + 1;
END WHILE;
-- 返回计算结果
SELECT sum AS total_sum;
END //
DELIMITER ;
CALL sum_from_1_to_100;
为什么使用 DELIMITER// ?
简单点来说就是命令行情况没法换行输入,每次;加回车就执行了,图形化界面还好一些。
DELIMITER
是 MySQL 客户端用来设置 SQL 语句分隔符的命令。默认情况下,MySQL 使用分号 (;
) 作为 SQL 语句的分隔符。然而,在创建或修改存储过程、触发器、函数等涉及多个 SQL 语句的对象时,可能需要使用不同的分隔符,以避免混淆
在创建存储过程或函数之前,你可以使用 DELIMITER
命令设置一个新的分隔符。例如,将分隔符改为 //
DELIMITER // -- 定义新分隔符
CREATE PROCEDURE my_procedure()
BEGIN
-- SQL 语句
SELECT 'Hello World';
END // -- 使用新的分隔符结束
DELIMITER ; -- 还原分隔符
注意MySQL不支持使用ALTER PROCEDURE
,ALTER PROCEDURE
用于修改存储过程的属性,而不是用来重新定义存储过程体。要修改存储过程的逻辑,应该使用 DROP PROCEDURE
删除旧的存储过程,然后使用 CREATE PROCEDURE
重新创建新的存储过程