SQL 语法(DDL/DML/DQL/DCL)、函数、约束、多表查询、事务
# MySQL 基础
# SQL 语法
# 数据定义(DDL)
数据库操作
代码语言:javascript复制SHOW DATABASES;
CREATE DATABASE [IF NOT EXISTS] 数据库名;
USE 数据库名;
SELECT DATABASE();
DROP DATABASE [IF EXISTS] 数据库名;
表操作
代码语言:javascript复制SHOW TABLES;
CREATE TABLE 表名(字段 字段类型,字段 字段类型,...);
DESC 表名;
SHOW CREATE TABLE 表名;
ALTER TABLE 表名 [ADD/MODIFY/CHANGE/DROP/RENAME TO] ...;
DROP TABLE 表名;
# 增删改(DML)
增加数据
代码语言:javascript复制INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2,...)[,(值1,值2,...)...];
修改数据
代码语言:javascript复制UPDATE 表名 SET 字段1=值1, 字段2=值2,... [WHERE 条件];
删除数据
代码语言:javascript复制DELETE FROM 表名 [WHERE 条件];
# 数据查询(DQL)
DQL 语句
代码语言:javascript复制SELECT 字段列表 -> 字段名[AS]别名
FROM 表名
WHERE 条件列表 -> (> >= < <= = <> like between...and in and or)
GROUP BY 分组字段列表
HAVING 分组后条件列表 -> 分组后过滤
ORDER BY 排序字段列表 -> 升序ASC,降序DESC
LIMIT 分页参数 -> 起始索引(从0开始),每页展示记录数
# 用户管理(DCL)
用户管路
代码语言:javascript复制CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '密码';
DROP USER '用户名'@'主机名';
权限控制
代码语言:javascript复制GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
# 函数
字符串函数
代码语言:javascript复制CONCAT, LOWER, UPPER, LPAD, RPAD, TRIM, SUBSTRING
数值函数
代码语言:javascript复制CEIL, FLOOR, MOD, RAND, ROUND
日期函数
代码语言:javascript复制CURDATE, CURTIME, NOW, YEAR, MONTH, DAY, DATE_ADD, DATEDIFF
流程函数
代码语言:javascript复制IF, IFNULL, CASE [...] WHEN ... THEN ... ELSE ... END
# 约束
- 非空约束:
NOT NULL
- 唯一约束:
UNIQUE
- 主键约束:
PRIMARY KEY
(自增:AUTO_INCREMENT) - 默认约束:
DEFAULT
- 检查约束:
CHECK
- 外键约束:
FOREIGN KEY
# 外键约束语法
添加外键
代码语言:javascript复制CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主表列名)
);
代码语言:javascript复制ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
删除外键
代码语言:javascript复制ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
删除 / 更新行为
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致) |
RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION 一致) |
CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为 null(这就要求该外键允许取 null)。 |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb 不支持) |
# 多表查询
多表关系
- 一对多:在多的一方设置外键,关联一的一方的主键
- 多对多:建立中间表,中间表包含两个外键,关联两张表的主键
- 一对一:用于表结构拆分,在其中任何一方设置外键(UNIQUE),关联另一方的主键
多表查询
内连接
代码语言:javascript复制隐式:
SELECT...FROM 表A,表B WHERE 条件...
显式:
SELECT...FROM 表A INNER JOIN 表B ON 条件...
外连接
代码语言:javascript复制左外:
SELECT...FROM 表A LEFT JOIN 表B ON 条件...
右外:
SELECT...FROM 表A RIGHT JOIN 表B ON 条件...
自连接:
代码语言:javascript复制SELECT...FROM 表A 别名1,表A 别名2 WHERE 条件...
子查询:标量子查询、列子查询、行子查询、表子查询
# 事务
事务简介:事务是一组操作的集合,这组操作,要么全部执行成功,要么全部执行失败。
事务操作
代码语言:javascript复制START TRANSACTION; -- 开启事务
COMMIT/ROLLBACK; -- 提交/回滚事务
事务四大特性 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
并发事务问题 赃读、不可重复读、幻读
事务隔离级别 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE