MYSQL 学习记录
基础
SQL
SQL通用语法:
- 可以单行或多行书写,以分号结尾。
- 使用 空格 和 缩进 增加语句的可读性。
- 语句 不区分大小写,关键字建议使用大写。
- 单行注释:
# 注释内容
,多行注释:/* 注释内容 */
。
SQL分类:
分类 | 全程 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象 |
DML | Data Manipulation Language | 数据操作语言,用来对数据库中表的数据进行增删改查 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户,控制数据库的访问权限 |
DDL 数据定义语言
数据库操作:
查询:
- 查询所有数据库。
SHOW DATABASES;
- 查询当前数据库。
SELECT DATABASE();
创建:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
删除:
DROP DATABASE [IF EXISTS] 数据库名;
使用:
USE 数据库名;
表操作:
查询:
- 查询当前数据库所有表。
SHOW TABLES;
- 查询表结构。
DESC 表名;
- 查询指定表的建表语句。
SHOW CREATE TABLE 表名;
创建:
CREATE TABLE 表名( 字段1 字段1类型 [COMMENT 字段1注释], 字段2 字段2类型 [COMMENT 字段2注释], ... ) [COMMENT 表注释];
修改:
- 添加字段。
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
- 修改字段。
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
- 删除字段。
ALTER TABLE 表名 DROP 字段名;
- 修改表名。
ALTER TABLE 表名 RENAME TO 新表名;
- 删除表。
DROP TABLE [IF EXISTS] 表名;
- 删除表并重建。
TRUNCATE TABLE 表名;
DML 数据操作语言
添加数据:
- 给指定字段添加数据。
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
- 给所有字段添加数据。
INSERT INTO 表名 VALUES (值1, 值2, ...);
- 给指定字段批量添加数据。
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...);
- 给所有字段批量添加数据。
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...);
修改数据:
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2, ... [WHERE 条件];
删除数据:
DELETE FROM 表名 [WHERE 条件]
DQL 数据查询语言
基本查询:
- 查询多个字段。
SELECT 字段1, 字段2, ... FROM 表名;
SELECT * FROM 表名;
- 设置别名。
SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... DROM 表名;
- 去重复记录。
SELECT DISTINCT 字段列表 FROM 表名;
条件查询:
- 语法:
SELECT 字段列表 FROM 表名 WHERE 条件列表;
- 条件:
运算符 | 功能 | 运算符 | 功能 |
---|---|---|---|
<> 或 != | 不等于 | BETWEEN … AND … | 在某个范围之内 |
IN(…) | 选出在列表中的值 | LIKE 占位符 | 模糊匹配 |
IS NULL | 是 NULL | NOT 或 ! | 不是 |
聚合函数:
- 介绍:
将一列数据作为一个整体,进行纵向计算。
- 常见函数:
函数 | 功能 | 函数 | 功能 |
---|---|---|---|
count | 计数(null 值不参与) | max | 最大值 |
min | 最小值 | avg | 平均值 |
sum | 求和 |
分组查询:
- 语法:
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
- 要点:
- where 在分组之前进行过滤,不满足 where 条件不参与分组;而 having 是分组后对结果进行过滤。
- where 不能对聚合函数进行判断,而 having 可以。
排序查询:
- 语法:
SELECT 字段列表 FROM 表名 GROUP BY 字段1 排序方式1, 字段2 排序方式2;
- 排序方式:
ASC:升序(默认)。
DESC:降序。
分页查询:
- 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
- 要点:
- 起始索引从 0 开始,起始索引 = (页码 - 1) * 每页数量。
- 不同数据库分页查询实现方法不同。
- 若查询第一页数据,起始索引可以省略。
- 执行顺序:
SELECT 字段列表 // 4
FROM 表名列表 // 1
WHERE 条件列表 // 2
GROUP BY 分组字段列表 // 3
HAVING 分组后条件列表 // 7
ORDER BY 排序字段列表 // 5
LIMIT 分页参数 // 6
DCL 数据控制语言
管理用户:
- 查询用户:
USE mysql;
SELECT * FROM user;
- 创建用户:
CREATE USER '用户名‘@’主机名 IDENTIFIED BY '密码';
- 修改用户密码:
ALTER USER '用户名‘@’主机名 IDENTIFIED WITH mysql_native_password BY '新密码';
- 删除用户:
DROP USER '用户名'@'主机名';
权限控制:
- 查询权限:
SHOW GRANTS FOR '用户名‘@’主机名';
- 授予权限:
GRANT 权限列表 ON 数据库名.表名 TO '用户名‘@’主机名';
- 撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名‘@’主机名';
函数
字符串函数
函数 | 功能 |
---|---|
CONCAT(S1, S2, …) | 字符串拼接 |
LOWER(str) | 将 str 变为 小写 |
UPPER(str) | 将 str 变为大写 |
LPAD(str, n, pad) | 左填充, 达到 n 个长度 |
RPAD(str, n, pad) | 右填充, 达到 n 个长度 |
TRIM(str) | 去掉 str 头尾的空格 |
SUBSTRAING(str, start, len) | 返回字符串从 start 到 len 的子串 (索引从 1 开始) |
数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x, y) | 返回 x / y 的模 |
RAND() | 返回 0~1 间的随机数 |
ROUND(x, y) | 求参数 x 的四舍五入的值, 保留 y 位小数 |
日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期加时间 |
YEAR(date) | 当前 date 的年份 |
MONTH(date) | 当前 date 的月份 |
DAY(date) | 当前 date 的日期 |
DATE_ADD(date, INTERVAL expr type) | 返回日期加上一个时间间隔后的值 |
DATEDIFF(data1, data2) | 返回 date1 到 date2 之间的天数 (date1 - date2) |
流程函数
函数 | 功能 |
---|---|
IF(value, t, f) | 如果 value 为 true, 则返回 t, 否则返回 f |
IFNULL(value1, value2) | 如果 value1 不为空, 则返回 value1, 否则返回 value2 |
CASE WHEN [val1] THEN [res1] … ELSE [default] END | 如果 val1 为 true, 返回 res1, … 否则返回 default 默认值 |
CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END | 如果 expr 的值等于 val1, 返回 res1, … 否则返回 default 默认值 |
约束
约束演示
概念: 约束作用于表中字段上的规则,用于限制存储在表中的数据。
分类:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 字段的数据不能为空 | NOT NULL |
唯一约束 | 保证字段的所有数据唯一 | UNIQUE |
主键约束 | 主键要求非空且唯一 | PRIMARY KEY |
默认约束 | 若未指定字段值,采用默认值 | DEFAULT |
检查约束 | 保证字段值满足一个条件 | CHECK |
外键约束 | 用来让两张表间建立连接 | FOREIGN KEY |
示例:
create table user (
id int primary key auto_increment comment '主键', # 主键,并且自动增长。
name varchar(10) not null unique comment '姓名', # 不为空,并且唯一
age int check(age > 0 && age <= 120) comment '年龄', # 检查约束
status char(1) default '1' comment '状态' # 默认状态
) comment '用户表';
外键约束
概念: 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
- 添加外键:
CREATE TABLE 表名 ( 字段名 数据类型, ... [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名) ); ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);
- 删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
- 删除与更新操作:
CASCADE:删掉与之相关的数据;SET NULL:将与之相关的数据值为 NULL。
ALTER TABLE 表名 ADD CONSTRINT 外键名称 FORENGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
多表查询
内连接
概念: 内连接是查询两张表交集的部分。
语法:
- 隐式内连接:
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;
- 显示内连接:
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
外连接
概念: 左/右 外连接是查询 左/右 表所有数据及两表交集的部分。
语法:
- 左外连接:
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
- 右外连接:
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;
自连接
概念: 自己连接自己进行查询。可以是内连接查询,可以是外连接查询。
语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
联合查询
概念: 对于 union 查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
语法:
SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;
子查询
概念: SQL 语句中嵌套 SELECT 语句,称为嵌套查询,又称子查询。
语法:
SELECT * FROM t1 WHERE colume = (SELECT coluun1 FROM t2);
查询结果分类及示例:
- 标量子查询。(查询结果为单个值)
select * from emp where dept_id = (selct id from dept where name = '销售部');
- 列子查询。(查询结果为一列)
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
- 行子查询。(查询结果为一行)
select * from emp where (salary, managerid) = (select salary, managerid fro memp where name = '张无忌');
- 表子查询。(查询结果为多行多列)
select * from emp where (job, salary) in (select job, salary from emp where name = '魔杖' or name = ‘宋远’);
事务
概念: 事务是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,要么全部成功,要么全部失败。
演示:
select @@autocommit; # 查看提交方式,1 为自动
set @@autocommit = 0; # 设为手动提交 0
# 方式二 start transaction
# 1. 查询张三账户余额。
select * from account where name = '张三';
# 2. 将张三账户余额减1000。
update account set money = money - 1000 where name = '张三';
# 3. 将李四账户余额加1000。
update account set money = money + 1000 where name = '李四';
# 提交事务
commit;
# 回滚事务
rollback;
事务操作
查看/设置事务提交方式:
SELECT @@autocommit;
SET @@autocommit = 0;
开启事务:
START TRANSACTION 或 BEGIN;
提交事务
COMMIT;
回滚事务:
ROLLBACK;
事务四大特性
原子性: 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性: 事务完成时,必须是所有数据都保持一致状态。
隔离性: 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性: 事务一旦提交或回滚,它对数据库中的改变是永久的。
并发事务问题
脏读: 一个事务读到另一个事务还没有提交的数据。
不可重复读: 一个事务先后读取同一条记录,
幻读: 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。
事务隔离级别
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMTTED | REPEATABLE RAED | SERIALIZABLE};