文对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] 数量; ⑧