本备忘单旨在快速理解 MySQL 所涉及的主要概念,提供了最常用的SQL语句,供您参考。
入门
介绍
MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成,如下所示的一个表格
1 2 3 4 5 6 7 8 9
| name ▼ 键 ▼ 列(col) ┌┈┈┈┈┬┈┈┈┈┈┈┈┈┬┈┈┈┈┈┈┬┈┈┈┈┈┈┈┐ ┆ id ┆ name ┆ uid ┆ level ┆ ◀ 表头header ├┈┈┈┈┼┈┈┈┈┈┈┈┈┤┈┈┈┈┈┈┤┈┈┈┈┈┈┈┤ ┆ 1 ┆ mysql ┆ 0 ┆ 3 ┆ ├┈┈┈┈┼┈┈┈┈┈┈┈┈┤┈┈┈┈┈┈┤┈┈┈┈┈┈┈┤ ┆ 2 ┆ redis ┆ 12 ┆ 1 ┆ ◀ 行 row └┈┈┈┈┴┈┈┈┈┈┈┈┈┴┈┈┈┈┈┈┴┈┈┈┈┈┈┈┘ redis ▲ 值
|
表头(header)
每一列的名称
列(col)
具有相同数据类型的数据的集合
行(row)
每一行用来描述某个人/物的具体信息
值(value)
行的具体信息,每个值与该列数据类型相同
键(key)
用来识别某个特定的人/物的方法,有唯一性
登录MySQL
1 2 3 4 5 6
| # 默认用户名<root>,-p 是密码, # ⚠️参数后面不需要空格 mysql -h 127.0.0.1 -u <用户名> -p<密码> mysql -D 数据库名 -h 主机名 -u 用户名 -p mysql -h <host> -P <端口号> -u <user> -p [db_name] mysql -h <host> -u <user> -p [db_name]
|
常用的
数据库 Database
:- |
:- |
CREATE DATABASE db ; |
创建 数据库 |
SHOW DATABASES; |
列出 数据库 |
USE db; |
切换 到数据库 |
CONNECT db ; |
切换 到数据库 |
DROP DATABASE db; |
删除 数据库 |
表 Table
:- |
:- |
SHOW TABLES; |
列出当前数据库的表 |
SHOW FIELDS FROM t; |
表的列表字段 |
DESC t; |
显示表格结构 |
SHOW CREATE TABLE t; |
显示创建表sql |
TRUNCATE TABLE t; |
删除表中的所有数据 |
DROP TABLE t; |
删除表格 |
Proccess
:- |
:- |
show processlist; |
列出进程 |
kill pid; |
杀死进程 |
查看 MySQL 信息
1 2 3 4 5 6
| # 显示当前mysql的version的各种信息 mysql> status; # 显示当前mysql的version信息 mysql> select version(); # 查看 MySQL 端口号 mysql> show global variables like 'port';
|
退出MySQL会话
退出 quit;
或 \q;
一样的效果
备份
创建备份
1
| mysqldump -u user -p db_name > db.sql
|
导出不带架构的数据库
1
| mysqldump -u user -p db_name --no-data=true --add-drop-table=false > db.sql
|
恢复备份
1
| mysql -u user -p db_name < db.sql
|
MySQL 示例
管理表格
创建一个包含三列的新表
1 2 3 4 5 6
| CREATE TABLE t ( id INT, name VARCHAR DEFAULT NOT NULL, price INT DEFAULT 0 PRIMARY KEY(id) );
|
从数据库中删除表
向表中添加新列
1
| ALTER TABLE t ADD column;
|
从表中删除列c
1
| ALTER TABLE t DROP COLUMN c ;
|
添加约束
1
| ALTER TABLE t ADD constraint;
|
删除约束
1
| ALTER TABLE t DROP constraint;
|
将表从t1重命名为t2
1
| ALTER TABLE t1 RENAME TO t2;
|
将列c1重命名为c2
1
| ALTER TABLE t1 RENAME c1 TO c2 ;
|
将列c1的数据类型改为datatype
1
| ALTER TABLE t1 MODIFY c1 datatype;
|
删除表中的所有数据
从表中查询数据
从表中查询列c1、c2中的数据
查询表中的所有行和列
查询数据并使用条件筛选行
1 2
| SELECT c1, c2 FROM t WHERE condition
|
查询表中的不同行
1 2
| SELECT DISTINCT c1 FROM t WHERE condition
|
按升序或降序对结果集排序
1 2
| SELECT c1, c2 FROM t ORDER BY c1 ASC [DESC]
|
跳过行的偏移并返回下n行
1 2 3
| SELECT c1, c2 FROM t ORDER BY c1 LIMIT n OFFSET offset
|
使用聚合函数对行进行分组
1 2 3
| SELECT c1, aggregate(c2) FROM t GROUP BY c1
|
使用HAVING子句筛选组
1 2 3 4
| SELECT c1, aggregate(c2) FROM t GROUP BY c1 HAVING condition
|
从多个表查询
内部连接 t1 和 t2
1 2 3
| SELECT c1, c2 FROM t1 INNER JOIN t2 ON condition
|
左连接t1和t1
1 2 3
| SELECT c1, c2 FROM t1 LEFT JOIN t2 ON condition
|
右连接t1和t2
1 2 3
| SELECT c1, c2 FROM t1 RIGHT JOIN t2 ON condition
|
执行完全外部连接
1 2 3
| SELECT c1, c2 FROM t1 FULL OUTER JOIN t2 ON condition
|
生成表中行的笛卡尔积
1 2 3
| SELECT c1, c2 FROM t1 CROSS JOIN t2
|
执行交叉连接的另一种方法
1 2
| SELECT c1, c2 FROM t1, t2
|
使用INNER Join子句将t1连接到自身
1 2 3
| SELECT c1, c2 FROM t1 A INNER JOIN t1 B ON condition
|
使用SQL运算符,合并两个查询中的行
1 2 3
| SELECT c1, c2 FROM t1 UNION [ALL] SELECT c1, c2 FROM t2
|
返回两个查询的交集
1 2 3
| SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2
|
从另一个结果集中减去一个结果集
1 2 3
| SELECT c1, c2 FROM t1 MINUS SELECT c1, c2 FROM t2
|
使用模式匹配%查询行_
1 2
| SELECT c1, c2 FROM t1 WHERE c1 [NOT] LIKE pattern
|
查询列表中的行
1 2
| SELECT c1, c2 FROM t WHERE c1 [NOT] IN value_list
|
查询两个值之间的行
1 2
| SELECT c1, c2 FROM t WHERE c1 BETWEEN low AND high
|
检查表中的值是否为NULL
1 2
| SELECT c1, c2 FROM t WHERE c1 IS [NOT] NULL
|
使用 SQL 约束
将c1和c2设置为主键
1 2 3 4
| CREATE TABLE t( c1 INT, c2 INT, c3 VARCHAR, PRIMARY KEY (c1,c2) );
|
将c2列设置为外键
1 2 3 4 5
| CREATE TABLE t1( c1 INT PRIMARY KEY, c2 INT, FOREIGN KEY (c2) REFERENCES t2(c2) );
|
使c1和c2中的值唯一
1 2 3 4
| CREATE TABLE t( c1 INT, c1 INT, UNIQUE(c2,c3) );
|
确保c1>0和c1>=c2中的值
1 2 3 4
| CREATE TABLE t( c1 INT, c2 INT, CHECK(c1> 0 AND c1 >= c2) );
|
c2列中的设置值不为NULL
1 2 3 4
| CREATE TABLE t( c1 INT PRIMARY KEY, c2 VARCHAR NOT NULL );
|
修改数据
在表格中插入一行
1 2
| INSERT INTO t(column_list) VALUES(value_list);
|
在表格中插入多行
1 2 3
| INSERT INTO t(column_list) VALUES (value_list), (value_list), …;
|
将行从t2插入t1
1 2 3
| INSERT INTO t1(column_list) SELECT column_list FROM t2;
|
更新列c1中所有行的新值
1 2
| UPDATE t SET c1 = new_value;
|
更新列c1、c2中与条件匹配的值
1 2 3 4
| UPDATE t SET c1 = new_value, c2 = new_value WHERE condition;
|
删除表中的所有数据
删除表中的行子集
1 2
| DELETE FROM t WHERE condition;
|
管理视图
创建由c1和c2组成的新视图
1 2 3 4
| CREATE VIEW v(c1,c2) AS SELECT c1, c2 FROM t;
|
使用选中选项创建新视图
1 2 3 4 5
| CREATE VIEW v(c1,c2) AS SELECT c1, c2 FROM t; WITH [CASCADED | LOCAL] CHECK OPTION;
|
创建递归视图
1 2 3 4 5
| CREATE RECURSIVE VIEW v AS select-statement UNION [ALL] select-statement;
|
创建临时视图
1 2 3 4
| CREATE TEMPORARY VIEW v AS SELECT c1, c2 FROM t;
|
删除视图
管理触发器
创建或修改触发器
1 2 3 4
| CREATE OR MODIFY TRIGGER trigger_name WHEN EVENT ON table_name TRIGGER_TYPE EXECUTE stored_procedure;
|
WHEN
:- |
:- |
BEFORE |
在事件发生前调用 |
AFTER |
事件发生后调用 |
EVENT
:- |
:- |
INSERT |
为INSERT调用 |
UPDATE |
调用UPDATE |
DELETE |
调用DELETE |
TRIGGER_TYPE
:- |
:- |
FOR EACH ROW |
- |
FOR EACH STATEMENT |
- |
管理索引
在t表的c1和c2上创建索引
1 2
| CREATE INDEX idx_name ON t(c1,c2);
|
在t表的c3、c4上创建唯一索引
1 2
| CREATE UNIQUE INDEX idx_name ON t(c3,c4)
|
删除索引
1
| DROP INDEX idx_name ON t;
|
MySQL 数据类型
Strings
- |
- |
CHAR |
String (0 - 255) |
VARCHAR |
String (0 - 255) |
TINYTEXT |
String (0 - 255) |
TEXT |
String (0 - 65535) |
BLOB |
String (0 - 65535) |
MEDIUMTEXT |
String (0 - 16777215) |
MEDIUMBLOB |
String (0 - 16777215) |
LONGTEXT |
String (0 - 4294967295) |
LONGBLOB |
String (0 - 4294967295) |
ENUM |
One of preset options |
SET |
Selection of preset options |
Date & time
Data Type |
Format |
DATE |
yyyy-MM-dd |
TIME |
hh:mm:ss |
DATETIME |
yyyy-MM-dd hh:mm:ss |
TIMESTAMP |
yyyy-MM-dd hh:mm:ss |
YEAR |
yyyy |
Numeric
- |
- |
TINYINT x |
Integer (-128 to 127) |
SMALLINT x |
Integer (-32768 to 32767) |
MEDIUMINT x |
Integer (-8388608 to 8388607) |
INT x |
Integer (-2147483648 to 2147483647) |
BIGINT x |
Integer (-9223372036854775808 to 9223372036854775807) |
FLOAT |
Decimal (precise to 23 digits) |
DOUBLE |
Decimal (24 to 53 digits) |
DECIMAL |
“DOUBLE” stored as string |
函数
聚合函数
函数 |
解释 |
SUM() |
计算一列值的总和 |
AVG() |
计算一列值的平均值 |
COUNT() |
计算行数,可选择性地忽略NULL值 |
MAX() |
找出一列的最大值 |
MIN() |
找出一列的最小值 |
数学函数
函数 |
解释 |
示例语法 |
结果 |
ABS(x) |
返回数值的绝对值 |
ABS(-5) |
5 |
ROUND(x,y) |
四舍五入到指定的小数位数,y为小数位数,默认为0 |
ROUND(3.1415,2) |
3.14 |
FLOOR(x) |
向下取整至最接近的整数 |
FLOOR(3.7) |
3 |
CEIL(x) |
向上取整至最接近的整数 |
CEIL(3.3) |
4 |
SQRT(x) |
返回一个数的平方根 |
SQRT(16) |
4 |
MOD(x,y) |
返回x除以y的余数 |
MOD(10,3) |
1 |
RAND([seed]) |
返回0到1之间的随机数,可选种子值 |
RAND() 或 RAND(123) |
0.345… |
日期和时间函数
函数 |
解释 |
NOW() |
返回当前日期和时间 |
CURDATE() |
返回当前日期 |
CURTIME() |
返回当前时间 |
DATE_FORMAT() |
格式化日期时间输出 |
DATEDIFF() |
计算两个日期之间相差的天数 |
STR_TO_DATE() |
将字符串转换为日期格式 |
字符串函数
函数 |
解释 |
示例语法 |
结果 |
CONCAT(s1,s2,...) |
连接两个或更多字符串 |
CONCAT('Hello, ','World!') |
‘Hello, World!’ |
LOWER(str) |
转换为小写 |
LOWER('HELLO') |
‘hello’ |
UPPER(str) |
转换为大写 |
UPPER('world') |
‘WORLD’ |
TRIM(str) |
去除字符串两端空格 |
TRIM(' Hello ') |
‘Hello’ |
LEFT(str,len) |
提取字符串左侧的若干字符 |
LEFT('Hello', 3) |
‘Hel’ |
RIGHT(str,len) |
提取字符串右侧的若干字符 |
RIGHT('Hello', 2) |
‘lo’ |
SUBSTR(str,pos,len) |
提取字符串中的一部分 |
SUBSTR('Hello', 2, 3) |
‘ell’ |
REPLACE(str,from_str,to_str) |
替换字符串中的部分文本 |
REPLACE('Hello', 'l', 'L') |
‘HeLLo’ |
高级函数
函数 |
解释 |
示例语法 |
结果 |
BIN(x) |
返回 x 的二进制编码,x 为十进制数。 |
BIN(2) |
10 |
BINARY(s) |
将字符串 s 转换为二进制字符串。 |
BINARY 'RUNOOB' |
'RUNOOB' (显示效果,实际存储为二进制) |
CASE |
复合条件函数,根据条件返回不同结果。 |
CASE WHEN 1 > 0 THEN '1 > 0' WHEN 2 > 0 THEN '2 > 0' ELSE '3 > 0' END |
'1 > 0' |
CAST(x AS type) |
转换数据类型。 |
CAST('2017-08-29' AS DATE) |
2017-08-29 |
COALESCE(expr1, expr2, …, expr_n) |
返回第一个非空表达式的值。 |
COALESCE(NULL, NULL, 'runoob.com', NULL, 'google.com') |
'runoob.com' |
CONNECTION_ID() |
返回当前连接的唯一ID。 |
CONNECTION_ID() |
4292835 (示例值) |
CONV(x, f1, f2) |
将 f1 进制数转换为 f2 进制数。 |
CONV(15, 10, 2) |
1111 |
CONVERT(s USING cs) |
转换字符串 s 的字符集为 cs。 |
CHARSET(CONVERT('ABC' USING gbk)) |
gbk |
CURRENT_USER() |
返回当前用户。 |
CURRENT_USER() |
guest@% |
DATABASE() |
返回当前数据库名。 |
DATABASE() |
runoob |
IF(expr, v1, v2) |
条件表达式,expr 为真则 v1,否则 v2。 |
IF(1 > 0, '正确', '错误') |
'正确' |
IFNULL(v1, v2) |
如果 v1 不为 NULL,则返回 v1,否则返回 v2。 |
IFNULL(NULL, 'Hello Word') |
'Hello Word' |
ISNULL(expression) |
判断表达式是否为 NULL。 |
ISNULL(NULL) |
1 |
LAST_INSERT_ID() |
返回最近生成的 AUTO_INCREMENT 值。 |
LAST_INSERT_ID() |
6 (示例值) |
NULLIF(expr1, expr2) |
若 expr1 等于 expr2,则返回 NULL,否则返回 expr1。 |
NULLIF(25, 25) |
NULL |
另见