连接更新 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;