select 【distinct】
from
join on
where
group by 分组
having
order by 排序
limit
条件查询 ADN、OR、NOT、LIKE
操作 | 写法 | 作用 |
---|---|---|
<条件1> AND <条件2> | WHERE score >80 AND name =‘M’ | 满足条件1 且 满足条件2 |
<条件1>OR<条件2> | WHERE score >80 OR name=‘M’ | 满足条件1 或 满足条件2 |
NOT<条件1> | WHERE NOT name = ‘M’ | 名字 不能 是M |
LIKE ‘%A_’ | 模糊查询 | % 多字符 _一个字符 |
排序 ORDER BY
操作 | 写法 | 说明 |
---|---|---|
ORDER BY <字段> | ORDER BY name | |
ORDER BY name DESC | 倒序 | |
ORDER BY name ASC | 顺序 |
select * from user
WHERE sex
ORDER BY name ASC age DESC
# 先按名字 顺序排 同名 倒序年纪排
分页 LIMIT
LIMIT OFFSET 实现分页
select * from user
LIMIT 3 OFFSET 0;
# 每页 3条 数据 获取 第1页的数据
select * from user
LIMIT 3 OFFSET 3;
# 获取 第 2页。每页是3条 数据 第二页 是从 【索引】 3 开始的
LIMIT ,
select * from user
LIMIT 3,3;
# 从索引 3 开始 每页显示 3条数据
连接查询 JOIN
select … from <表1> inner join <表2> on <条件>
操作 | 写法 | 说明 |
---|---|---|
INNER JOIN <表2> NO <条件> | INNER JOIN user ON u.id = id | id 连接 |
INNER JOIN 内连接 | 两张表都存在的记录 | |
OUTER JOIN 外连接 | 默认 选出左表存在的记录 | |
RIGHT JOIN <表2> NO<条件> | 返回右表都存在的行 结果只在右边存在 结果null填充 | |
LEFT JOIN <表2> NO<条件> | 返回左表都存在的行 | |
FULL JOIN <表2> NO<条件> | 两张表的记录全部选择出来 |
union 并集
把多个结果集 合并成一张新表
(sql 1) union all (sql 2)
增删改查
添加 INSERT
insert into <表名>(字段1,字段2,字段4) values(值1,值2,值3)
不写字段默认按照表中顺序来赋值
修改 UPDATE
update <表名> set 字段1=值 字段2=值…where…
删除 DELETE
delete from<表名> where…
取代 REPLACE INTO
replace into <表名> values()
取代 符合条件的数据
- 根据 主键 或唯一索引 判断
- 先删除此行,在插入新数据,或者 直接插入
流程控制
IF(判断,真执行,假执行)
IFNULL(值,代替null值)
CASE WHEN 条件1 THEN 结果 WHEN 条件2 THEN 结果 [ELSE 默认结果] END
CASE 条件值 a (switch 一样) WHEN 1 THEN 结果 WHEN 2 THEN 结果 [ELSE 结果] END
函数
聚合函数
函数 | 说明 |
---|---|
COUNT() | 计数 |
SUM() | 求和,数值 |
AVG() | 平均,数值 |
MAX() | 最大, |
MIN() | 最小 |
sum(if(条件,字段名或固定值,0))
多条件判断
sum(if(条件1 AND 条件2 AND 条件3,字段名或固定值,0))
count(if(条件,true,null))
if null(表达式, null 的代替值)
日期函数
函数 | 作用 |
---|---|
DATE(date|datetime) | 提取日期的 date或 datetime部分 |
DATE_ADD(date,INTERVAL exp nuit) | 添加时间 |
DATA_SUB(date,INTERVAL exp unit) | 减少时间 |
DATEDIFF(date1,date2) | 日期之间的差值 date1 - date 2 |
DATE_FORMAT(date,format) | format格式化 date |
Last_day(date) | 获取当月最后一天日期 |
日期 本身可以直接 比较
例如 : 2021年9月 之前的数据
# datetime = '2020-8-1 00:00:00' where datetime < '2021-9-1' and datetime is null
例子
获取 2021 年 8 月 1 日
year(date) = 2021 and month (date) = 8 and
day(date) = 1
last_day 获取当月最后一天
#date = '2022-02-02 12:00:00'
last_day(date)
# 2022-02-28
时间函数
函数 | 作用 |
---|---|
NOW() SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() | 返回当前时间 |
CURTIME() | 返回当前时间 |
Timestampdiff(nuit , begin ,end) | 根据单位返回时间差,对于传入的begin 和 end 不需要相同的数据结构,可以存在一个date 一个 datetime |
# date1 和date2 分钟相差多少
Timestampdiff( minut , start_time , submit _time) < 5
添加 减少 时间 ADD SUB
参数类型 | 参数类型 |
---|---|
YEAR 年 | YEAR_MONTH |
MONTH 月 | DAY_HOUR |
DAY 日 | DAY_MINUTE |
HOUR 小时 | DAY_SECOND |
MINUTE 分钟 | HOUR_MINUTE |
SECOND 秒 | HOUR_SECOND |
MINUTE_SECOND |
select date_add('2022-2-22 12:00:00',interval'1:2' minute_second)
# 结果 2022-2-22 12:01:02
select date_add(now() , interval 1 year)
格式化 DATE_FORAMT
字符 | 作用 |
---|---|
%Y | 年 4位 |
%y | 年 2位 |
%M | 月 英文 |
%m | 月 01-12 |
%D | 日 英文 1st,2nd |
%d | 日 01-31 |
%H | 时 2位24小时 |
%h | 时 12小时 |
%i | 分 00-59 |
%S /% s | 秒 00-59 |
%p | PM。AM |
%r | HH:mm:ss PM 格式 |
%W | 周,周名 |
%w | 周,0-6 :周天 0 |
%j | 当前天数 001-366 |
select date_format(date,'%Y/%m/%d')
# 2022/2/22
算数
函数 | 作用 |
---|---|
ABS | 取绝对值 |
MOD | 取余数,接收两个参数,参数1数值,参数2 为除数 |
ROUND | 四舍五入,接收2个参数,参数1数值,参数2是小数点位数 |
字符串函数
函数 | 用法 |
---|---|
CONCAT(s1,s2…) | 连接 字符串组合成一个 新的字符串 |
CONCAT(s,s1,s1…) | s分隔符 拼接 |
LEFT(s,n) | 返回 s串 左边 n个字符 |
RIGHT(s,n) | 返回 s串 右边 n个字符 |
substring_index(str , delim ,conut) | 字符串截取 |
### substring_index(str,delim,conut)
- str : 需要处理的字符串
- delim : 分隔符
- count : 计数
# str = www.lf.cn
substring_index(str,'.',1)
# 结果 : www
substring_index(str,'.',2)
# 结果 : www.lf
substring_index(str,'.',-2)
# 结果: lf.cn
substring_index(substring(str,'.',-2),1)
# 结果: lf
其他函数
using() 两张表的的链接条件 类似on
select *
from user u left join admin a
on u.id = a.id
select *
from user left join admin
on(id)
事务
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK;