DBA笔记-第三部分

-----动态语句例子

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 重新创建新的存储过程

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值