mysql常用操作汇总

工作中经常用会遇到这种情况,可以访问mysql所在的服务器,但是服务器端口不对外暴露(通常因为安全原因)。这时,操作数据库只能通过命令行和 mysql client窗口来实现。我对这些操作进行一些汇总,方便以后随时查阅。

一、登录登出mysql client

登录 mysql client比较简单,执行下面的命令回车,输出root用户密码,即可进入。

mysql -u root -p

登出只需执行 退出命令 exit 或使用快捷键 CTRL + C

二、操作数据

登录至 mysql client后,可以操作常见的 DDLDMLDQLDCL语句。

创建数据库,执行以下语句。

CREATE DATABASE your_db_name DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

上述语句创建了名为 your_db_name的数据库,且设置了该数据库默认的字符集为 uft8mb4。这里注意 mysql数据库的命名不支持短中杠( -),多个单词的拼接用下划线( _)即可。

删除数据库,只需执行 DROP DATABASE命令。

DROP DATABASE your_db_name;

展示当前用户下,全量的数据库列表。

SHOW DATABASES;

如果要查询特定的数据,可以使用 LIKE 进行过滤查询。

SHOW DATABASE LIKE 'your_db%';

要进入刚才创建的数据库 your_db_name,执行下面的语句。

USE your_db_name;

我们尝试创建一个表 your_table_name。假如该表不存在,则创建;如果存在,则不执行。

CREATE TABLE IF NOT EXISTS your_table_name (
    id BIGINT NOT NULL COMMENT '主键' AUTO_INCREMENT,
    your_field_name1 VARCAHR(10) NOT NULL DEFAULT '' COMMENT '你创建的字段1',
    your_field_name2 CHAR(1) NOT NULL DEFAULT '0' COMMENT '你创建的字段2',
    PRIMARY KEY (id) USING BTREE
)
ENGINE = InnoDB
COLLATE = 'utf8mb4_unicode_ci'
COMMENT = '你的表名'
;

如果想看某张表的建表语句,执行下面的语句:

SHOW CREATE TABLE your_table_name;

通过 drop table语句删除表。

DROP TABLE your_table_name;

如果想快速备份当前的表(your_table_name),可以使用 rename table命令,把当前表重命名为其他表(例如 your_table_name_bak)。

RENAME TABLE your_table_name TO your_table_name_bak;

注意:
重命名的表名最好不要带上 .符号,比如 your_table_name.bak。这是因为,sql 解析器有可能误认为 .符号前面的 your_table_name是数据库名。
它会报下面的错误:
ERROR 1049 (42000): Unknown database ‘your_table_name’

已有一张表(A)(your_table_name),如果想快速复制一张表(A_2)(your_table_name2),表(A_2)与表(A)完全相同,但是不含(A)表中的数据。我们可以这么执行:

CREATE TABLE your_table_name2 SELECT * FROM your_table_name LIMIT 0;

如果只是想快速复制表(A_3)(your_table_name3),(A_3)表只包含(A)表的部分字段,且同(A_2)一样不包含(A)表中的数据。可以这么执行:

CREATE TABLE your_table_name3 SELECT id FROM your_table_name LIMIT 0;

如果想快速复制表(A_4)(your_table_name4),(A_4)表包含(A)表的所有字段,并且包含(A)表的所有数据。可以这么执行:

CREATE TABLE your_table_name4 SELECT * FROM your_table_name;

如果想快速复制表(A_5)(your_table_name5),(A_5)表包含(A)表的所有字段,并且包含 A表的若干条数据,比如 1条。可以这么执行:

CREATE TABLE your_table_name5 SELECT * FROM your_table_name LIMIT 1;

但是 注意,上述执行方式创建的复制表,都只保留原表的字段相关信息,但是会丢弃掉原表的主键、索引等信息,如果要复制一张完全相同表结构的表,可以使用 LIKE来执行。

