Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql常用脚本

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排序规则选择建议

  1. ‌utf8mb4_0900_ai_ci‌:MySQL 8.0默认规则,基于Unicode 9.0标准,支持扩展的语境敏感排序和大小写/重音忽略(ai),适用于多语言混合场景。‌
  2. ‌utf8mb4_unicode_ci‌:兼容性更广,准确性略高但性能稍逊于0900系列,适合需要严格遵循Unicode排序标准的场景。‌‌
  3. ‌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状态

参数解释:

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常用脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文