【MySQL】常用拼接语句

前言:在MySQL中 CONCAT ()函数用于将多个字符串连接成一个字符串,利用此函数我们可以将原来一步无法得到的sql拼接出来,在工作中也许会方便很多,下面主要介绍下几个常用的场景。

注:适用于5.7版本 低版本可能稍许不同。

1.拼接查询所有用户
mysql">SELECT DISTINCT
CONCAT(
'User: \'',
USER,
'\'@\'',
HOST,
'\';'
) AS QUERY
FROM
mysql.USER;
# 当拼接字符串中出现'时 需使用\转义符
2.拼接DROP table


SELECT
CONCAT(
'DROP table ',
TABLE_NAME,
';'
)
FROM
information_schema. TABLES
WHERE
TABLE_SCHEMA = 'test';
3.拼接kill连接


SELECT
concat('KILL ', id, ';')
FROM
information_schema. PROCESSLIST
WHERE
STATE LIKE 'Creating sort index';
4.拼接创建数据库语句


SELECT
CONCAT(
'create database ',
'`',
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'
);
5.拼接创建用户的语句


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'
);
#有密码字符串哦 在其他实例执行 可直接创建出与本实例相同密码的用户
6.导出权限脚本 这个shell脚本也用到了拼接


#!/bin/bash
#Function export user privileges pwd=yourpass
expgrants()
{
mysql -B -u'root' -p${pwd} -N $@ -e "SELECT CONCAT( 'SHOW GRANTS FOR ''', user, '''@''', host, ''';' ) AS query FROM mysql.user" | \
mysql -u'root' -p${pwd} $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/-- \1 /;/--/{x;p;x;}'
} expgrants > /tmp/grants.sql
echo "flush privileges;" >> /tmp/grants.sql
7.查找表碎片


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 = 'test' order by DATA_LENGTH desc;
8.查找无主键表 这个没用到拼接 也分享出来吧


#查找某一个库无主键表
SELECT
table_schema,
table_name
FROM
information_schema.TABLES
WHERE
table_schema = 'test'
AND TABLE_NAME NOT IN (
SELECT
table_name
FROM
information_schema.table_constraints t
JOIN information_schema.key_column_usage k USING (
constraint_name,
table_schema,
table_name
)
WHERE
t.constraint_type = 'PRIMARY KEY'
AND t.table_schema = 'test'
); #查找除系统库外 无主键表
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'
) ;

#########PS:

mysql 查询后不显示标题
2018年10月22日 15:48:00 weixin_33872566 阅读数 2
mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb

直接进入命令行,select,是有|显示的格式的。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb<1.sql

这样使用批处理的方式执行,显示是没有|的。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb -t<1.sql

如果增加了-t命令项,则会显示|格式

如果使用-vvv选项,则会回显命令。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb -N<1.sql

如果使用-N选项,则不显示标题。

在mysql命令行下,可以直接执行批处理文件。

mysql>. 1.sql
作者:mydriverc2
来源:CSDN
原文:https://blog.csdn.net/mydriverc2/article/details/38895395

###3

https://www.cnblogs.com/wangkangluo1/archive/2012/04/27/2472898.html

shell 下执行mysql 命令

 

原文链接

在shell开发中,很多时候我们需要操作mysql数据库(比如:查询数据、导出数据等),但是我们又无法进入mysql命令行的环境,就需要在shell环境中模拟mysql的环境,使用mysql相关命令,本文总结几种shell操作mysql的方法,供大家参考。

方案1

  1. mysql -uuser -ppasswd -e"insert LogTable values(...)"
优点:语句简单
缺点:支持的sql相对简单
 

方案2