CREATE TABLE your_table_same_strut_name LIKE your_table_name;

假设有两张表,表(A)( your_table_name)和表(B)( another_table_name),两者字段完全相同,或部分相同,或字段含义接近,表(A)有全量数据,把表(A)的数据一次性同步到表(B),可以通过下面的步骤实现。

初始条件,

已知表A (your_table_name)
CREATE TABLE IF NOT EXISTS your_table_name (
    id BIGINT NOT NULL COMMENT '主键' AUTO_INCREMENT,
    your_field_name1 VARCHAR(10) NOT NULL DEFAULT '' COMMENT '你创建的字段1',
    your_field_name2 CHAR(1) NOT NULL DEFAULT '0' COMMENT '你创建的字段2',
    PRIMARY KEY (id) USING BTREE
)
ENGINE = InnoDB
COLLATE = 'utf8mb4_unicode_ci'
COMMENT = '你的表名'
;

表B(another_table_name)
CREATE TABLE another_table_name (
    id BIGINT(20) NOT NULL COMMENT '主键' AUTO_INCREMENT,
    field_name1 VARCHAR(10) NOT NULL DEFAULT '' COMMENT '字段1' COLLATE 'utf8mb4_unicode_ci',
    field_name2 CHAR(1) NOT NULL DEFAULT '0' COMMENT '字段2' COLLATE 'utf8mb4_unicode_ci',
    field_name3 INT(11) NULL DEFAULT NULL COMMENT '字段3',
    PRIMARY KEY (id) USING BTREE
)
COMMENT='另外一张表'
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

又已知表(A)( your_table_name)和表(B)( another_table_name)前3个字段含义相同。那么同步表(A)的数据至表(B),可以按以下方式执行:

INSERT INTO another_table_name (id, field_name1, field_name2)
SELECT id, your_field_name1, your_field_name2 FROM your_table_name;

同样,同步表(A)( your_table_name)的部分数据至表(B)( another_table_name),比如只同步前 2条数据。执行语句如下:

INSERT INTO another_table_name (id, field_name1, field_name2)
SELECT id, your_field_name1, your_field_name2 FROM your_table_name LIMIT 2;

如果表中数据没有用了,表又比较大,那么执行下面的语句可以快速清空并重置当前表。为什么说该操作有重置的作用,假设你的主键是自增的( AUTO INCREMENT),全量删除( DELETE *)数据后,再添加数据,主键不会从 1开始递增,而是接继之前的主键值继续递增;但是执行 TRUNCATE命令后,主键值会重新从 1开始递增。

TRUNCATE TABLE your_table_name;

注意:
生产环境 慎用

SHOW TABLES;

如果要列出特定的表,则可以用 LIKE进行过滤查询。

SHOW TABLES LIKE '%your_table_name%';
SHOW TABLE STATUS WHERE NAME= 'your_table_name';

这是可以查询到表当前的相关信息,比如表名、表引擎、版本、数据行格式、数据行数、表创建时间、表更新时间、字符集、表注释等等。

除了创建表时添加字段外,还可以通过 ALTER ADD COLUMN语句添加字段。

-- 添加一个字段
ALTER TABLE your_table_name ADD COLUMN your_field_name3 DECIMAL(8,2) NOT NULL DEFAULT 0 COMMENT '字段3' AFTER your_field_name2;

-- 添加多个字段 以半角逗号分割
ALTER TABLE your_table_name
    ADD COLUMN your_field_name4 BIT NOT NULL DEFAULT FALSE COMMENT '字段4' AFTER your_field_name3,
    ADD COLUMN your_field_name5 TIMESTAMP NULL COMMENT '字段5' AFTER your_field_name4;

如果不指定字段在特定字段后面,则该字段默认在表的末尾处添加。

变更表字段,使用 ALTER CHANGE COLUMN语句。

