本文对MySQL的常用命令进行分类汇总、命令介绍、举例说明,如转载或引用请在醒目位置放上本文连接。
本文可作为常用工具收藏,如对您略有帮助请点赞👍👍👍支持!
由于SQL属于类B的语言,不区分大小写,为了便于阅读,本文所有SQL命令,均使用小写,勿喷🙏。
常用命令分类:
服务层面:包含服务的启动、关闭等,通俗的说是进入MySQL之前,在终端输入、与MySQL有关的命令;
数据库层面:包含数据库的建立、删除等;
数据表层面:包含表的建立、属性修改等,属于项目前期数据表设计相关的命令;
数据层面:包含数据的增、删、改、查,属于常用的命令;
说明:
[内容、参数] ----- 是指可选参数
一、服务层面命令(简要的,不涉及端口、安全性等参数)
1、启动、停止、重启MySQL服务:
# win系统 >net start mysql # 启动 >net stop mysql # 停止 # ox系统,如果提示找不到命令,可直接进入安装目录的bin文件夹内运行命令 $ mysql.server start # 通过brew安装的MySQL 启动 $ mysql.server stop # 停止 $ mysql.server restart # 重启 # Linux系统,如果提示找不到命令,可直接进入安装目录的bin文件夹内运行命令 $ path_mysql/init.d/mysqld start # 启动 path_mysql是指安装路径 $ path_mysql/init.d/mysqld stop # 停止 $ path_mysql/init.d/mysqld restart # 重启 # 通过service 操作 $ service mysqld start # 启动 $ service mysqld stop # 停止 $ service mysqld restart # 重启
$ service mysql status # 查看服务状态
2、首次安装,启动配置服务,win系统参考这里
# ox系统 $ mysql_secure_installation
3、首次登陆(新安装,未进行配置)
# win系统 >mysql -hlocalhost -uroot # ox系统 $mysql -uroot
4、登陆
mysql -u用户名 -p密码 # (密码)可省略,回车后再输入,如不省略,注意-p和密码间没有空格 例如:mysql -uroot -pmypasswd
5、导出/导入数据库文件(待更新)
二、数据库层面
1、操作命令
命令 | 简写 | 具体含义 |
? | \? | 显示帮助信息 |
clear | \c | 明确当前输入语句 |
connect | \r | 连接到服务器,可选参数为数据库和主机 |
delimiter | \d | 设置语句分隔符 |
ego | \G | 发送命令到MySQL服务器,并显示结果 |
exit | \q | 退出MySQL |
go | \g | 发送命令到MySQL服务器 |
help | \h | 显示帮助信息 |
notee | \t | 不写输出文件 |
\p | 打印当前命令 | |
prompt | \R | 改变MySQL提示信息 |
quit | \q | 退出MySQL |
rehash | \# | 重建完成散列 |
source | \. | 执行一个SQL脚本文件,以一个文件名作为参数 |
status | \s | 从服务器获取MySQL的状态信息 |
tee | \T | 设置输出文件,并将信息添加到所有给定的输出文件 |
use | \u | 用另一个数据库 |
charset | \C | 切换到另一个字符集 |
warning | \W | 每个语句之后显示警告 |
nowarning | \w | 每个语句之后不显示警告 |
2、常用命令
mysql>show databases; # 查看已有的数据库 mysql>create database 数据库名称 [dafault character set utf8]; # 创建[字符编码为utf8的]数据库 mysql>show create database 数据库名称; # 显示新创建的数据库信息 mysql>alter database 数据库名称 default character set gbk collate gbk_bin; #将数据库的编码格式设为 gbk 同时注意最后是设为gbk_bin,如果改为utf8,则最后是utf8_bin mysql>drop database 数据库名称; # 删除数据库 mysql>use 数据库名称; # 切换至数据库 同 \u [数据库名称] 注意:使用简写命令时最后不要加 ;
mysql>select database(); # 显示当前所在的数据库
举例如下:
mysql> create database test; Query OK, 1 row affected (0.00 sec) mysql> show create database test; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> use test; Database changed mysql> select database(); +------------+ | database() | +------------+ | test | +------------+ 1 row in set (0.00 sec) mysql> drop database test; Query OK, 0 rows affected (0.00 sec)
三、数据表层面
1、常用命令
mysql>show tables; # 显示当前数据库下所有数据表 mysql>create table 表名 ( 字段名1 数据类型 [完整性约束条件], 字段名2 数据类型 [完整性约束条件], 字段名3 数据类型 [完整性约束条件], .......... )[engine=innodb]; # 创建数据表 [引擎类型,默认innodb] mysql>show create table 表名; # 显示数据表的基本信息,含字段及其属性、引擎、字符集等 mysql>desc 表名; # 显示数据表信息,显示字段及其属性 mysql>alter table 原表名 rename to 新表名; # 修改数据表名 mysql>alter table 表名 change 原字段名 新字段名 新数据属性; # 修改表中字段 mysql>alter table 表名 modify 字段名 数据类型; # 修改表中字段属性 mysql>alter table 表名 add 新字段名 数据类型 [约束条件]; # 添加新字段 mysql>alter table 表名 drop 字段名; # 删除字段 (慎重!!!一般使用逻辑删除) mysql>drop table 表名; # 删除数据表 (慎重!!!)
2、举例说明
mysql> show tables; # 显示所有数据表 +------------------+ | Tables_in_school | +------------------+ | class | | graduate | | student | | teacher | +------------------+ 4 rows in set (0.00 sec) mysql> create table test( # 新建数据表,engine=innodb可省略 -> id int(100) unsigned not null primary key auto_increment, -> age int(100) -> )engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> show create table test; # 显示数据表详细信息 +-----------------+ | Table | Create Table | +----------+ | test | CREATE TABLE `test` ( `id` int(100) unsigned NOT NULL AUTO_INCREMENT, `age` int(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+ 1 row in set (0.01 sec) mysql> desc test; # 显示数据表字段信息 +-------+-------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------------+------+-----+---------+----------------+ | id | int(100) unsigned | NO | PRI | NULL | auto_increment | | age | int(100) | YES | | NULL | | +-------+-------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> alter table test rename to test1; # 重命名数据表 Query OK, 0 rows affected (0.01 sec) mysql> show tables; +------------------+ | Tables_in_school | +------------------+ | class | | graduate | | student | | teacher | | test1 | +------------------+ 5 rows in set (0.00 sec) mysql> alter table test1 change age birthday date not null; # 修改数据表字段,含字段名和字段属性 Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test1; +----------+-------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------------+------+-----+---------+----------------+ | id | int(100) unsigned | NO | PRI | NULL | auto_increment | | birthday | date | NO | | NULL | | +----------+-------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> alter table test1 modify birthday datetime; # 修改字段属性 Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test1; +----------+-------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------------+------+-----+---------+----------------+ | id | int(100) unsigned | NO | PRI | NULL | auto_increment | | birthday | datetime | YES | | NULL | | +----------+-------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> alter table test1 drop birthday; # 删除字段 Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test1; +-------+-------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------------+------+-----+---------+----------------+ | id | int(100) unsigned | NO | PRI | NULL | auto_increment | +-------+-------------------+------+-----+---------+----------------+ 1 row in set (0.00 sec) mysql> drop table test1; # 删除数据表 Query OK, 0 rows affected (0.01 sec) mysql> show tables; +------------------+ | Tables_in_school | +------------------+ | class | | graduate | | student | | teacher | +------------------+ 4 rows in set (0.00 sec)
四、数据层面
1、常用命令
mysql>insert into 表名 [字段名1,字段名2,....] values (值1,值2,.......), (值1,值2,.......), (值1,值2,.......) ........ ; # 如使用字段,则添加的每条记录的值必须与字段一一对应;如不指定字段,则属于按位置添加数据,每条记录的值须同数据表中所有字段一一对应 mysql>update 表名 set 字段名1=值1, 字段名2=值2, .... [where 条件]; # 更新/更改数据:[条件限制,如不加条件,则默认所有记录的该字段均修改] mysql>alert table 表1名 add foreign key(字段1名) references 表2名(字段2名); # 为表1的字段1添加外键,连接表2的字段2,外键可选约束条件作为参数 mysql>alert table 表名 drop foreign key 字段名; # 删除外键 mysql>create [unique | fulltext | spatial] index 索引名 on 表名(字段名[asc | desc]); # 创建索引,索引会提高查找速度,但是会增加物理开销 mysql>drop index 索引名 on 表名; # 删除索引 mysql>delete from 表名 [where 条件];# 删除表中数据[条件限制,如无条件,则清空数据表] mysql>truncate table 表名; # 清空数据表 mysql>select 字段名1,字段名2,...... from 表名; # 查看表中数据,如查看所有数据使用 select * from 表名 ,这是数据查看的基本形式,后面的例子中会有拓展
2、举例说明
mysql> alter table student add foreign key(class) references class(cid); # 添加外键,如果表中有数据,则会添加失败 Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create index sid_index on student(sid); # 创建索引 Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table student; +-----------------+ | Table | Create Table +-----------------+ | student | CREATE TABLE `student` ( `sid` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `gender` char(1) NOT NULL, `age` int(3) unsigned NOT NULL, `birthday` datetime NOT NULL, `phone` varchar(11) DEFAULT NULL, `class` int(10) unsigned NOT NULL, `grade` int(10) unsigned NOT NULL, PRIMARY KEY (`sid`), KEY `sid_index` (`sid`), # 索引在这里 KEY `class` (`class`), CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`) REFERENCES `class` (`cid`) # 这里显示外键的名称:student_ibfk_1,删除的时候要用这个字段 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 | +-----------+ 1 row in set (0.00 sec) mysql> insert into class values # 添加数据,先添加class表数据,注意:如果存在外键,则外键所指向的数据表不能为空,否则无法添加数据 -> (1,'10级1班',1,45,'东教学楼1层'), -> (2,'09级1班',2,48,'东教学楼2层'), -> (3,'09级2班',2,50,'东教学楼2层'), -> (4,'08级1班',3,51,'东教学楼3层'), -> (5,'08级2班',4,49,'东教学楼3层'); Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> insert into student values # 再添加student表数据 -> (1,'李杰','男',21,'1990-1-2',13012345678,1,1), -> (2,'王倩','女',22,'1989-4-21',15212345678,1,1), -> (3,'张大力','男',20,'1991-2-12',NULL,2,2), -> (4,'王晓红','女',20,'1991-7-5',18900001111,2,2), -> (5,'周大宝','男',21,'1990-12-23',NULL,3,2), -> (6,'王志刚','男',22,'1989-10-10',NULL,3,2), -> (7,'刘明','男',21,'1990-11-30',15912345678,4,3), -> (8,'郭芙蓉','女',20,'1991-6-17',NULL,4,3), -> (9,'李飞','男',23,'1988-12-3',13212345678,5,3), -> (10,'苏洁','女',25,'1986-5-16',NULL,5,3); Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> select * from student; # 查询student 中所有数据 +-----+-----------+--------+-----+---------------------+-------------+-------+-------+ | sid | name | gender | age | birthday | phone | class | grade | +-----+-----------+--------+-----+---------------------+-------------+-------+-------+ | 1 | 李杰 | 男 | 21 | 1990-01-02 00:00:00 | 13012345678 | 1 | 1 | | 2 | 王倩 | 女 | 22 | 1989-04-21 00:00:00 | 15212345678 | 1 | 1 | | 3 | 张大力 | 男 | 20 | 1991-02-12 00:00:00 | NULL | 2 | 2 | | 4 | 王晓红 | 女 | 20 | 1991-07-05 00:00:00 | 18900001111 | 2 | 2 | | 5 | 周大宝 | 男 | 21 | 1990-12-23 00:00:00 | NULL | 3 | 2 | | 6 | 王志刚 | 男 | 22 | 1989-10-10 00:00:00 | NULL | 3 | 2 | | 7 | 刘明 | 男 | 21 | 1990-11-30 00:00:00 | 15912345678 | 4 | 3 | | 8 | 郭芙蓉 | 女 | 20 | 1991-06-17 00:00:00 | NULL | 4 | 3 | | 9 | 李飞 | 男 | 23 | 1988-12-03 00:00:00 | 13212345678 | 5 | 3 | | 10 | 苏洁 | 女 | 25 | 1986-05-16 00:00:00 | NULL | 5 | 3 | +-----+-----------+--------+-----+---------------------+-------------+-------+-------+ 10 rows in set (0.00 sec) mysql> select sid,name,gender,age as '年龄' from student where class=3 and grade=2; # 条件查询,查询class=3 & grade=2的学生sid、name、gender、age,并将age重命名 +-----+-----------+--------+--------+ | sid | name | gender | 年龄 | +-----+-----------+--------+--------+ | 5 | 周大宝 | 男 | 21 | | 6 | 王志刚 | 男 | 22 | +-----+-----------+--------+--------+ 2 rows in set (0.01 sec) # 查询王倩同学的上课地点,显示姓名、性别及地点 mysql> select s.name,s.gender,c.location # 使用数据表简称获取响应的字段,如果该字段在所有使用的数据表中唯一,则可以不带表名,直接写字段 -> from student as s,class as c # 多表查询时,通常将每个表重命名为简称 -> where s.class=c.cid # 多表查询的连接依据 -> and s.name='王倩'; # 附加查询条件 +--------+--------+------------------+ | name | gender | location | +--------+--------+------------------+ | 王倩 | 女 | 东教学楼1层 | +--------+--------+------------------+ 1 row in set (0.01 sec) # 查看2年级的男女数量 mysql> select gender,count(*) from student where grade=2 group by gender; # 使用group by实现分组 count()是聚合函数 +--------+----------+ | gender | count(*) | +--------+----------+ | 女 | 1 | | 男 | 3 | +--------+----------+ 2 rows in set (0.01 sec) mysql> select gender,count(*) from student where grade=2 group by gender having gender='男'; # group by 后面可以加条件语句having,having可以使用聚合函数,而where是不可以的 +--------+----------+ | gender | count(*) | +--------+----------+ | 男 | 3 | +--------+----------+ 1 row in set (0.01 sec) # 查询人数大于2的年级中,显示年级、人数、各年级的学生平均年龄、男生数量,并安装平均年龄倒序显示 mysql> select grade,count(*),avg(age),count(gender='男') -> from student -> group by grade -> having count(*)>2 and count(gender='男') -> order by avg(age) desc; +-------+----------+----------+---------------------+ | grade | count(*) | avg(age) | count(gender='男') | +-------+----------+----------+---------------------+ | 3 | 4 | 22.2500 | 4 | | 2 | 4 | 20.7500 | 4 | +-------+----------+----------+---------------------+ 2 rows in set (0.00 sec)
一个常用的查询结构:
查询语句 执行顺序 select [distinct] * | 字段1,字段2,..| 聚合函数 ⑤ from 表1 as a,表2 as b ..... ① join on a.id=b.id ....... ② where 字段|isfull [= > < is not in like between and or ] 值 (子查询)..... ③ group by 字段 ④ having 条件 [聚合函数] ⑥ order by 字段 | [聚合函数] [asc | desc] ⑦ limit [offset] 数量; ⑧ ⑨ 展示结果
参考资料:《MySQL数据库入门》