本章主要列举MYSQL日常使用过程中用到的一些命令,主要用于总结和后续使用时可以快速查阅
基础操作
启动相关
net start mysql
:Windows
系统启动MySQL
服务net stop mysql
:Windows
系统停止MySQL
服务/home/mysql/mysql3306/bin/mysqld_safe --defaults-file=/home/mysql/mysql3306/conf/my.cnf --user=mysql &
:Linux
系统启动MySQL
服务mysql -h地址 -p端口 -u账号 -p
:客户端连接MySQL
服务(需要二次输入密码)
sql
/home/mysql/mysql3306/bin/mysql -uroot -p -S /home/mysql/mysql3306/mysqld.sock
show status;
:查看MySQL
运行状态。
sql
//查看线程相关参数
mysql> show status like "Threads%";
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
+-------------------+-------+
4 rows in set (0.00 sec)
show processlist;
:查看当前库中正在运行的所有客户端连接/工作线程。
sql
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 2 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
mysql> select * from information_schema.processlist into outfile '/tmp/processlist.txt';
Query OK, 1 row affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'secure_file_priv';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | /tmp/ |
+------------------+-------+
1 row in set (0.00 sec)
help data types;
:查看当前版本MySQL
支持的所有数据类型。quit
:退出当前数据库连接。show grants;
:查看当前连接的权限信息。show errors;
:查看当前库中记录的错误信息。show warnings
:查看当前库抛出的所有警告信息。
库相关命令
show databases;
:查看目前MySQL
中拥有的所有库。show engines;
:查看当前数据库支持的所有存储引擎。use 库名;
:使用/进入指定的某个数据库。show create database 库名;
:查看创建某个库的SQL
详细信息。create database 库名;
:新建一个数据库,后面还可以指定编码格式和排序规则。
sql
CREATE DATABASE mydatabase
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
drop database 库名;
:删除一个数据库。ALTER DATABASE 库名 DEFAULT CHARACTER SET 编码格式 DEFAULT COLLATE 排序规则
:修改数据库的编码格式、排序规则。
表操作命令
基本命令
show tables;
:查看一个库中的所有表。desc 表名;
:查看一张表的字段结构。
sql
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| b | int(11) | YES | MUL | NULL | |
| c | int(11) | YES | | NULL | |
| d | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
4 rows in set (0.00 sec)
show create table t1
:查看一个表的建表SQL
sql
mysql> show create table t1;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `b_index` (`b`),
KEY `d_index` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
DDL命令
- 建表命令
sql
CREATE TABLE `库名`.`表名` (
字段名称1 数据类型(精度限制) [字段选项],
字段名称2 数据类型(精度限制) [字段选项]
) [表选项];
markdown
- 字段选项(可以不写,不选使用默认值):
- `NULL`:表示该字段可以为空。
- `NOT NULL`:表示改字段不允许为空。
- `DEFAULT 默认值`:插入数据时若未对该字段赋值,则使用这个默认值。
- `AUTO_INCREMENT`:是否将该字段声明为一个自增列。
- `PRIMARY KEY`:将当前字段声明为表的主键。
- `UNIQUE KEY`:为当前字段设置唯一约束,表示不允许重复。
- `CHARACTER SET 编码格式`:指定该字段的编码格式,如`utf8`。
- `COLLATE 排序规则`:指定该字段的排序规则(非数值类型生效)。
- `COMMENT 字段描述`:为当前字段添加备注信息,类似于代码中的注释。
- 表选项(可以不写,不选使用默认值):
- `ENGINE = 存储引擎名称`:指定表的存储引擎,如`InnoDB、MyISAM`等。
- `CHARACTER SET = 编码格式`:指定表的编码格式,未指定使用库的编码格式。
- `COLLATE = 排序规则`:指定表的排序规则,未指定则使用库的排序规则。
- `ROW_FORMAT = 格式`:指定存储行数据的格式,如`Compact、Redundant、Dynamic....`。
- `AUTO_INCREMENT = n`:设置自增列的步长,默认为`1`。
- `DATA DIRECTORY = 目录`:指定表文件的存储路径。
- `INDEX DIRECTORY = 目录`:指定索引文件的存储路径。
- `PARTITION BY ...`:表分区选项,后续讲《MySQL表分区》再细聊。
- `COMMENT 表描述`:表的注释信息,可以在这里添加一张表的备注。
alter table 表名 字段操作;
:修改一张表的字段结构,操作如下:add column 字段名 数据类型
:向已有的表结构添加一个字段。add primary key(字段名)
:将某个字段声明为主键。add foreing key 外键字段 表名.字段名
:将一个字段设置为另一张表的外键。add unique 索引名(字段名)
:为一个字段创建唯一索引。add index 索引名(字段名)
:为一个字段创建普通索引。drop column 字段名
:在已有的表结构中删除一个字段。modify column 字段名 字段选项
:修改一个字段的字段选项。change column 字段名 新字段名
:修改一个字段的字段名称。drop primary key
:移除表中的主键。drop index 索引名
:删除表中的一个索引。drop foreing key 外键
:删除表中的一个外键。
rename table 表名 to 新表名;
:修改一张表的表名。drop table if exists 表名
:如果一张表存在,则删除对应的表。truncate table 表名
:清空一张表的所有数据。create table 表名 like 要复制的表名
:复制一张表的结构,然后创建一张新表。insert into 表名 select * from 要复制的表名
:复制一张表的数据
sql
mysql> create table tt1 like t1;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into tt1 select * from t1;
Query OK, 7 rows affected (0.01 sec)
Records: 7 Duplicates: 0 Warnings: 0
表分析、检查、优化
-
分析表:用于分析表的统计信息并更新相关的优化器信息 语法如下:
analyze [local | no_write_to_binlog] table 表名1;
其中的可选参数
local、no_write_to_binlog
代表是否将本条SQL
记录进bin-log
日志,默认情况下是记录的,加上这两个参数中的其中一个后则不会记录
sql
mysql> analyze local table t1;
+---------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+---------+----------+----------+
| toby.t1 | analyze | status | OK |
+---------+---------+----------+----------+
1 row in set (0.02 sec)
- 检查表:用于检查和修复表的一致性问题 语法如下:
check table 表名1,表名2... [检查选项];
检查命令有多个可选项,如下:quick
:不扫描行数据,不检查链接错误,仅检查表结构是否有问题。fast
:只检查表使用完成后,是否正确关闭了表文件的FD
文件描述符。changed
:从上述检查过的位置开始,只检查被更改的表数据。medium
:检查行数据,收集每一行数据的键值(主键、外键...),并计算校验和,验证数据是否正确。extended
:对每行数据的所有字段值进行检查,检查完成后可确保数据100%
正确。
sql
mysql> check table t1,tt1;
+----------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+-------+----------+----------+
| toby.t1 | check | status | OK |
| toby.tt1 | check | status | OK |
+----------+-------+----------+----------+
2 rows in set (0.00 sec)
- 修复表:修复表的命令不支持
InnoDB
引擎,语法如下:repair [local | no_write_to_binlog] table 表名 [quick] [extended] [use_frm];
sql
mysql> repair local table t1;
+---------+--------+----------+---------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------+--------+----------+---------------------------------------------------------+
| toby.t1 | repair | note | The storage engine for the table doesn't support repair |
+---------+--------+----------+---------------------------------------------------------+
1 row in set (0.00 sec)
- 优化表:用于优化和重建表的物理存储结构,以提高表的性能和释放存储空间。
optimize [local | no_write_to_binlog] table 表名;
sql
mysql> optimize local table t1;
+---------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------+----------+----------+-------------------------------------------------------------------+
| toby.t1 | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| toby.t1 | optimize | status | OK |
+---------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.10 sec)
mysqlcheck 可以提供上述功能
DML命令
- 插入数据
insert into 表名(字段名...) values(字段值...);
:向指定的表中插入一条数据。insert into 表名(字段名...) values(字段值...),(...)...;
:向表中插入多条数据。insert into 表名 set 字段名=字段值,...;
:插入一条数据,但只插入某个字段的值。replace into 表名(字段名1,字段名2...) values(字段值....),(字段值...),...
- 删除数据
delete from 表名;
:删除一张表的所有数据。delete from 表名 where 条件;
:根据条件删除一条或多条数据。truncate table 表名
:清空一张表的所有数据。
- 修改数据
update 表名 set 字段名=字段值,...;
:修改表中所有记录的数据。update 表名 set 字段名=字段值,... where 条件;
:根据条件修改一条或多条记录的数据。replace 表名(字段名1,...) values(字段值...),...;
:批量修改对应主键记录的数据。
- 查询数据
select * from 表名;
:查询一张表的所有数据。select * from 表名 where 条件;
:根据条件查询表中相应的数据。select 字段1,字段2... from 表名 where 条件;
:根据条件查询表中相应数据的指定字段。select 函数(字段) from 表名;
:对查询后的结果集,进行某个函数的特殊处理。
sql
-- 联合多条SQL语句查询(union all表示不去重,union表示对查询结果去重)
select * from 表名 where 条件
union all
select * from 表名 where 条件;
-- 为查询出来的字段取别名
select 字段1 as 别名,... from 表名 where 条件; select 字段1 别名,... from 表名;
-- 基于一个字段进行排序查询
select * from 表名 order by 字段名 asc;
-- 按字段值正序返回结果集
select * from 表名 order by 字段名 desc;
-- 按字段值倒序返回结果集
select * from 表名 order by 字段1 asc,字段2 desc;
-- 按照多字段进行排序查询
-- 基于字段进行分组
select * from 表名 group by 字段1,字段2....;
-- 基于分组查询后的结果做条件过滤
select * from 表名 group by 字段1 having 条件;