-- 变更一个字段
ALTER TABLE your_table_name CHANGE COLUMN your_field_name3 your_field_new_name3 DECIMAL(8,3) NOT NULL DEFAULT 0 COMMENT '新字段3';

-- 变更多个字段 以半角逗号分割
ALTER TABLE your_table_name
    CHANGE COLUMN your_field_name4 your_field_new_name4 TINYINT NOT NULL DEFAULT 0 COMMENT '新字段4',
    CHANGE COLUMN your_field_name5 your_field_new_name5 DATETIME NULL COMMENT '新字段5';

删除字段,使用 ALTER DROP COLUMN语句。

-- 删除一个字段
ALTER TABLE your_table_name DROP COLUMN your_field_new_name3;

-- 删除多个字段 以半角逗号分割
ALTER TABLE your_table_name
    DROP COLUMN your_field_new_name4,
    DROP COLUMN your_field_new_name5;

有时要查看表中有哪些字段,可以通过 SHOW COLUMNS语句实现。

SHOW COLUMNS FROM your_table_name;

查询后的效果如下所示。我们可以得到字段名、字段类型、是否为Null,Key值,默认值和额外信息。

mysql> SHOW COLUMNS FROM your_table_name;
+------------------+-------------+------+-----+---------+----------------+
| Field            | Type        | Null | Key | Default | Extra          |
+------------------+-------------+------+-----+---------+----------------+
| id               | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| your_field_name1 | varchar(10) | NO   |     |         |                |
| your_field_name2 | char(1)     | NO   |     | 0       |                |
+------------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

上述语句同下面的语句等价。

SHOW FIELDS FROM your_table_name;

如果要展示字段的更多信息,可以使用下面的语句。相较于上面的语句,增加了字符集信息,权限信息和注释信息。

SHOW FULL FIELDS FROM your_table_name;

如果要列出特定字段,可以使用 LIKE关键字进行过滤查询。

SHOW FULL FIELDS FROM your_table_name LIKE 'id';

使用 ADD INDEX 执行添加索引操作:

还可以添加联合索引:

ALTER TABLE your_table_name ADD INDEX your_composite_index_name (your_field_name1, your_field_name2);

如果要添加唯一索引,则可以增加 UNIQUE(唯一性)关键字执行:

ALTER TABLE your_table_name ADD UNIQUE INDEX your_index_name (your_field_name1);

如果要添加主键,那么可以执行:

ALTER TABLE your_table_name ADD PRIMARY KEY (id);

使用 DROP INDEX 执行索引的丢弃操作。

ALTER TABLE your_table_name DROP INDEX your_index_name;

删除主键,执行:

ALTER TABLE your_table_name DROP PRIMARY KEY;

SHOW INDEX FROM命令可以用来查看某张表下所有索引信息。

SHOW INDEX FROM your_table_name;

三、备份和还原数据

备份和还原数据,通常使用 mysqldump命令和 source命令(在 mysql client内执行)。

备份操作特别适合于数据的全量导出的情况,特别是数据存在二进制( binaryblob)的情况。

linux环境下,可以执行:

mysqldump -u root -p your_db_name > /home/your_db_name.sql

windows环境下,需要指定具体盘符:

mysqldump -u root -p your_db_name > E:/your_db_name.sql

查看 mysqldump操作帮助( mysqldump --help),可知,添加 -d操作符,可以导出不包含数据的库表信息。

-d, --no-data       No row information.

于是,备份单库但不要库内数据的执行语句如下:

mysqldump -u root -p  -d your_db_name > /home/your_db_name_without_data.sql

使用 -B操作符,可以指定多个库。

使用 --tables操作符,可以指定多个表。

mysqldump -u root -p your_db_name --tables your_table_name your_table_name2 > /home/your_table_names.sql
mysqldump -u root -p -d your_db_name --tables your_table_name your_table_name2 > /home/your_table_names_without_data.sql

使用 --ignore-table=name操作符,可以在导出库的同时,忽略特定的表。

