mysql常用命令

查看表结构

1、以列表方式显示

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

2、显示建表语句

mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------+
| Table | Create Table                                                                               |
+-------+--------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3、查看当前连接的数据库

mysql> select database();
+-------------+
| database()  |
+-------------+
| test|
+-------------+
1 row in set (0.00 sec)

数据库编码

1、查看数据库编码

mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.03 sec)

2、修改数据编码

mysql> alter database test character set gbk;
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | gbk   |
+------------------------+-------+
1 row in set (0.00 sec)

3、修改表编码

mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------+
| Table | Create Table                                                                               |
+-------+--------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> 
mysql> alter table test character set gbk;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` varchar(10) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

常用函数

1、GROUP_CONCAT

同一字段返回多个值时,如果需要将这些值组合在一列,并以指定的字符间隔,使用GROUP_CONCAT,格式GROUP_CONCAT(列明 SEPARATOR 分割符),示例:

GROUP_CONCAT(name SEPARATOR ',')

2、根据所有表生成sql语句,如生成删除所有表的语句

SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
   FROM information_schema.tables
WHERE table_schema = 'test';

3、from_unixtime

       返回Unix时间标记的一个字符串,根据format格式化。如果format为空默认会返回YYYY-MM-DD HH:MM:SS的格式

       如果是精确到毫秒的时间戳,则通过from_unixtime返回的值为null,解决方式为:/1000

       如时间戳:1649424100794.6677

mysql> select FROM_UNIXTIME(1649424100794.6677) as date;
+------+
| date |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

        解决后的结果

mysql> select FROM_UNIXTIME(1649424100794.6677/1000) as date;
+----------------------------+
| date                       |
+----------------------------+
| 2022-04-08 21:21:40.794668 |
+----------------------------+
1 row in set (0.00 sec)

3、DATE_FORMAT

转换为毫秒时,需要使用%Y-%m-%d %T:%f,且T一定要大写

mysql> select DATE_FORMAT('2022-04-08 21:21:40.794668','%Y-%m-%d %T:%f');
+------------------------------------------------------------+
| DATE_FORMAT('2022-04-08 21:21:40.794668','%Y-%m-%d %T:%f') |
+------------------------------------------------------------+
| 2022-04-08 21:21:40:794668                                 |
+------------------------------------------------------------+
1 row in set (0.00 sec)

4、now、CURRENT_TIMESTAMP

这两个函数默认返回值精确到秒,如果要精确到毫秒,可以使用NOW(3)、CURRENT_TIMESTAMP(3)

mysql> select now(3);
+-------------------------+
| now(3)                  |
+-------------------------+
| 2022-04-21 21:05:09.079 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP(3);
+-------------------------+
| CURRENT_TIMESTAMP(3)    |
+-------------------------+
| 2022-04-21 21:05:10.277 |
+-------------------------+
1 row in set (0.00 sec)

5、二进制、十进制、八进制、16进制相互转换函数

    bin、oct、hex、unhex、conv

    详见:mysql怎么进行进制转换-mysql教程-PHP中文网

6、ip地址、二进制相互转换,inet_ntoa、inet_aton函数

   详见:mysql中数字进制的转换以及IP地址的处理_liyong635的博客-CSDN博客

7、inet_ntoa函数和inet_aton函数

8、substring_index 拆分字符串为多行

SELECT
	substring_index(substring_index('张三,李四,王五,赵六,杨七',',',help_topic_id + 1),',' ,- 1) AS Id
FROM
	mysql.help_topic
WHERE
	help_topic_id < (length('张三,李四,王五,赵六,杨七') - length(REPLACE ('张三,李四,王五,赵六,杨七', ',', '')) + 1);

mysql如何把字符串拆成多行-mysql教程-PHP中文网

9、判断某列包含某个字符的个数

SELECT
    LENGTH( NAME ) - LENGTH( REPLACE ( NAME, ',', '' ) ) 
FROM USER;

修改字符集

1、查看配置文件所在位置:

mysql --verbose --help|grep -A 1 'Default options'

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

2、修改 character_set_client 的字符集

查看字符集:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.05 sec)

      默认情况下,character_set_client、character_set_connection、character_set_results使用字符集latin1,客户端连接mysql时,可以指定字符集,此时mysql服务器将使用指定的字符集设置character_set_client、character_set_connection、character_set_results。

      当客户端连接mysql服务器时,它会将自己想要的字符集(比如utf8)发给mysql服务器,mysql服务器就会使用这个字符集去设置:character_set_client、character_set_connection、character_set_results。

      如果通过以下两种方式执行sql,然后再通过其它客户端(如SQLyog)连接时,可能会出现乱码或中文字符丢失。这是因为mysql默认的客户端使用的是latin1编码,而SQLyog使用的是utf8编码。

1、sql语句直接拷贝到mysql的命令窗口
   mysql> UPDATE test SET value="中国北京" where id=1;

2、通过导入脚本的方式执行:
   mysql -uroot -p123456 test < /1.sql

     此乱码可以通过以下方式解决

1)指定客户端字符集

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> source /1.sql
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

2)修改默认字符集

      字符集修改后,再通过 mysql -uroot -p123456 test < /1.sql 的方式导入,此时不会再出现乱码,但是直接拷贝可能还是会有乱码

      注意:此种方式,可能导致数据库被清空,切记!!!!!!!

在/etc/mysql/mysql.conf.d/mysqld.cnf配置文件中添加:default-character-set=utf8

[root@testlocal]# cat mysql.cnf 
[mysql]
default-character-set=utf8

再查看字符集,已修改为了utf8

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)


注意:

      字符集修改后,客户端可能将无法连接mysql,报错:Access denied for user 'root'@'192.1.10.16' (using password: YES)

       解决此问题,需要重新对mysql进行授权:GRANT ALL PRIVILEGES ON *.* TO "root"@"%" IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

           

授权

查看授权

1、默认查看对localhost的权限

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)



2、用户root对指定IP的权限
   SHOW GRANTS FOR 'root'@'192.10.10.16';
+--------------------------------------------------------------------------+
| Grants for root@192.10.10.16                                           |
+--------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.10.10.16' WITH GRANT OPTION |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)


3、用户root对localhost的权限
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.09 sec)



或者

mysql> select * from user where user='root' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *B861587437FDB4434645A38132F3C08DC2051FFC
      password_expired: N
 password_last_changed: 2022-06-21 11:12:18
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)

ERROR: 
No query specified

授权

      授权、撤销授权后,需要重新连接数据库才会生效。

1、通过grant

如果IP地址为%,则表示允许所有客户端连接

grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option; 
flush privileges;

1、作用在所有库上
-- 允许任何主机使用用户root和密码mypassword进行连接mysql,且能看到mysql下的所有数据库
-- 第一个*表示数据库名称,第二个*表示数据表名称

-- 允许地址为任意IP的主机使用root用户通过密码mypassword进行连接:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

2、作用在单个数据库上
-- 允许任何主机使用用户root和密码mypassword进行连接mysql,且只能看到mysql下的test数据库
-- 注意,此时必须使用test.*,其中test表示数据库名称,.*表示该数据库下的所有表

GRANT ALL PRIVILEGES ON test.* TO "root"@"%" IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

3、作用在具体的字段上
grant select(id, code, name) on test.student to "root"@"%"; 
  grant all privileges on *.* to root@'%' identified by '123321' with grant option;
  或
  grant all privileges on test.* to root@'%' identified by '123321' with grant option;
  或
  grant all privileges on test.* to 'root'@'%.%.%.%' identified by '123321';

2、修改user表

1、登录到mysql
   mysql -uroot -p123456

2、切换到mysql数据库
   use mysql

3、更改权限
  update user set host='%' where user='root';

3、撤销授权

-- revoke 命令与grant语法基本一样,只需要将to换成from即可
revoke SELECT,update ON `test`.`student` from 'root'@'%';

revoke all ON `mysql`.`test`  from 'root'@'%';

REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'192.16.15.16';


此时再查询: select * from student;
将会报错:SELECT command denied to user 'root'@'192.18.10.16' for table 'studen'

连接、查看数据库

1、连接

mysql -uroot -p123456 test

2、查看当前连接的数据库

mysql> select database();
+-------------+
| database()  |
+-------------+
| test|
+-------------+
1 row in set (0.00 sec)

3、查看当前连接的用户

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.01 sec)

4、查看所有数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |

5、切换数据库

use test;

6、查看当前数据库的所有表

show tables;

7、查看所有存储过程

SHOW PROCEDURE STATUS;

8、查看存储过程内容

SELECT body FROM mysql.proc WHERE NAME='pro_test';

9、begin end

      通常begin-end用于定义一组语句块,在各大数据库中的客户端工具中可直接调用,但在mysql中不可用。

begin-end、流程控制语句、局部变量只能用于函数、存储过程内部、游标、触发器的定义内部。

begin-end语句块在mysql中的使用问题 - 言止予思 - 博客园

10、declare只能用在存储过程、函数中

11、变量

     MySQL变量、函数、存储过程的使用 - 咘網鶵釁 - 博客园

   mysql用户变量,mysql中用户变量不用提前申明,在用的时候直接用“@变量名”使用就可以了。其作用域为当前连接。

 1 -- 第一种用法,使用set时可以用“=”或“:=”两种赋值符号赋值
 2 set @age=19;
 3 
 4 set @age:=20;
 5 
 6 -- 第二种用法,使用select时必须用“:=”赋值符号赋值
 7 select @age:=22;
 8 
 9 select @age:=StuAge 
10 from demo.student 
11 where StuNo='A001';

生成批量删除、更新、插入脚本

-- 批量删除,如果需要限定某些表,可以加条件 AND table_name LIKE 'tb_%';
SELECT CONCAT( 'TRUNCATE TABLE ', table_name, ';' ) AS statement FROM information_schema.tables WHERE table_schema = '数据库名称' ;

或

SELECT CONCAT( 'DELETE TABLE ', table_name, ';' ) AS statement FROM information_schema.tables WHERE table_schema = '数据库名称' ;

或

SELECT CONCAT( 'DELETE TABLE ', GROUP_CONCAT(table_name), ';' ) AS statement FROM information_schema.tables WHERE table_schema = '数据库名称' ;

-- 批量更新、插入可以根据实际情况参考以上

导入、导出数据库

一、导出数据库

1、导出建库脚本、数据

mysqldump -hlocalhost -uroot -p123456 test > test.sql

2、只导出存储过程

mysqldump -hlocalhost -uroot -p123456 -ntd -R test > proc.sql

其中的 -ntd 是表示导出存储过程;-R是表示导出函数

3、只导出一个表

mysqldump -hlocalhost -uroot -p123456 test student > student.sql

4、只导出表结构

mysqldump -hlocalhost -uroot -p123456 -d --add-drop-table test > test.sql

参数说明:

  • -n: --no-create-db

  • -d: --no-data

  • -t: --no-create-info

  • -R: --routines Dump stored routines (functions and procedures)

主要参数介绍:

字符集选项

  • --default--character-set=xx

连接选项

  • -u,--user=name

  • -p,--password=name

  • -h,--host=name

  • -P,--port=#

输出内容选项

  • --add-drop-database

  • --add-drop-table

  • -n;--no-create-db

  • -d;--no-data

  • -t;--no-create-info

输出格式选项

  • --compact

  • -c --complete-insert

  • -T(指定数据表中的数据备份为单纯的数据文件和建表SQL两个文件)

注xx.sql建表文件是以linux的root用户创建,

而xx.txt文件则是一linux的mysql用户创建,

因此这两个文件的存放路径一定要保证mysql用户有读写创建文件的权限。

  • --fields-terminated-by=name(域分隔符)

  • --fields-enclosed-by=name(域引用符)

  • --fields-optionally-enclosed-by=name(域引用可选字符)

  • --fields-escaped-by=name(转义字符)

其他

  • -F --flush-logs(备份前刷新日志)

  • -l --lock-tables(给所有的表加读锁)

二、导入数据库脚本

mysql -hlocalhost -uroot -p123456 test < test.sql

存储过程

一、异常处理

1、发生异常时,执行FOR SQLEXCEPTION后面的语句,然后继续执行后面的语句
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _error = 1 ;

2、发生异常时,执行FOR SQLEXCEPTION后面的语句,不在执行后面的语句
   DECLARE EXIT HANDLER FOR SQLEXCEPTION SET _error = 1 ;

这两种声明后面都可以跟一个简单语句如:SET _error = 1 ,也可以跟一个Begin End语句块

二、事务提交

      隐式提交命令会导致事务无法正常回归,存储过程中如果包含create 语句,则在发生异常时,只能回归create 语句后的事务。

      A存储过程调用B存储过程,如果B存储过程有commit事务提交,而A存储过程在调用B存储过程后发生异常,则调用B之前的事务不会被回滚。

三、调用存储过程

CALL pro_test('zhangsan', @out_ret, @out_desc);
SELECT @out_ret, @out_desc;

四、循环插入1万条数据

-- 创建表
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(20) NOT NULL,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index1` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=128928 DEFAULT CHARSET=utf8

-- 创建存储过程,插入1000万条
DELIMITER $$

USE `unify_entrance`$$

DROP PROCEDURE IF EXISTS `insertData`$$

CREATE DEFINER=`root`@`%.%.%.%` PROCEDURE `insertData`()
BEGIN
    DECLARE
        i INT DEFAULT 1 ;
    DECLARE str VARCHAR(20);
    WHILE i <= 10000000 DO
        -- set str = CONCAT('zs', i);
        INSERT INTO test (`code`, `name`) VALUES(i, i) ;
        SET i = i + 1 ;
    END WHILE ; 
    COMMIT ;
END$$

DELIMITER ;

-- 调用存储过程

call insertData();

未完待续

参考:

MySQL :: MySQL 5.6 Reference Manual :: 10 Character Sets, Collations, Unicode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值