MySql 语句收集

本文深入探讨MySQL中的变量赋值操作,解析=与:=的区别,详解序列号生成与数据迁移技巧,包括复杂查询优化、存储过程设计及数据更新策略。通过实际案例,如账户数据统一、角色权限批量修改,展示SQL在数据处理上的强大能力。

=与:=区别

  • = 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用。鉴于此,用变量实现行号时,必须用:=
  • := 不只在set和update时时赋值的作用,在select也是赋值的作用。

序列号:

两种创建变量并赋值的方式
SET @变量名 = 值;
SELECT 值 INTO @变量名;

select (@rowNO := @rowNo+1) AS rowno from blog,(select @rowNO :=0) b 

必须要有select @rowNo:=0,不然查询出来的全是null

或者这样

set @rowNo=0;
select (@rowNO := @rowNo+1) AS rowno from blog;

分组:

一个user表,有id,name字段,name有重复,求id最小的不同name的记录表。

复杂的:

select * from user a where a.id=
(select id from user b where a.name=b.name limit 1) 

group by:

select * from user where id in (select  min(id) from user group by name having count(1)>0)

子查询分组:

select * from (select * from `test` order by `date` desc) `temp`  group by category_id order by `date` desc

虽然没有理解,但是测下来是对的

同数据库表数据迁移

-- 迁移统一账户数据
update hs_issue_info a ,hs_draw_info b set 
a.add_person_p2p_account_draw=1,
a.add_person_p2p_account_draw_archive_id=b.unify_loan_account,
a.add_person_p2p_account_draw_p2p_account_id=b.p2p_account_id,
a.add_person_p2p_account_draw_p2p_account_name=b.p2p_account_name,
a.add_person_p2p_account_draw_p2p_account_tel=b.phone_number
where a.draw_id=b.draw_id and b.unify_loan_account is not null;

存储过程

delimiter $$
drop procedure if exists pro;
create procedure pro()
begin
   declare num int default 0;
     select count(1) from hs_draw_info where unify_loan_account is not null into num;
     select num;
end 
$$
delimiter ;
call pro();

delimiter 是分隔符,其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
默认情况下,delimiter是分号;命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令

最后一个$$就是告诉命令行,语句可以执行了。

案例,迁移数据

创建临时表,遍历插入数据

-- 创建临时表
CREATE TEMPORARY TABLE IF NOT EXISTS temp
(
    id INT NOT NULL DEFAULT 0,
    role_full_name VARCHAR(100) NOT NULL,
    right_full_name VARCHAR(100) NOT NULL
)

-- 初始化数据
set @rowNo=0;
insert into temp (id,role_full_name,right_full_name) 
select  (@rowNO := @rowNo+1) AS id,
a.full_name as role_full_name,
c.full_name as right_full_name  
from role a 
join role_right b 
on a.role_id=b.role_id
join `right` c
on b.right_id=c.right_id
where a.application_id=23
and c.application_id=23;

-- 修改数据
update temp set role_full_name=replace(role_full_name,'huishi','huishi-pub');
update temp set right_full_name=replace(right_full_name,'huishi','huishi-pub');
-- 查看信息
select * from temp;
select @rowNo;

-- 创建存储过程,循环插入数据
delimiter $$
drop procedure if exists pro $$
create procedure pro()
begin
   declare num int default 1;
     declare role_id2 int default 0;
     declare right_id2 int default 0;
   declare role_full_name2 varchar(100) default '';
     declare right_full_name2 varchar(100) default '';
     set num=1;
     while num<=@rowNo do
             select role_full_name,right_full_name into role_full_name2,right_full_name2  from temp where id=num;
             select role_id into role_id2 from role where full_name=role_full_name2;
             select right_id into right_id2 from `right` where full_name=right_full_name2;
             INSERT INTO `security-shitou`.`role_right`(`role_id`, `right_id`, `creator`, `is_active`, `insert_time`, `update_time`) VALUES (role_id2, right_id2, NULL, 1, now(), now());
             set num=num+1;
     end while;
end $$
delimiter ;
-- 执行存储过程
call pro();

-- 删除临时表
DROP TABLE IF EXISTS temp;

参考:

mysql分组取最大(最小、最新、前N条)条记录

MySql存储过程及MySql常用流程控制语法

MySQL存储过程

mysql取出每个分组中最新的记录

转载于:https://www.cnblogs.com/hongdada/p/10197459.html

MySQL中的SQL拼接通常指的是构建动态SQL查询的过程。在实际应用中,这通常是根据特定条件、用户输入或者其他数据源生成的SQL语句部分需要在运行时动态组合起来。这种技术非常有用,在处理复杂的数据库操作或者根据外部信息动态调整查询需求时。 ### SQL拼接的基本步骤: 1. **确定拼接内容**:首先明确你需要在SQL语句中添加哪些元素,比如`WHERE`子句中的条件、`JOIN`子句的表名等。 2. **字符串变量准备**:将拼接的内容转换成字符串形式,并准备好用于拼接。例如,如果需要基于用户输入添加过滤条件,你可以先收集用户的输入并将其保存到字符串变量中。 3. **使用字符串连接符**:在MySQL中,可以使用单引号 `' ' ` 或双引号 `" "` 进行字符串连接。为了安全地插入值避免SQL注入,推荐使用预处理语句或者参数化查询而不是简单地将字符串拼接到SQL语句中。 4. **使用预处理语句或参数化查询**:这种方式更安全,因为它自动处理了转义和输入验证的问题。例如: ```sql $stmt = $pdo->prepare("SELECT * FROM table_name WHERE column_name = :value"); $stmt->execute(['value' => $input_value]); ``` 5. **执行最终的SQL语句**:最后,通过适当的函数(如`prepare()`和`execute()`)执行拼接后的完整SQL语句。 ### 示例: 假设我们有一个表`users`,并且我们需要根据用户名筛选出用户记录。 ```php <?php // 假设$username是由用户输入得到的 $username = $_GET['username']; try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = "SELECT * FROM users WHERE username = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$username]); // 输出结果 while ($row = $stmt->fetch()) { echo "ID: " . $row['id'] . ", Username: " . $row['username']; } } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); } ?> ``` 在这个例子中,我们通过PHP脚本动态地创建了一个SQL查询,并利用了PDO库的安全特性来防止SQL注入攻击。 ### 相关问题: 1. 如何在MySQL中安全地执行拼接SQL查询? 2. 预处理语句和直接字符串拼接相比有哪些优势? 3. 当处理敏感数据时,如何进一步提高SQL查询的安全性? 通过以上解答和讨论,希望你能更好地理解MySQL中SQL拼接的基础知识及其安全性考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值