mysqldump -u root -p your_db_name --ignore-table=your_db_name.another_table_name --ignore-table=your_db_name.your_table_name_bak > /home/your_db_name_ignore_tables.sql

注意:
要忽略的表名一定要书写正确。否则会出现执行了明明忽略操作,但是对应的表仍会导出的错觉。

该操作需要在 mysql client中执行。

假设要还原某个库里面的数据,可以通过下面简单的两步实现还原库中数据的操作。

首先,切换到要还原的库。

USE your_db_name;

接着,在库内执行 SOURCE命令。 SOURCE后跟的是导出的或者你已准备好的数据的实际路径。

SOURCE /home/your_db_name.sql

mysqldump同样支持把备份的数据还原回去,只需执行的时候,把指向箭头掉个方向。

mysqldump -u root -p your_db_name < /home/your_db_name.sql

注意:
通常 不推荐使用这种方式,因为这种方式会机械的执行库表的还原。如果库名不对应,执行的预期不是我们想要的。

四、授权和收回

使用 GRANT TO命令进行库表的授权。

我们先尝试创建一个本地用户 custom_user, 并为其设置密码 customPassword

CREATE USER 'custom_user'@'localhost' IDENTIFIED BY 'customPassword';

授权本地用户 custom_user拥有 your_db_name的所有权限。

GRANT ALL PRIVILEGES ON your_db_name.* TO 'custom_user'@'localhost';
FLUSH PRIVILEGES;

授权本地用户 custom_user拥有 your_db_name的特定表(your_table_nameyour_table_name2)的所有权限。

GRANT ALL PRIVILEGES ON your_db_name.your_table_name TO 'custom_user'@'localhost';
GRANT ALL PRIVILEGES ON your_db_name.your_table_name2 TO 'custom_user'@'localhost';
FLUSH PRIVILEGES;

可以授权本地用户 custom_user只拥有 your_db_name的特定表(your_table_nameyour_table_name2)的查询权限。

GRANT SELECT ON your_db_name.your_table_name TO 'custom_user'@'localhost';
GRANT SELECT ON your_db_name.your_table_name2 TO 'custom_user'@'localhost';
FLUSH PRIVILEGES;

注意:
这里授权查询操作需保证,对应库表存在。

收回权限使用 REVOKE FROM命令。

收回所有之前赋给本地用户 custom_user对于特定库 your_db_name的权限。

REVOKE ALL PRIVILEGES ON your_db_name.* FROM 'custom_user'@'localhost';
FLUSH PRIVILEGES;

注意:
授权是可以累计的。因此,权限收回要与授权保持 一一对应。否则,会出现权限收回了,但仍能看到被授权相关信息的错觉。

REVOKE SELECT ON your_db_name.your_table_name FROM 'custom_user'@'localhost';
REVOKE SELECT ON your_db_name.your_table_name2 FROM 'custom_user'@'localhost';
FLUSH PRIVILEGES;

五、其他

查看磁盘空间占用的目的,是方便在数据导出等操作时做出合理选择,比如,避免导出不重要但很大的数据。

SELECT
table_schema as '数据库',
SUM(table_rows) as '记录数',
SUM(TRUNCATE(data_length/1024/1024, 2)) as '数据容量(MB)',
SUM(TRUNCATE(index_length/1024/1024, 2)) as '索引容量(MB)'
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length) DESC, SUM(index_length) DESC;
SELECT
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
TRUNCATE(data_length/1024/1024, 2) as '数据容量(MB)',
TRUNCATE(index_length/1024/1024, 2) as '索引容量(MB)'
FROM information_schema.tables
WHERE table_schema='your_db_name'
ORDER BY data_length DESC, index_length DESC;

通常在执行一些大表数据的删除之后,数据库并不会立即释放磁盘空间。这时,执行 OPTIMIZE命令可以用来释放相应的磁盘空间。

OPTIMIZE TABLE your_table_name;

