MySQL Cheat Sheet

基础命令

登录mysql -uroot -p[密码]

退出exitquit

查看数据库列表show databases;

使用某个数据库use [数据库名];

查看当前使用的数据库名select database();

创建数据库create database [数据库名];

删除数据库:drop database [数据库名];

查看数据库表名show tables;

执行SQL脚本:use 某个数据库时source [不带中文的路径],Windows可能要用两个反斜杠

查看表所有数据select * from [表名];

查看表结构desc [表名];

查看 MySQL 版本select version();

Windows中打开服务net start mysql80

Windows中关闭服务net stop mysql80

注意这两个命令是在cmd里面输入的,mysql80是安装MySQL在windows服务界面配置的服务名,默认mysql80

除了命令行,还可以通过Windows的服务手动打开和关闭

其他命令

  • SHOW STATUS; 显示广泛服务器状态信息

  • SHOW GRANTS; 显示授权用户的安全权限

  • SHOW ERRORS;服务器错误信息

  • SHOW WARNINGS;服务器警告信息

  • show engines \G查看存储引擎

  • show create table [表名];查看创建语句:

导出数据(退出MySQL到命令行):

例子:

--single-transaction选项: 该选项适用于 InnoDB 引擎的表,可以在导出时启动一个事务,从而避免锁表。使用该选项,mysqldump 会在导出过程中保持数据的一致性,而不需要锁定表,这样其他进程仍然可以对数据库进行读写操作

在目标服务器上,使用 mysql 客户端来导入数据库。首先需要创建数据库(如果它还不存在),然后导入

Select

简单查询

查询多个字段select [字段名],[字段名]... from [表名];

查询所有字段select * from [表名];

列起别名

select [字段名] as [别名] from [表名];

select [字段名] [别名] from [表名];

select [字段名] ‘[别名]’ from [表名];(别名是中文或带空格的方案)

字段可以带有数学表达式,例如:select ENAME, SAL*12 'YEAR SALE' from emp;

条件查询

格式

例子

条件

  • 大小关系:=, !=, <, >, <>

  • 两个值之间(包含):between [值1] and [值2]

  • 判断为空:is nullis not null

  • 并且:and

  • 或:or (and 优先级比 or 高,加括号改变优先级)

  • 是否包含:in ([值1], [值2]...)not in ([值1], [值2]...)

  • 模糊查询:like [值](% 代表 0 到任意多个字符, _ 代表任意一个字符,注意 \ 转义)

多情况讨论

格式:

例子:

子查询

语法:

select, from, where 子句中嵌套查询

例子:

正则表达式

  • \\ 代表转义

  • [0-9] 匹配 0~9 的任意一个字符

  • ? 代表其前一个字符出现1次或0次

  • 此处 ^ 代表匹配串的开始

union

语法:

注:合理运用 union, 查询次数可以优于 join (例如多表连接)

注:要求结果的列数和数据类型相同

例子:

  • UNION 自动去除重复的行,使用 UNION ALL 包含重复的行

  • UNION 中若要排序,只允许出现一次,放在最后的 SELECT 语句后

单行处理函数

  • 转大小写:lower(字段名)upper(字段名)

  • 提取子串:substr(字段名, 起始下标, 截取长度) 注:起始下标从 1 开始

  • 拼接成字符串:concat(字段名1, 字段名2)

  • 长度:length(字段名)

  • 去空格:trim(字段名)

  • 四舍五入:round(字段名, 小数位)

  • 生成随机数:rand()

  • 处理 NULL:ifnull(字段名, 被当做的值)

  • 条件表达式:if(条件,为真的值,为假的值)

  • ABS(): 返回一个数的绝对值。

  • CEILING(): 返回大于或等于给定数值的最小整数。

  • FLOOR(): 返回小于或等于给定数值的最大整数。

  • ROUND(): 四舍五入到指定的小数位数。

  • MOD(): 返回除法操作的余数。

  • FORMAT(): 格式化数字为格式化的字符串,通常用于货币显示。

例子:

限制结果条数

语法:

**例子:**偏移量是从 0 开始的,即第一条记录的偏移量是 0;如果想从第 3 条记录开始,偏移量就应该是 2。

排序

格式

例子:

规则:

  • 默认升序:[字段名]

  • 指定降序:[字段名] desc

  • 指定升序:[字段名] asc

  • 多个字段排序:[字段名1] [排序方式], [字段名2] [排序方式]...(靠前的规则优先)

  • 根据查询结果的字段位置排序:[数字]

分组

格式:

例子:

分组函数(多行处理函数):

  • 最大最小:max(字段名)min(字段名)

  • 求和:sum(字段名),可以加入判断例如 sum(a.id<10)

  • 平均:avg(字段名)

  • 数量:count(字段名) 计算不为 null 的数量,count(*) 包括 null 的数量

对于判断,例如 a.id<10,返回的是0或1,对于 count,因为不为 null 都计数,所以count(a.id<10)没有意义,无论0或者1都计数,对于sum函数可以累加返回1的个数

关键字补充

  • 去重:distinct(放在所有字段前,后面字段联合去重)

  • WITH ROLLUP 在分组中使用,获得汇总值

join

内连接

SQL99语法:

注:A B 两表没有主次关系,只看表连接条件,inner 可省略

例子:

外连接

语法:

注:right 意思是表 B 为主表,left 意思是表 A 为主表,outer 可省略

例子:

自联结

例:寻找与 prod_id = 'DTNTR' 产品相同供应商的产品

自然连接

不重要的概念,指联结后不出现重复的列

DQL 语句总结

格式:

执行顺序:

  1. from

  2. where

  3. group by

  4. having

  5. select

  6. order by

  7. limit

