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;
相关推荐
程序员卷卷狗25 分钟前
MySQL 高可用方案:主从 + MHA + ProxySQL + PXC 的实战应用与架构思考
数据库·mysql·架构
千千寰宇1 小时前
[数据库/数据结构] LSM-Tree :结构化的日志合并树——NewSQL数据库的基石
数据库
韩立学长2 小时前
基于Springboot的研学旅游服务系统5u416w14(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
isNotNullX2 小时前
怎么理解ETL增量抽取?
数据库·数据仓库·etl·企业数字化
IT教程资源C2 小时前
(N_141)基于springboot,vue网上拍卖平台
mysql·vue·前后端分离·拍卖系统·springboot拍卖
谅望者2 小时前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
l1t2 小时前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
honortech2 小时前
MySQL 8 连接报错:Public Key Retrieval is not allowed
数据库·mysql
q***82912 小时前
MySQL--》如何通过选择合适的存储引擎提高查询效率?
数据库·mysql·adb