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

你可能感兴趣的:(Mysql点滴)