SELECT table_name 表名, table_comment 表说明 FROM information_schema.TABLES WHERE table_schema ='要查询的库' ORDERBY table_name;
rank
某个库所有表添加共同列
1 2 3 4 5 6 7 8
SELECT concat( 'ALTER TABLE ', table_schema, '.', table_name, ' ADD COLUMN te_id varchar(64) COMMENT "租户id", ADD COLUMN bran_id varchar(64) COMMENT "品牌id"; ' ) FROM information_schema.TABLES t WHERE table_schema ='table_name';
某个库的所有表共同列初始化值
1 2 3 4 5 6
SELECT concat( 'update ', table_schema, '.', table_name, ' set te_id = "C001",bran_id = 100;' ) s FROM information_schema.TABLES t WHERE table_schema ='table_name';
select
根据值(条件)查不同字段(列)
1 2 3 4 5 6 7 8 9 10
SELECT sbi.goods_code, sbi.goods_name, case sbi.is_review_stock when1then sbi.review_theoretical_count when0then sbi.theoretical_count end theoretical_count FROM sexytea_pss.t_item sbi WHERE AND sb.`status` = "FINISHED" AND sb.commit_time > "2022-10-31 12:00:00"
对比两列值差集(A-B)
1 2 3 4 5 6 7
SELECT a.code FROM a LEFTJOIN b ON a.code = b.code WHERE b.code ISNULL;
查询所有非系统库的表的注释
1 2 3 4 5 6 7 8 9 10
SELECT table_schema 库名, table_name 表名, table_comment 表说明 FROM information_schema.TABLES WHERE table_schema notin ('mysql','information_schema','performance_schema','sys') ORDERBY table_name;
查询某个库所有表及字段的注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT a.table_name 表名, a.table_comment 表说明, b.COLUMN_NAME 字段名, b.column_comment 字段说明, b.column_type 字段类型, b.column_key 约束 FROM information_schema.TABLES a LEFTJOIN information_schema.COLUMNS b ON a.table_name = b.TABLE_NAME WHERE a.table_schema ='要查询的库' ORDERBY a.table_name
查询某表的所有字段的注释,按照字段顺序排列
1 2 3 4 5 6 7 8 9 10 11 12
SELECT COLUMN_NAME 列名, COLUMN_COMMENT 描述, COLUMN_TYPE 数据类型, if(IS_NULLABLE ='NO', 'NO','') AS'是否为空', COLUMN_KEY AS'约束条件' FROM information_schema.COLUMNS WHERE TABLE_SCHEMA ='要查询的库' AND table_name ='要查询的表' ORDERBY ORDINAL_POSITION;
SELECT CONCAT( 'ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) FROM information_schema.TABLES WHERE TABLE_SCHEMA ='库名' AND table_name IN ( 'hr_test', 'hr_test2' )
SELECT CONCAT( 'ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci', ( CASEWHEN IS_NULLABLE ='NO'THEN' NOT NULL'ELSE''END ), ' comment "', column_comment,'";' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA ='库名' AND DATA_TYPE ='varchar' AND ( CHARACTER_SET_NAME !='utf8mb4'OR COLLATION_NAME !='utf8mb4_unicode_ci' ) AND table_name in( 'test' );
修改某个字段中的某些内容
1 2
# 将字段body_content_name中的,替换为| update bpm_matrix_body set body_content_name = replace(body_content_name,',','|');
用一张表的字段更新另一张表的字段
1 2 3 4 5
UPDATE mdm_uat.mdm_dept d1, test.mdm_dept d2 SET d1.wx_dept_id = d2.wx_dept_id WHERE d1.dept_code = d2.dept_code
用一张表的数据修改另一张表的数据逐条生成sql语句
1 2 3 4 5 6 7 8 9 10 11 12
# 角色id生成关闭用户sql SELECT concat( 'update mds.user user u set u.status = 3 where u.id = "', temp.u_id, '";' ) FROM ( SELECT r.u_id FROM role r WHERE r.id IN ( "12" ) ) temp;
batch update
update set when then
insert into values on duplicate key update
replace into values
临时表 or 分区表
for 循环
优点
灵活性高,不会重置自增ID
SQL简单
缺点
sql复杂,速度比insert into 慢
速度快
1.唯一索引相同时,先删除再插入,重置自增ID 2.速度比insert略慢
可能会增加查询复杂度
速度慢
场景
更新字段少
大型表或需要高效批量更新
?
update set when then, set when then where
1 2 3 4 5 6 7
UPDATE users SET last_name =CASE WHEN user_id =1THEN'Doe' WHEN user_id =2THEN'Smith' WHEN user_id =3THEN'Johnson' END WHERE user_id IN (1, 2, 3);
1 2 3 4 5 6 7 8 9 10 11 12 13 14
update t_item <trimprefix="set"suffixOverrides=","> <trimprefix="actual_receive = case"suffix="end,"> <foreachcollection="list"item="item"index="index"> <iftest="item.actualReceive != null"> when sku_code = #{item.skuCode} then #{item.actualReceive} </if> </foreach> </trim> </trim> where <foreachcollection="list"index="index"item="item"separator="or"> order_id = #{item.orderId} </foreach>
insert into values … on duplicate key update
1 2 3 4 5 6 7 8
<insertid="batchUpdateUsers"parameterType="java.util.List"> INSERT INTO user (id, name, age) VALUES <foreachcollection="list"item="item"index="index"separator=","> (#{item.id}, #{item.name}, #{item.age}) </foreach> ON DUPLICATE KEY UPDATE name=VALUES(name), age=VALUES(age) </insert>
REPLACE INTO … VALUES
是一个删除和插入的组合操作,当新记录与现有记录具有相同的唯一键值时,它会删除现有记录并插入新记录。
在插入新记录时重置自增ID的值
1 2 3 4 5 6
<insertid="batchReplaceUsers"parameterType="java.util.List"> REPLACE INTO user (id, name, age) VALUES <foreachcollection="list"item="item"index="index"separator=","> (#{item.id}, #{item.name}, #{item.age}) </foreach> </insert>
临时表
减少原始表上的连接和过滤操作,从而提高效率。
1 2 3 4 5 6 7 8 9
CREATE TEMPORARY TABLE temp_users SELECT* FROM users;
UPDATE users SET last_name ='Doe' WHERE user_id IN (SELECT user_id FROM temp_users);
DROP TEMPORARY TABLE temp_users;
for循环
1 2 3 4 5
<updateid="updateUserAge"parameterType="java.util.List"> <foreachcollection="list"item="user"separator=";"> UPDATE user SET age = #{user.age} WHERE id = #{user.id} </foreach> </update>
WITHRECURSIVE sys_dept_sub AS ( SELECT dept_id AS rootId FROM dept WHERE dept_id = #{deptId} UNIONALL SELECT dept_id FROM dept r, sys_dept_sub d WHERE r.parent_id = d.rootId AND is_del =0 ) SELECT dept_id FROM dept WHERE EXISTS ( SELECT rootId FROM sys_dept_sub t WHERE rootId = dept_id )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
WITHRECURSIVE temp AS ( SELECT * FROM mdm_post WHERE post_code = #{postCode} AND is_del =0UNION DISTINCTSELECT d.* FROM mdm_post d INNERJOIN temp t ON d.parent_code = t.post_code AND d.is_del =0 ) SELECTDISTINCT post_code FROM temp