准备一个sql脚本,名字为update.sql,例如:
  1. CREATE TABLE `user` (
  2. `id` varchar(36) NOT NULL COMMENT '主键',
  3. `username` varchar(50) NOT NULL COMMENT '用户名',
  4. `password` varchar(50) NOT NULL COMMENT '用户密码',
  5. `createdate` date NOT NULL COMMENT '创建时间',
  6. `age` int(11) NOT NULL COMMENT '年龄',
  7. PRIMARY KEY  (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  9. DROP TABLE IF EXISTS `visit_log`;
  10. CREATE TABLE `visit_log` (
  11. `id` varchar(36) character set utf8 NOT NULL,
  12. `type` int(11) NOT NULL,
  13. `content` text character set utf8 NOT NULL,
  14. `createdate` date NOT NULL,
  15. PRIMARY KEY  (`id`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='访问日志';
 新建一个update_mysql.sh,内容如下:
  1. use chbdb;
  2. source update.sql
 
然后执行如下命令:
  1. cat update_mysql.sh | mysql --user=root -ppassword
优点:支持复杂的sql脚本
缺点:
1> 需要两个文件:update.sql和update_mysql.sh
2> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。

方案3

    新建一个shell脚本,格式如下:
  1. #!/bin/bash
  2. mysql -u* -h* -p* <<EOF
  3. Your SQL script.
  4. EOF
例如:
  1. #!/bin/bash
  2. mysql -uroot  -ppassword <<EOF
  3. use chbdb;
  4. CREATE TABLE user (
  5. id varchar(36) NOT NULL COMMENT '主键',
  6. username varchar(50) NOT NULL COMMENT '用户名',
  7. password varchar(50) NOT NULL COMMENT '用户密码',
  8. createdate date NOT NULL COMMENT '创建时间',
  9. age int(11) NOT NULL COMMENT '年龄',
  10. PRIMARY KEY  (`id`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
优点:
1>支持复杂的sql脚本
2>无需其它额外文件
缺点:
1> 表名、字段不能使用单引号,需要修改原有sql语句
2> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。

方案4

准备一个sql脚本,如update.sql,然后执行如下命令:
  1. mysql -uroot -ppassword < update.sql
优点:支持复杂的sql脚本
缺点:
1> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。
 
 
    大家知道在mysql命令行中使用source命令,即使中间出错,后续脚本也会继续执行,但是如上几种方式,均无法解决该问题,如果大家有好的建议,请回复,谢谢。

转 【MySQL】常用拼接语句 shell 下执行mysql 命令的更多相关文章

  1. shell 下执行mysql 命令

    From: http://blog.csdn.net/beginning1126/article/details/8590014 方案1 mysql -uuser -ppasswd -e 优点:语句简 ...

  2. mysql 常用 sql 语句 - 快速查询

    Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互         1.1.1 mysql 连接             mysql.exe -hPup    ...

  3. MySQL常用经典语句

    http://www.cnblogs.com/see7di/archive/2010/04/27/2239909.html MySQL常用经典语句 .重命名表ALTER TABLE tbl1 RENA ...

  4. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  5. Mysql常用sql语句(二)- 操作数据表

    21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...

  6. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  7. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  8. Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  9. 23个MySQL常用查询语句

    23个MySQL常用查询语句 一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!> ...

随机推荐

  1. 移动端开发-viewport与媒体查询

    首先要知道,在移动开发中,手机的浏览器会默认网页是为宽屏而设计的,它会缩小整个页面来适应屏幕. 1. 不使用viewport出现的问题 提到响应式设计,大家首先想到的可能是 Bootstrap , @ ...

  2. Spring Boot MyBatis 通用Mapper 自动生成代码

    一.在pom.xml文件中进入mybatis自动生成代码相关的jar包: 注意: <configurationFile>标签中配置的是“generatorConfig.xml”文件位置. ...

  3. 有关 Java (jackson包问题 ,MappingJacksonHttpMessageConverter 和 MappingJackson2HttpMessageConverter问题)

    今天这一系列问题吃掉我四个小时,所以现在吸收掉. 一. 整理所有错误信息: 1.错误信息:java.lang.NoClassDefFoundError: Could not initialize cl ...

  4. LightOJ - 1410 - Consistent Verdicts(规律)

    链接: https://vjudge.net/problem/LightOJ-1410 题意: In a 2D plane N persons are standing and each of the ...

  5. SpringBoot官方文档学习(三)配置文件、日志、国际化和JSON

    一.Profiles Spring配置文件提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用.任何@Component.@Configuration或@ConfigurationPr ...

  6. 在golang中使用json

    jsoniter高性能json库 非常快,支持java和go marshal使用的一些坑 package main import ( "encoding/json" "f ...

  7. webuploader+php如何实现分片+断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  8. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/usr/local/mysql/mysql.sock' (2)

    这种情况一般是mysql被杀掉了. 要重新启动. ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了    

  9. 常见的div布局

    1.一列固定宽度且居中 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. GSS4 D - Can you answer these queries IV

    //给你一个序列,有两种操作: //1.给定x和y,将区间[x,y]内的数开方 //2.询问区间和 // // 因为一个longlong类型的数最多开6次方就变成了1,所以对于1操作,我们暴力修改, ...