前言:
在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果。本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索出更多的可能性哦。
注意:适用于5.7版本,其他版本可能稍许不同。
1.CONCAT函数介绍
授人以鱼不如授人以渔,拼接SQL主要用到的是CONCAT函数,我们先来介绍下该函数的用法。
CONCAT(s1,s2...,sn) 是合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个,若有任何一个参数为 NULL,则返回值为 NULL。当拼接字符串中有 ' 时,要用 \ 转义,貌似用两个单引号也行,不过还是推荐用 \ 转义,下面用几个示例来了解下CONCAT函数的用法。
mysql> SELECT CONCAT('MySQL','5.7'),CONCAT('MySQL',NULL),CONCAT('\'MySQL\'');
+-----------------------+----------------------+---------------------+
| CONCAT('MySQL','5.7') | CONCAT('MySQL',NULL) | CONCAT('\'MySQL\'') |
+-----------------------+----------------------+---------------------+
| MySQL5.7 | NULL | 'MySQL' |
+-----------------------+----------------------+---------------------+复制
简单介绍完CONCAT函数的使用方法后,下面分享几个用到SQL拼接的场景,也许在你工作中会用到哦。
2.拼接查询所有用户
SELECT DISTINCT
CONCAT('User: \'',USER,'\'@\'',
HOST,'\';') AS QUERY
FROM
mysql.USER;复制
3.拼接创建用户的语句
# 有密码字符串 在其他实例执行 可直接创建出与本实例相同密码的用户
SELECT
CONCAT('create user \'',user,'\'@\'',
Host,'\' IDENTIFIED BY PASSWORD \'',
authentication_string,'\';') AS CreateUserQuery
FROM
mysql.user
WHEREUser NOT IN ('root','mysql.session','mysql.sys');
# 这样拼接也可以 带有密码认证插件
SELECT
CONCAT('create user \'',user,'\'@\'',
Host,'\' IDENTIFIED WITH \'',
plugin,'\' AS \'',
authentication_string,'\';') AS CreateUserQuery
FROM
mysql.user
WHEREUser NOT IN ('root','mysql.session','mysql.sys');复制
4.拼接show grants语句查询用户权限
SELECT
CONCAT('show grants for \'',user,'\'@\'',
Host,'\';') AS ShowGrants
FROM
mysql.user
WHEREUser NOT IN ('root','mysql.session','mysql.sys');复制
5.拼接创建数据库语句
SELECT
CONCAT('create database if not exists ','', SCHEMA_NAME,'',' DEFAULT CHARACTER SET ',
DEFAULT_CHARACTER_SET_NAME,';') AS CreateDatabaseQuery
FROM
information_schema.SCHEMATA
WHERE
SCHEMA_NAME NOT IN ('information_schema','performance_schema','mysql','sys');复制
6.拼接DROP table
SELECT
CONCAT('DROP table ',
TABLE_NAME,';')
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = 'testdb' and TABLE_TYPE = 'BASE TABLE';复制
7.拼接kill连接
# 可以组合改变条件
SELECT
concat( 'KILL ', id, ';' )
FROM
information_schema.PROCESSLIST
WHERE
STATE LIKE 'Sending data';
SELECT
concat( 'KILL ', id, ';' )
FROM
information_schema.PROCESSLIST
WHERE
Command = 'Sleep'
AND TIME > 2000;复制
8.查看数据库大小
# 查看整个实例大小
SELECT
concat( round( sum( data_length 1024 1024 ), 2 ), 'MB' ) AS data_length_MB,
concat( round( sum( index_length 1024 1024 ), 2 ), 'MB' ) AS index_length_MB
FROM
information_schema.TABLES;
# 查看各个库大小
SELECT
TABLE_SCHEMA,
concat( TRUNCATE ( sum( data_length )/ 1024 1024, 2 ), ' MB' ) AS data_size,
concat( TRUNCATE ( sum( index_length )/ 1024 1024, 2 ), 'MB' ) AS index_size
FROM
information_schema.TABLES
GROUP BY
TABLE_SCHEMA
ORDER BY
data_length DESC;复制
9.查找表碎片
SELECT t.TABLE_SCHEMA,
t.TABLE_NAME,
t.TABLE_ROWS,
concat(round(t.DATA_LENGTH 1024 1024, 2), 'M') AS size,
t.INDEX_LENGTH,
concat(round(t.DATA_FREE 1024 1024, 2), 'M') AS datafree
FROM information_schema.tables t
WHERE t.TABLE_SCHEMA = 'testdb' order by DATA_LENGTH desc;复制
10.查找无主键表及增加自增ID作为主键
# 查找出无主键的表
SELECT
t1.table_schema,
t1.table_name
FROM
information_schema.TABLES t1
LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA
AND t1.table_name = t2.TABLE_NAME
AND t2.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
t2.table_name IS NULL
AND t1.TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys'
) ;
# 拼接出增加自增ID作为主键的SQL
SELECT
CONCAT('ALTER TABLE ',t1.table_schema,'.',t1.table_name,' ADD COLUMN increment_id INT UNSIGNED NOT NULL auto_increment COMMENT \'自增主键\' PRIMARY KEY FIRST;')
FROM
information_schema.TABLES t1
LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA
AND t1.table_name = t2.TABLE_NAME
AND t2.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
t2.table_name IS NULL
AND t1.table_type = 'BASE TABLE'
AND t1.TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys'
) ;复制
11.查找大写表及转为小写表
# 若lower_case_table_names=0可能导致表名既有大写又有小写,
# 想将lower_case_table_names设为1的话 需要先将大写的表和视图名称改为小写的。
# 查找出名称为大写的表和视图
SELECT
TABLE_SCHEMA,
TABLE_NAME,
TABLE_TYPE
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA NOT IN ( 'information_schema', 'sys', 'mysql', 'performance_schema' )
AND TABLE_NAME REGEXP BINARY '[A-Z]';
# 拼接出大写表名改为小写的SQL
SELECT
CONCAT( 'rename table ', TABLE_SCHEMA, '.', TABLE_NAME, ' to ', TABLE_SCHEMA, '.', LOWER( TABLE_NAME ), ';' )
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA NOT IN ( 'information_schema', 'sys', 'mysql', 'performance_schema' )
AND TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME REGEXP BINARY '[A-Z]';复制
配置文件
[mysqld]
user=mysql
basedir=/data/app/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
#log_error=/tmp/mysql.log
#default_storage_engine=InnoDB
#开启日志
server_id=6 #主机id
log_bin=/data/3306/logs/mysql-bin #开关+文件路径+文件名浅醉
#设置共享表空间2-3个,大小建议512M或者1G,最后一个定制为自动扩展。
innodb_data_file_path=ibdata1:76M;ibdata2:12M;ibdata3:30M:autoextend
##------------------------------------------
#打开独立undo模式,并设置undo的个数。
#innodb_undo_tablespaces=3
#undo日志的大小,默认1G。
#innodb_max_undo_log_size=128M
#开启undo自动回收的机制(undo_purge)。
#innodb_undo_log_truncate=ON
#触发自动回收的条件,单位是检测次数。
#innodb_purge_rseg_truncate_frequency=32
##------------------------------------------------
##生产建议: 512M-4G 2-4组 记录数据页的变化。实现“前进”的功能
innodb_log_file_size=100M
innodb_log_files_in_group=3
#
##用来缓冲、缓存,MySQL的数据页和索引页 物理内存的:50-80%。
innodb_buffer_pool_size=256M
##来缓冲 redo log日志信息。和innodb_log_file_size有关,1-N倍
innodb_log_buffer_size=33554432
##作用: 存储临时表。
innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:128M:autoextend:max:500M
##用来缓冲、缓存
innodb_buffer_pool_size=256M
##用来缓冲 redo log日志信息。
innodb_log_buffer_size=33554432
autocommit=0
#transaction_isolation=READ-UNCOMMITTED
#transaction_isolation=READ-COMMITTED
#错误日志
log_error=/data/3306/logs/mysql.err
#gtid_的开启
gtid_mode=ON
#强制GTID一致性
enforce_gtid_consistency=ON
#强制从库更新binlog
log_slave_updates=ON
#慢日志开启查询
slow_query_log=1
slow_query_log_file=/data/3306/logs/slow.log
long_query_time=0.1
log_queries_not_using_indexes=1
[mysql]
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=db01_5.7 [\d]>
[client]
socket=/tmp/mysql.sock
复制
文章转载自佐伊猫玖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1484次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
551次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
506次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
442次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
430次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
372次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
347次阅读
2025-04-01 08:47:17
墨天轮个人数说知识点合集
JiekeXu
325次阅读
2025-04-01 15:56:03
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
317次阅读
2025-03-28 16:28:31
MySQL8.0直方图功能简介
Rock Yan
260次阅读
2025-03-21 15:30:53