本文主要用来记录开发工作中各种实用的sql
指定id范围修改数据
背景
我们在生产环境中,出于安全高效的考虑,我们可能会使用yearning等sql审批平台,处于安全考虑,一般会限制每条语句的影响行数要小于200000,那么如果全表数据大于200000,则需要按id范围划分为多个sql进行处理
例如
存在表net_type,定义如下
CREATE TABLE `net_type` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`vin` varchar(17) NOT NULL DEFAULT '' COMMENT 'vin',
`iccid` varchar(32) NOT NULL DEFAULT '' COMMENT 'iccid',
`net_type` varchar(10) NOT NULL DEFAULT '' COMMENT '网络类型'
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_iccid` (`iccid`) COMMENT 'iccid唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sim卡网络类型';
需要修改所有记录的net_type字段,如果该字段的值为1,就将值修改为’5G’,如果该字段的值为0,就将值修改为’4G’,否则不做处理,那么对应的sql如下
UPDATE net_type
SET net_type = CASE
WHEN net_type = '1' THEN '5G'
WHEN net_type = '0' THEN '4G'
ELSE net_type
END
WHERE id BETWEEN 1 AND 150001;
CASE子句的用法
CASE 子句在 SQL 中是一种条件表达式,它允许在 SQL 语句中进行条件逻辑判断。CASE 子句可以在 SELECT 语句、INSERT 语句、UPDATE 语句、DELETE 语句的 WHERE 子句中
UPDATE 语句中使用 CASE
如上文的例子,值得注意的是,ELSE net_type表示如果前两个条件都不符合就不做修改
UPDATE net_type
SET net_type = CASE
WHEN net_type = '1' THEN '5G'
WHEN net_type = '0' THEN '4G'
ELSE net_type
END
WHERE id BETWEEN 1 AND 150001;
SELECT 语句中使用 CASE
假设有一个名为 employees 的表,其中包含 id、name 和 salary 字段,我们可以使用 CASE 子句来根据员工的薪水范围来分类他们:
SELECT id, name, salary,
CASE
WHEN salary <= 3000 THEN 'Low'
WHEN salary BETWEEN 3001 AND 7000 THEN 'Medium'
WHEN salary > 7000 THEN 'High'
ELSE 'Not Specified'
END AS SalaryLevel
FROM employees;