mysql数据库常用脚本梳理总结
作者:fundoit
这篇文章主要介绍了mysql数据库常用脚本梳理总结的相关资料,文中通过代码详细介绍了创建表格、事务处理、全连接等16个核心操作,帮你快速掌握201个常用脚本,需要的朋友可以参考下
1、创建数据库
CREATE SCHEMA `new_schema` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;
字符集优选utf8mb4
MySQL 8.0已弃用utf8mb3,utf8mb4已作为默认字符集,并全面支持Unicode标准,能够满足现代应用对表情符号、罕见字符等场景的存储需求。MySQL 8.0对utf8mb4的排序算法(如utf8mb4_0900_ai_ci)进行了性能优化,查询效率优于旧版utf8mb3规则。
utf8mb4排序规则选择建议
- utf8mb4_0900_ai_ci:MySQL 8.0默认规则,基于Unicode 9.0标准,支持扩展的语境敏感排序和大小写/重音忽略(ai),适用于多语言混合场景。
- utf8mb4_unicode_ci:兼容性更广,准确性略高但性能稍逊于0900系列,适合需要严格遵循Unicode排序标准的场景。
- utf8mb4_general_ci:早期简化规则,仅支持基本排序逻辑,性能最优但准确性较低,适用于纯拉丁字符为主的场景。
2、创建表格
-- ---------------------------- -- Table structure for table -- ---------------------------- DROP TABLE IF EXISTS `table`; CREATE TABLE `table` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名', `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `tenant_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户id', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `idx_ut`(`username`, `tenant_id`) USING BTREE COMMENT '唯一索引' ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; CREATE TABLE `tb_dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `deptName` varchar(30) DEFAULT NULL COMMENT '部门名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; CREATE TABLE `tb_emp` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `empName` varchar(20) DEFAULT NULL COMMENT '员工名称', `deptId` int(11) DEFAULT '0' COMMENT '部门ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
3、查询数据
select `column` from `table` [where conditions] [limit N] -- 只返回N条记录 [offset M]; -- select语句开始查询的数据偏移量。默认情况下偏移量为0
4、like模糊搜索
select * from `table` where `field` like 'keyword%'; -- %匹配任意长度字符,匹配中文用%%
select * from `table` where `field` like 'keyword_'; -- _匹配任意单个字符
select * from `table` where `field` like 'keyword[?]'; -- 匹配满足?条件的单个字符,[^?]匹配不满足条件的单个字符
SELECT * FROM `table` WHERE `field` like 'keyword%' -- 可以用到索引
SELECT * FROM `table` WHERE `field` like '%keyword%' -- %没法用索引,避免使用
SELECT * FROM `table` WHERE LOCATE('keyword', `field`)>0 -- 可以用到索引,上面这句的替代方案
SELECT * FROM `table` WHERE POSITION('keyword' IN `filed`) -- 同上
SELECT * FROM `table` WHERE INSTR(`field`, 'keyword' )>0 -- 同上
SELECT * FROM `table` WHERE FIND_IN_SET('keyword',`field`); -- 同上

5、批量查看数据库各表容量大小
select table_schema as '数据库', table_name as '表名', table_rows as '记录数', truncate(data_length/1024/1024, 2) as '数据容量(MB)', truncate(index_length/1024/1024, 2) as '索引容量(MB)' from information_schema.tables where table_schema='new_schema' -- 数据库名 order by table_rows desc, index_length desc;
6、查询正在执行的sql语句和相关线程
show processlist; -- 查询正在执行的出前100条sql语句 show full processlist; -- 查询正在执行的完整sql语句 kill connection id -- 停掉processlist查询出的某个线程,id是对应的id号
**show processlist还能查看当前mysql连接数。**如果是root帐号,能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
7、全面查看到mysql状态
show status; -- 全面查看到mysql状态
参数解释:
- Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
- Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
- Connections 试图连接MySQL服务器的次数。
- Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
- Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
- Delayed_writes 用INSERT DELAYED写入的行数。
- Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
- Flush_commands 执行FLUSH命令的次数。
- Handler_delete 请求从一张表中删除行的次数。
- Handler_read_first 请求读入表中第一行的次数。
- Handler_read_key 请求数字基于键读行。
- Handler_read_next 请求读入基于一个键的一行的次数。
- Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
- Handler_update 请求更新表中一行的次数。
- Handler_write 请求向表中插入一行的次数。
- Key_blocks_used 用于关键字缓存的块的数量。
- Key_read_requests 请求从缓存读入一个键值的次数。
- Key_reads 从磁盘物理读入一个键值的次数。
- Key_write_requests 请求将一个关键字块写入缓存次数。
- Key_writes 将一个键值块物理写入磁盘的次数。
- Max_used_connections 同时使用的连接的最大数目。
- Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
- Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
- Open_tables 打开表的数量。
- Open_files 打开文件的数量。
- Open_streams 打开流的数量(主要用于日志记载)
- Opened_tables 已经打开的表的数量。
- Questions 发往服务器的查询的数量。
- Slow_queries 要花超过long_query_time时间的查询数量。
- Threads_connected 当前打开的连接的数量。
- Threads_running 不在睡眠的线程数量。
- Uptime 服务器工作了多少秒。
8、查看mysql相关地址
show variables where Variable_name in ('log_error','general_log','general_log_file','slow_query_log','slow_query_log_file','datadir','basedir','innodb_buffer_pool_size','performance_schema','version','character_set_database')

9、排序查询
select * from `table` order by `field` asc; -- 升序排列 select * from `table` order by `field` desc; -- 降序排列
10、分组查询
select `column` from `table`
[where conditions]
group by `column`; -- 按colume_name进行分组,不含重复数据
#查询多列重复的数据
SELECT `column1`,`column2`,count(*) FROM `table` GROUP BY `column1`,`column2` having count(*)>1
SELECT `material`,count(*) FROM `dwe_material_info` GROUP BY `material` having count(*)>1
#统计多列重复的行数
SELECT column1,column2, ROW_NUMBER() OVER (
PARTITION BY column1,column2
ORDER BY column1
) as row_num
FROM `table1`
11、交集查询
select column_name from tables [where conditions] union [all | distinct] //默认返回交集,不含重复数据,ALL返回所有交集数据 select column_name from tables [where conditions];
12、连接查询
select * from table_name1 inner join table_name2 on conditions; -- inner join(内连接,或等值连接):获取两个表中字段匹配关系的记录。 -- left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。 -- right join(右连接):用于获取右表所有记录,即使左表没有对应匹配的记录。
查询tb_dept表特有的地方
select t1.*,t2.empName,t2.deptId from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId WHERE t2.deptId IS NULL;
全连接
select t1.*,t2.empName,t2.deptId from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId UNION select t1.*,t2.empName,t2.deptId from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId
全不连接
查询两张表互不关联到的数据。
select t1.*,t2.empName,t2.deptId from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId WHERE t1.id IS NULL UNION select t1.*,t2.empName,t2.deptId from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId WHERE t2.deptId IS NULL
13、时间日期查询
查今天的数据
SELECT * FROM ms_consume WHERE DATE_FORMAT(NOW(),'%Y-%m-%d')=DATE_FORMAT(create_time,'%Y-%m-%d');-- 方式一 SELECT * FROM ms_consume WHERE TO_DAYS(now())=TO_DAYS(create_time);-- 方式二
日期之间时差
-- 场景:常用的倒计时场景
SELECT t1.*,
timestampdiff(SECOND,NOW(),t1.create_time) second_diff
FROM ms_consume t1 WHERE t1.id='9' ;
日期范围内平均值
-- 场景:指定日期范围内的平均消费,并排序。
SELECT * FROM
(
SELECT user_id,user_name,
AVG(consume_money) avg_money
FROM ms_consume t
WHERE t.create_time BETWEEN '2019-12-10 00:00:00'
AND '2019-12-18 23:59:59'
GROUP BY user_id
) t1
ORDER BY t1.avg_money DESC;
时间范围统计
-- 场景:统计近七日内,消费次数大于两次的用户。 SELECT user_id,user_name,COUNT(user_id) userIdSum FROM ms_consume WHERE create_time>date_sub(NOW(), interval '7' DAY) GROUP BY user_id HAVING userIdSum>1;
日期范围内首条数据
场景:产品日常运营活动中,经常见到这样规则:活动时间内,首笔消费满多少,优惠多少。
SELECT * FROM
(
SELECT * FROM ms_consume
WHERE create_time
BETWEEN '2019-12-10 00:00:00' AND '2019-12-18 23:59:59'
ORDER BY create_time
) t1
GROUP BY t1.user_id ;
14、更新数据
update `table`
set `column1`=value1,
`column2`=value2,
`column3`=value3
where conditions;
15、删数据
delete from table_name
[where conditions];
#删除多列重复的数据1️⃣
delete t1 from `table1` t1
INNER JOIN (
SELECT column1,column2 FROM `table1` GROUP BY column1,column2 having count(*)>1
) t2 ON t1.column1=t2.column1 and t1.column2=t2.column2;
#删除多列重复的数据2️⃣
delete t1 from `table1` t1
JOIN (
SELECT column1,column2, ROW_NUMBER() OVER (
PARTITION BY column1,column2
ORDER BY column1
) as row_num
FROM `table1`
) t2 ON t1.column1 = t2.column1 and t1.column2=t2.column2
WHERE t2.row_num > 1;
16、清空表
-- 方式1:快速删除表中的所有数据,并且重置自增计数器 truncate table your_table_name; -- 方式2:删除表中的所有数据,并且重置自增计数器 delete from your_table_name; alter table your_table_name AUTO_INCREMENT = 1;
17、插入数据
insert into table_name ( column_name1,column_name2,.....column_nameN ) values ( value1,value2,....valueN );
18、事务批量处理
START TRANSACTION; -- 执行删除语句 -- 检查结果 ROLLBACK; -- 或 COMMIT;
19、函数查询
查询父级名称
DROP FUNCTION IF EXISTS get_city_parent_name;
CREATE FUNCTION `get_city_parent_name`(pid INT)
RETURNS varchar(50) CHARSET utf8
begin
declare parentName VARCHAR(50) DEFAULT NULL;
SELECT city_name FROM ms_city_sort WHERE id=pid into parentName;
return parentName;
end
SELECT t1.*,get_city_parent_name(t1.parent_id) parentName FROM ms_city_sort t1 ;
查询根节点子级
DROP FUNCTION IF EXISTS get_root_child;
CREATE FUNCTION `get_root_child`(rootId INT)
RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
DECLARE resultIds VARCHAR(500);
DECLARE nodeId VARCHAR(500);
SET resultIds = '%';
SET nodeId = cast(rootId as CHAR);
WHILE nodeId IS NOT NULL DO
SET resultIds = concat(resultIds,',',nodeId);
SELECT group_concat(id) INTO nodeId
FROM ms_city_sort WHERE FIND_IN_SET(parent_id,nodeId)>0;
END WHILE;
RETURN resultIds;
END ;
SELECT * FROM ms_city_sort WHERE FIND_IN_SET(id,get_root_child(5)) ORDER BY id ;
总结
到此这篇关于mysql数据库常用脚本梳理总结的文章就介绍到这了,更多相关mysql常用脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
