Mysql点滴

1、
mysql后台登录【前提:安装mysql客户端】
mysql -h$IP -u$用户名 -p$密码  -P端口 -D库名 -e"sql语句"
mysql执行sql脚本
mysql -h$IP -u$用户名 -p$密码  -P端口 -D库名 -e"sql语句" -N -s > file.sql

mysql后台登录指定字符编码:
mysql -h$IP -u$用户名 -p$密码  -P端口 --default-character-set=utf8

【-N表示不打印列名,-s表示静默模式;将查询表的数据重定向到file文件里】
如不加-s:
mysql -h$IP -u$用户名 -p$密码  -P端口 -D库名 -e"sql语句" -N
结果:
+------------+
NORMAL_FINISHED
+------------+

2、
数据库mysql创建自己的库:create database hudechao;
使用自己的库:use hudechao;
在自己的库下查看表: show tables;
注:以上都是在xshell后台登录mysql后的操作

4、
数据库随机函数rand()
select inv_cd,int(rand()+0.5) as ri from 表名;
注:查询表名的inv_cd字段值,并给每一个值赋值一个随机数ri,ri为随机产生的0或1
rand()+0.5 :随机结果为0或1

5、
插入表中的数据,来自查询另外一张表的某些列
insert into 表名 (列名1,列名2,列名3)select 列名4,列名5,列名6 from 表2;

6、
当在shell命令行执行mysql命令是提示:
mysql:[Warning] Using a password on command line interface can be insecure
表示在命令行输入了mysql的密码提示不安全
解决办法:
在当前执行路径下创建一个配置文件:config
内容:
[mysql]
user=root
password=123456

再执行:./mysql --defaults-extra-file=config -h IP -P3316 -D库名 -e"sql语句";
--defaults-extra-file=config 一定要在第一参数的位置

其它服务器连接mysql数据库:
可拷贝mysql二进制文件到该服务器某目录下:./mysql -h IP -u用户 -p密码 -P端口

7、
processlist命令的输出结果显示了有哪些线程在运行,可以检查当前数据库的运行状态,两种方式使用这个命令
①、进入mysql/bin目录下输入mysqladmin processlist; 
②、启动mysql,输入show full processlist; 
演示:
mysql> show full processlist; 
+—–+——–+—————–+————-+———+——+——-+———————–+ 
| Id | User | Host | db | Command | Time | State | Info | 
+—–+——–+—————–+————-+———+——+——-+———————–+ 
| 66 | dragon | localhost:47205 | dragon_test | Sleep | 242 | | NULL | 
| 128 | dragon | localhost:51278 | dragon_test | Sleep | 27 | | NULL | 
| 217 | dragon | localhost | dragon_test | Query | 0 | NULL | show full processlist | 
+—–+——–+—————–+————-+———+——+——-+———————–+
各列的含义和用途:(主要查看state列)
id:     一个标识 
user:   显示当前用户,如果不是root,这 个命令就只显示你权限范围内的sql语句。 
host:   显示这个语句是从哪个ip的哪个端口上发出的 
db:     显示 这个进程目前连接的数据库。 
command:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接 (connect)。 
time:   此这个状态持续的时间,单位是秒。 
state:  显示使用当前连接的sql语句的状态,只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成 
info:   显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

8、数据库备份及恢复:
首先备份数据到备份库里,源表得带上库名和日期区分;恢复至生产库时,先查询备份库表的数据是否正确,确认无误后才可做
恢复操作
举例:备份库名templog,源库名db_smsops
create table templog.t_sms_bizops_bak_20190710 (select * from db_smmops.t_sms_bizops t where t.is_effective=1);
或
create table templog.t_sms_bizops_bak_20190710 select * from db_smmops.t_sms_bizops t where t.is_effective=1;
或
create table templog.t_sms_bizops_bak_20190710 as select * from db_smmops.t_sms_bizops t where t.is_effective=1;

9、mysql对时间字段的转换设置,可显示超过24小时的时间如25:20:20
如下:计算job_end_time和job_start_time的差值,并转换成可显示25:20:20
CONVERT(TIMEDIFF(d.job_end_time,d,job_start_time),char(100)) as run_time;

10、shell查询mysql表的字段后遍历该字段值
select_sql="select id form 表名 where job_running_status not in ('NORMAL_FINISHED','CANCELED');"
./mysql -h10.132.17.15 -u用户 -p密码 -P端口 -D库名 -e"${select_sql}" > /tmp/id.txt 2>&1
for id in $(cat /tmp/id.txt)
do
   echo $id
done

11、mysql数据库查看库里的事务执行状态(即查看表有没有LOCK_WAIT状态):
select * from information_schema.INNODB_TRX;
查看LOCK具体信息:
select * from information_schema.INNODB_LOCKS;

12、
查询出某值后可将其赋值给一变量,然后使用此变量为另一字段更新值
set @smspasswd=(select passwd from t_user where username='sms');
select @smspasswd;
update t_user set passwd=@smspasswd where username='scheduler';

13、
首次安装后若使用数据库用户root无法在navicat连接,且无法在本机命令行使用-h10.133.56.11 这种指定IP的方式连接数据库,
原因是:mysql.user表里,root用户的host字段指定为localhost,所以得使用:./mysql -hlocalhost -uroot -p密码 -P端口
登录之后再修改mysql.user表:
use mysql;
update user set host='%' where user='root'; {修改host列的值为'%'表示root用户可以在任何主机连接该mysql数据库}
grant all privileges on *.* to 'root'@'%' with grant option; {为root用户赋权限,对于所有的库: *.*}
flush privileges;

