mysql数据库拼接语句_巧用SQL拼接语句

前言:

在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接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`

WHERE

`User` NOT IN (

'root',

'mysql.session',

'mysql.sys'

);

# 这样拼接也可以 带有密码认证插件

SELECT

CONCAT(

'create user \'',

user,

'\'@\'',

Host,

'\' IDENTIFIED WITH \'',

plugin,

'\' AS \'',

authentication_string,

'\';'

) AS CreateUserQuery

FROM

mysql.`user`

WHERE

`User` NOT IN (

'root',

'mysql.session',

'mysql.sys'

);

4.拼接show grants语句查询用户权限

SELECT

CONCAT(

'show grants for \'',

user,

'\'@\'',

Host,

'\';'

) AS ShowGrants

FROM

mysql.`user`

WHERE

`User` 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]';

26da701a5155be4112c1c17cfaa4e4b0.png

MySQL中的SQL拼接通常指的是构建动态SQL查询的过程。在实际应用中,这通常是根据特定条件、用户输入或者其他数据源生成的SQL语句部分需要在运行时动态组合起来。这种技术非常有用,在处理复杂的数据库操作或者根据外部信息动态调整查询需求时。 ### SQL拼接的基本步骤: 1. **确定拼接内容**:首先明确你需要在SQL语句中添加哪些元素,比如`WHERE`子句中的条件、`JOIN`子句的表名等。 2. **字符串变量准备**:将拼接的内容转换成字符串形式,并准备好用于拼接。例如,如果需要基于用户输入添加过滤条件,你可以先收集用户的输入并将其保存到字符串变量中。 3. **使用字符串连接符**:在MySQL中,可以使用单引号 `' ' ` 或双引号 `" "` 进行字符串连接。为了安全地插入值避免SQL注入,推荐使用预处理语句或者参数化查询而不是简单地将字符串拼接SQL语句中。 4. **使用预处理语句或参数化查询**:这种方式更安全,因为它自动处理了转义和输入验证的问题。例如: ```sql $stmt = $pdo->prepare("SELECT * FROM table_name WHERE column_name = :value"); $stmt->execute(['value' => $input_value]); ``` 5. **执行最终的SQL语句**:最后,通过适当的函数(如`prepare()`和`execute()`)执行拼接后的完整SQL语句。 ### 示例: 假设我们有一个表`users`,并且我们需要根据用户名筛选出用户记录。 ```php <?php // 假设$username是由用户输入得到的 $username = $_GET['username']; try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = "SELECT * FROM users WHERE username = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$username]); // 输出结果 while ($row = $stmt->fetch()) { echo "ID: " . $row['id'] . ", Username: " . $row['username']; } } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); } ?> ``` 在这个例子中,我们通过PHP脚本动态地创建了一个SQL查询,并利用了PDO库的安全特性来防止SQL注入攻击。 ### 相关问题: 1. 如何在MySQL中安全地执行拼接SQL查询? 2. 预处理语句和直接字符串拼接相比有哪些优势? 3. 当处理敏感数据时,如何进一步提高SQL查询的安全性? 通过以上解答和讨论,希望你能更好地理解MySQLSQL拼接的基础知识及其安全性考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值