例子:每个部门工资最多的人

修改表结构

创建表

注:default [默认值] 可省略

删表

数据类型:

  • varchar 可变长度字符串(最长255)

  • char 定长字符串(最长255)

  • int

  • bigint 长整型

  • float

  • double 短日期

  • datetime 长日期,年月日时分秒

  • date 短日期,年月日

  • clob 字符大对象,可存 4G 字符串

  • blob 二进制大对象,例如媒体数据

例子:

添加列:

删除列:

添加约束:

重命名表

约束

  • 非空约束 :not null

  • 唯一性约束(NULL不算): unique

  • 联合唯一:unique([字段名1],[字段名2]...)

  • 主键约束(非空,唯一):primary key

  • 复合主键(不建议使用):primary key([字段名1],[字段名2]...)

  • 设置自然主键:auto_increment

  • 外键约束:foreign key([子表字段名]) references [父表名]([父表unique字段名])

例子:

隔离

查看隔离级别:

改变隔离级别:

隔离级别:

  • read uncommitted:可以查到未提交的数据

  • read committed:查已提交的数据

  • repeatable read:只要另一方开启事务就不会查到对应数据

  • serializable:非并行,排队

索引

查看索引:

添加索引:

注:主键与 unique 自动添加索引

删除索引:

注:索引可以缩短查询时间,但模糊查询,类型转换,or条件,索引字段参与运算或函数等等情况会使其失效

insert 插入数据

格式:

注:([字段名1], [字段名2], [字段名3]...) 可省略,values 要填写全部信息

例子:

日期操作

字符串转date:

注:如果日期格式为'%Y-%m-%d',不用函数也能将字符串转date

date转字符串:

注:默认日期格式为'%Y-%m-%d' 注:如果是datetime,默认日期格式为'%Y-%m-%d %h:%i:%s'

获取当前时间:

%Y
%m
%d
%h
%i
%s

例子:

CurDate()
CurTime()
Now()

返回当前日期

返回当前时间

返回当前日期和时间

Date()
Time()
Year()
Month()
Day()
Hour()
Minute()
Second()

返回日期部分

返回时间部分

返回年部分

类比

类比

类比

类比

类比

例子:

update 修改数据

格式:

例子:

删除表中数据

格式:

注:delete支持回滚,速度慢。truncate 物理删除,速度快

例子:

区别
delete
truncate
drop

类型

属于 DML

属于 DDL

属于 DDL

回滚

可回滚

不可回滚

不可回滚

删除内容

表结构还在,删除表的全部或者一部分数据行

表结构还在,删除表中的所有数据

从数据库中删除表,所有数据行,索引和权限也会被删除

删除速度

删除速度慢,需要逐行删除

删除速度快

删除速度最快

因此,在不再需要一张表的时候,用 drop;在想删除部分数据行时候,用 delete;在保留表而删除所有数据的时候用 truncate

视图

创建视图:

删除视图:

注:对视图的增删改查格式不变,对视图的改变会影响原表

例子:

全文本搜索

开启全文本搜索支持

全文本搜索为每一条数据给出一个匹配值,最匹配d的记录优先

使用查询扩展,即找出与搜索结果再相关的其他行

布尔文本搜索不需要建立 FULLTEXT 索引,更慢

例子:

  • -代表排除后面这个词

  • *代表词尾通配符

  • ""将双引号内部的词视为一整个短语

  • +代表一定有这个词

  • ()包含一个子表达式

  • <降低这个词的等级

存储过程

  • 存储过程可以封装一系列复杂的操作

  • 有输入输出

  • 形式类似于函数

创建存储过程

例子1:

  • DELIMITER重新定义语句分隔符

  • BEGIN, END 包含存储过程体

  • 存储过程名为 productpricing(),这个例子没有参数

例子2:

  • 这个存储过程有三个函数

  • OUT代表可以从存储过程传出

  • pl等等为形参名

  • DECIMAL是一种数据类型,精度可变的浮点值

例子3:

  • IN 代表传入参数

例子4:

  • --表示注释

  • DECLARE声明变量

  • IF,END IF包含分支语句

  • COMMENT内容非必要,将在SHOW PROCEDURE STATUS展示

使用存储过程

例子1:

例子2:

  • MySQL 变量名由@开始

例子3:

例子4:

删除存储过程

检查存储过程

游标


  • 通常在存储过程中使用

  • 表示一个SELECT语句,一次取一条数据,可用于遍历

触发器


  • 在对表内容修改前或后自动触发一些操作

  • 支持语句INSERT,DELETE,UPDATE

  • 使用BEFORE,AFTER来表示修改后或修改前

  • BEFORE可以用于验证数据

  • 如果触发器或语句出错,后续语句和触发器不会执行

  • 合理运用触发器,可以保证数据一致性,追踪保留更改

INSERT 触发器

  • 创建了名为neworder的触发器

  • INSERT orders之后触发

  • FOR EACH ROW代表每一行都触发

  • NEW是一个虚拟表,可以获取新插入的内容

DELETE 触发器

  • OLD是一个虚拟表,可以访问要删除的信息

  • OLD只读

UPDATE 触发器

  • NEW虚拟表可以修改,也修改即将更新的内容

  • OLD只读

删除触发器

事务

关闭自动提交机制:start transaction;

回滚:rollback;

提交:commit;

保留点:

  • 保留点在实务中设置

  • 如果不显式释放保留点,则在事务完成后自动释放

创建保留点

退回到保留点

释放保留点

不自动提交更改

用户管理

创建用户

更改口令

查看用户

重命名用户

删除用户

查看权限

  • USAGE代表没有权限

授予权限

  • 具体到权限表见书

例子:

撤销权限

最后更新于