mysql 去重 补全 取出重复 变量 函数 和存储过程

连接更新 UPDATE JOIN SET

sql 复制代码
UPDATE Sheet4 us
JOIN (

	
	) temp ON us.id = temp.id
	
	SET us.`name` = temp.`name`;

补全查询 COALESCE LAG OVER

sql 复制代码
SELECT
	id,
	COALESCE (NAME,LAG( NAME ) OVER ( ORDER BY id ))
FROM
	users
	
源数据:
张三	1
	 2
	 3
李四	4
	 5
	 6
	 7
补全后的:,仅仅是在 第一个数据下面进行了补全
1	张三
2	张三
3	
4	李四
5	李四
6	
7	
复制代码
coalesce
v.
<正式>合并,联合;使(元素)结合

coalescence
n.
合并;联合;接合

lag
v.
掉队,落后于;给(管道等)加防冻保暖层;<非正式>使入狱,逮捕
n.
(两件事的)时间间隔;<英,非正式>囚犯,惯犯;相位滞后;绝热层,保温套;桶板
adj.
最后的
更新和补全合并
java 复制代码
						UPDATE Sheet4 us
						JOIN (
							SELECT
								us2.id,
								COALESCE (
									us2.NAME,
								LAG( us2.NAME ) OVER ( ORDER BY us2.id )) AS NAME 
							FROM
								Sheet4 us2 
							) temp ON us.id = temp.id 
							SET us.`name` = temp.`name`;

使用变量从数据从1开始赋值 SET

sql 复制代码
SET @counter = 0;
UPDATE Sheet2 
SET id = ( @counter := @counter + 1 );
sql 复制代码
SET i = 0;
UPDATE Sheet2 
SET id = ( i := i + 1 );

ROW_NUMBER 根据 一个字段 取1-到结尾

sql 复制代码
    SELECT 
        ROW_NUMBER() OVER (ORDER BY id) AS rowNumber,
        id, name
    FROM users
  • 如果根据age,那age 最小的就 row Number就是1

循环 while

sql 复制代码
SET @i = 1;  -- 初始化计数器

WHILE @i <= 50 DO

  -- 增加计数器
    SET @i = @i + 1;
END WHILE;

存储过程 loop

sql 复制代码
DELIMITER $$

CREATE PROCEDURE loop_test()
BEGIN
	-- 定义变量,默认为1
    DECLARE i INT DEFAULT 1;

    -- 循环 50 次
    loop_start:
        IF i <= 50 THEN
            -- 在此处插入你希望执行的 SQL 语句,例如插入数据
            -- INSERT INTO your_table (column_name) VALUES (i);
						
            -- 增加循环计数器
            SET i = i + 1;
			
			-- 这里chat写的有bug,应该 i>50 的时候,才跳出
            -- 跳回循环开始
            LEAVE loop_start;
        END IF;
    END LOOP;
END $$

DELIMITER ;

CALL loop_test();

WITH 临时表的使用

  • 和 只运行 里面的COALESCE SQL 是一样的,不清楚
sql 复制代码
WITH FillNames AS (
    SELECT
        id,
        -- 使用 LAST_VALUE 来填充 NULL 值, PARTITION BY 是为了根据 id 排序并填充
        COALESCE(name, LAG(name) OVER (ORDER BY id )) AS filled_name,
        age
    FROM users
)
-- 返回填充后的结果
SELECT
    id,
    filled_name AS name,
    age
FROM FillNames;

删除一周内的数据

sql 复制代码
DELETE FROM t_second
WHERE 
create_time < NOW() - INTERVAL 1 WEEK;
-- 创建时间 < 当前时间 - 1周

删除重复

复制代码
id	name age
6	王五	6
7	王五	6
查询到重复的数据(随机或指定)
  • 注意 不管怎么查,只能查出一条
sql 复制代码
SELECT id FROM users GROUP BY `name`, age HAVING COUNT(*) > 1 
  • 指查询 最大的ID
sql 复制代码
SELECT max(id) id FROM users GROUP BY `name`, age HAVING COUNT(*) > 1
1. 使用delete from join删除
sql 复制代码
DELETE t1
FROM
	users t1
	JOIN ( 
	
	) t2 ON t1.id = t2.id
2. 使用临时表删除重复
sql 复制代码
-- 创建一个临时表存储重复的用户id
CREATE TEMPORARY TABLE temp_ids AS
SELECT u2.id
FROM users u2
GROUP BY u2.name, u2.age
HAVING COUNT(*) > 1;

-- 删除用户表中id在临时表中的记录
DELETE FROM users
WHERE id IN (SELECT id FROM temp_ids);

-- 删除临时表
DROP TEMPORARY TABLE temp_ids;
where条件不能 是同一个表

MySQL 不允许在 DELETE 语句中直接在 FROM 子查询中引用同一张表。

sql 复制代码
DELETE FROM users u1 WHERE u1.id in (
	SELECT u2.id
	FROM users u2
	GROUP BY u2.`name`, u2.age
	HAVING COUNT(*) > 1 
)
1093 - You can't specify target table 'u1' for update in FROM clause

NOT EXISTS 使用

框架
  • not exists 框架,where后直接跟上
sql 复制代码
SELECT NAME
FROM
	users s1 
WHERE
	NOT EXISTS (  
	
		)
条件
  • 注意:s1 是外层的 表
sql 复制代码
	SELECT
		1 
	FROM
		users s2 
	WHERE
		 s1.`name`  LIKE CONCAT( '%', s2.`name`, '%' )

使用 left join 和 not like 取出不同

sql 复制代码
SELECT
	s1.`name`,
	s1.合计,
	s2.合计 
FROM
	Sheet9 s1
	LEFT JOIN september s2 ON s1.`name` = s2.`name` 
WHERE
	s1.合计 NOT LIKE CONCAT('%',s2.合计,'%' )

trim去空格用法

sql 复制代码
	SELECT TRIM(' ' FROM '  Hello World  ') AS cleaned;
相关推荐
lang2015092826 分钟前
MySQL数据类型存储全解析
mysql
野猪亨利6671 小时前
Qt day1
开发语言·数据库·qt
siriuuus1 小时前
Linux MySQL 多实例部署与配置实践
linux·运维·mysql
本就一无所有 何惧重新开始1 小时前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki1371 小时前
qt day1
开发语言·数据库·qt
流星白龙1 小时前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风33661 小时前
HTTPS是如何确保安全的
网络·数据库
王木风2 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql
CryptoPP2 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
阿巴~阿巴~3 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos