MySQL学习笔记
函数
字符串函数
| 函数 | 功能 |
|---|---|
| CONCAT(S1,S2,S3,...,Sn) | 字符串拼接,按顺序拼接在一起 |
| LOWER(str) | 转小写 |
| UPPER(str) | 转大写 |
| LPAD(str,n,pad) | 用pad来对str的左边进行填充,使之长度达到n |
| RPAD(str,n,pad) | 用pad来对str的右边进行填充,使之长度达到n |
| TRIM(str) | 太熟悉了,去掉首尾空格 |
| SUBSTRING(str,start,len) | 从start处开始截取,一共截取长度为n的子串 |
数值函数
| 函数 | 功能 |
|---|---|
| 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) | 获取balabala的月份 |
| DAY(date) | balabala的天 |
| DATE_ADD(date,INTERVAL exper type) | date加上一段时间间隔后的时间 |
| DATEDIFF(date1,date2) | 返回时间间隔 |
DATE_ADD函数用法
栗子:从当前时间往后推70天
DATE_ADD(NOW(),INTERVAL 70 DAY)
DATEDIFF函数用法
栗子:求2024-7-12-2025-7-12间隔天数
DATEDIFF('2025-07-12','2024-07-12') # 默认使用前者减去后者
流程函数
| 函数 | 功能 |
|---|---|
| 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,如果val2为true就返回res2,...否则返回default |
| CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END | 如果expr等于val1就返回res1,如果expr等于val2就返回res2,...否则返回default |
查询
自连接查询
假设有一个表如下
| id | name | age | manager_id(领导的id) |
|---|---|---|---|
| 1 | AAA | 18 | |
| 2 | BBB | 19 | 1 |
| 3 | CCC | 20 | 1 |
| 4 | DDD | 21 | 2 |
| 5 | EEE | 22 | 2 |
| 6 | FFF | 23 | 3 |
| 7 | GGG | 24 | 3 |
栗子:查询员工及其领导的名字
使用自连接,先对emp表给两个别名分别为a,b,a相当于员工表,b相当于领导表
SELECT a.name,b.name from emp a,emp b WHERE a.manager_id=b.id;
联合查询union
# union all 不会排除重复数据
SELECT * from table1
union all
SELECT * from table2;
# union 会排除重复数据
SELECT * from table1
union
SELECT * from table2;
事务
简单操作
开启事务
START TRANSACTION
提交事务/回滚事务
COMMIT / ROLLBACK
事务的四大特性
ACID
- 原子性
- 一致性
- 隔离性
- 持久性
并发事务问题
| 问题 | 描述 |
|---|---|
| 脏读 | 一个事务读取到另一个事务还没提交的数据 |
| 不可重复读 | 一个事务先后读到同一记录,但两次读取的不同(两次读取之间数据被其他事务修改提交了) |
| 幻读 | 一个事务按条件查询数据时,没有对应的数据行,但是插入数据时,又发现这行数据已经存在,好像出现了“幻影” |
事务隔离级别
隔离级别与问题的关系(脉涩口)
√表示会出现(无法解决的问题),x表示可以解决的问题

查看隔离级别
SELECT @@TRANSACTION_ISOLATION
设置隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
-- 设置[仅当前会话|全局] 隔离级别[读未提交|读已提交|可重复度|串行化]