Original: https://www.cnblogs.com/lunyu/p/16630611.html
Author: 论语
Title: mysql常用操作汇总

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611904/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MIT 6.824 Lab2A Raft之领导者选举

    实验准备 实验代码: git://g.csail.mit.edu/6.824-golabs-2021/src/raft 如何测试: go test -run 2A -race 相关…

    数据库 2023年6月14日
    094
  • 多版本并发控制 MVCC

    介绍多版本并发控制 多版本并发控制技术(Multiversion Concurrency Control,MVCC) 技术是为了解决问题而生的,通过 MVCC 我们可以解决以下几个…

    数据库 2023年6月11日
    0132
  • 如何成为一名开发人员——第 1 部分:编码技巧

    1 学习一门语言 程序员编写计算机代码,所以你必须学会说这种语言。 但是, 你首先学习哪种编程语言并不重要!这完全取决于你对什么感兴趣。例如… 如果你想进入 Web 开…

    数据库 2023年6月14日
    096
  • Spark学习(3) SparkSQL

    什么事sparkSQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用, 它是将Spark…

    数据库 2023年6月16日
    084
  • LeetCode 20. 有效的括号

    给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]&#8217…

    数据库 2023年6月11日
    091
  • Nginx常见问题

    基于端口的虚拟机: 使用端口来区分,浏览器使用域名或ip地址:端口号 访问。 注意:~ 代表自己输入的英文字母。 16、location正则案例 1 #优先级1,精确匹配,根路径 …

    数据库 2023年6月14日
    0114
  • MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码、基础的增删改查代码(基础的增删改查服务可以划入DAO(D…

    数据库 2023年6月14日
    085
  • 手写LRU缓存淘汰算法

    概述 LRU算法全称为 Least Recently Used是一种常见的页面缓存淘汰算法,当缓存空间达到达到预设空间的情况下会删除那些 最久没有被使用的数据 。 常见的页面缓存淘…

    数据库 2023年6月11日
    0121
  • 你知道5分钟法则和10字节法则么?

    如果一条数据每5分钟被访问一次,那么它应该常驻在内存中。类似的,如果想存储只有0和1两个值的标志位,相比于将8个标志位打包为1个字节,将1个标志位单独存储为1个字节是更节约的选择。…

    数据库 2023年6月14日
    0102
  • 【已解决】关于echarts的splitArea分割区域背景闪烁问题

    (x轴)使用时间类型(type: “time”),并且x轴使用splitArea划分后使用color属性设定分割区域颜色。同时使用dataZoom设置区域缩…

    数据库 2023年6月6日
    080
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    098
  • MySQL数据备份 mysqldump 详解

    MySQL数据备份流程 打开cmd窗口 通过命令进行数据备份与恢复; 需要在Windows的命令行窗口中进行; l 开始菜单,在运行中输入cmd回车; l 或者win+R,然后输入…

    数据库 2023年6月14日
    083
  • SpringBoot 整合 MongoDB 实战解说

    在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词: 数据库、集合、文档!…

    数据库 2023年6月14日
    085
  • 12、HSSFWorkbook实现多张sheet导出

    转载自 一、封装一个通用的装载数据的实体类: import lombok.AllArgsConstructor; import lombok.Data; import lombok…

    数据库 2023年6月6日
    0103
  • JUC自定义线程池练习

    JUC自定义线程池练习 首先上面该线程池的大致流程 自定义阻塞队列 首先定义一个双向的队列和锁一定两个等待的condition 本类用lock来控制多线程下的流程执行 take和p…

    数据库 2023年6月11日
    094
  • Java百度地图经纬度纠偏

    在国内使用电子地图获取到的经纬度都不是真实的经纬度,而是经过一定的算法在真实的经纬度上添加了一个偏移量,且不同的地图有不同的算法。现在告诉大家在java中怎样对百度地图进行纠偏,主…

    数据库 2023年6月9日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球