创建用户:
create user '用户名'@'localhost' identified by '密码';
{'用户名'@'localhost'这样创建用户,限定了该用户只能在本机使用 -hlocalhost 方式连接数据库}

create user '用户名'@'%' identified by '密码';
{'用户名'@'%'这样创建用户,则该用户可以在任何主机上使用-hIP 方式连接数据库}

14、
查看mysql数据库全局的只读设置是否开启:
show global variables like '%read_only%';

开启mysql数据库全局只读:
set global read_only=1;

关闭mysql数据库全局只读:
set global read_only=0;

15、
mysql数据库,查看被锁状态以及解锁:
方式一:show open tables where in_use>0;
方式二:show processlist;{查看列表中的信息是否有被锁状态PID}

解锁:
kill pid;{由方式二查询出的pid}

16、mysql报错1093
mysql>  update test set name='aaaa' where id  in (select id from test);
ERROR 1093 (HY000): You can't specify target table 'test' for update in FROM clause
原因是:mysql不支持在一条语句对同一个表,先查询再更新的操作。

优化:对子查询创建一个临时表
mysql>  update test set name='aaaa' where id  in (select id from (select id from test) as tmp);
【注】:oracle是不会有这个问题的

17、Mysql在版本8.0之后引入了窗口函数:
select name, years, price, sum(price) over(partition by years order by years) as sumPrice from 表名;
结果:
name    years   price  sumPrice
张三  2018    100    300
李四  2018    100    300
王五  2018    100    300
小赵  2019    200    400
笑胡  2019    200    400
小朱  2020    300    600 
小李  2020    300    600
解释:
窗口函数sum(price)后面跟over(),partition by years以years作为分区;
order by years分区之后再排序默认升序,然后计算分区后的sum(price)总和。
这里:2018年有三行数据,price总和是300;2019年有两行数据,price总和是400;2018年有两行数据,price总和是600

18、Mysql报错:1260 ROW 58 was cut by group_concat()
原因:group_concat函数有拼接长度的限制;
select @@global.group_concat_max_len;
默认长度:1024

解决办法:修改长度限制:
set global group_concat_max_len=102400;

19、Mysql数据库忘记root密码:
后台登录mysql服务器,修改配置文件my.cnf增加配置:skip-grant-tables
重启mysql进程,即可使用root免密登录mysql,继而可重置root用户密码

20、
(1)、查看Mysql的时区
show variables like '%time_zone%';
结果:
Variable_name        Value
system_time_zone     UTC
time_zone            SYSTEM

由结果得知,系统时区为UTC,本地时区使用的是system时区也即UTC。所以这导致
Now()获取的时间和当前时间相差8小时(因为时区的问题)。

(2)、修改Mysql的时区:
方式一:
set global time_zone='+8:00'; #修改mysql全局时区为北京时间,即我们所在的东8区
flush privileges;

方式二:
vim /etc/my.cnf               #在配置文件中修改,然后重启mysql
default-time_zone = '+8:00'
21、
Mysql报错:
[Err] 1248-Every derived table must have it's own alias.
表示涉及到子查询的衍生表查询时,衍生表必须要命名一个别名
如:
select * from (select * from 表名); -- 如此会报错
改进:
select * from (select * from 表名) t1; 

22、对查询的结果相同的行做一个标记row_number
对于定义的变量的使用
注:sql中@var:=sqlstatement,表示定义一个变量var,可通过@var引用
举例1:
select 
    @row_number,
    @customer_no,
    (@row_number:= case when @customer_no=s.resource_id then @row_number + 1 else 1 end)  as num,
    @customer_no:=s.resource_id as num_id,
    resource_id,
    id
from
    t_scheduler_resouce_log s,   #这里隐式写法表示两张表内连接
    (
        select 
            @row_number:=0,
            @customer_no:=0
    ) as t
    
order by resource_id,id desc;

结果:
@row_number   @customer_no    num    num_id    resource_id    id
#这是一组
0             0               1      2         2              64
1             2               2      2         2              10
2             2               3      2         2              9
#这是一组
3             1               1      11        11             13
1             11              2      11        11             12
#这是一组
2             11              1      12        12             63
1             12              2      12        12             62
2             12              3      12        12             61
3             12              4      12        12             60


解释:
select查询时逐行查询表的数据,如下:
第一行开始:
@row_number的值为0,
@customer_no的值为0,
case when的条件不成立,执行else 1 ,并赋值给@row_number:=1,num的值此时也为1,
接着执行@customer_no:=s.resource_id,所以此时@customer_no的值变为2,num_id的值为2
第二行开始:(因为第一行的缘故)
@row_number的值为1,
@customer_no的值为2,
case when的条件成立,执行@row_number + 1,并赋值给@row_number:=2,num的值此时也是2,
接着执行@customer_no:=s.resource_id,所以此时@customer_no的值变为2,num_id的值为2,
依次类推


举例2:对查询的列1,列2 每一行会做一个标记从1开始
select 
   列1,
   列2,
   (@row_number:=@row_number+1) as row_number
 from 表1 t1 , (select @row_number:= 0) as t2
   where    表1条件 
   group by 表1条件
   order by 表1条件


举例3:如果表1经过排序的结果和row_number标记的不是从1开始,如下解决:
select 
   t1.列1,
   t2.列2,
   (@row_number:=@row_number+1) as row_number
from
  (select 列1,列2 from 表1 
     where    表1条件 
     group by 表1条件
     order by 表1条件 desc) as t1,
 (select @row_number:= 0) as t2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容