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