临时表
在做查询相关的操作时,比如一张表的内容很多。将这张表中的一部分内容筛选出来的结果 作为一张表。
临时表 语法 : 使用查询语句 查询出来的结果 起别名。
查询语文成绩大于数学成绩
select * from stus where course = "语文";

将这张表作为 临时表
SELECT * FROM(SELECT * from stus WHERE course = "语文" ) AS tmp1 -- 临时表 tmp1INNER JOIN(SELECT * from stus WHERE course = "数学" ) as tmp2ON tmp1.`Name` = tmp2.`Name` AND tmp1.score > tmp2.score;
时间相关
Now 当前时间
SELECT NOW();

Date 当前日期
SELECT DATE("2022-01-01 00:30:40");SELECT DATE(NOW()); -- 当前的日期
datediff 日期之差
按天计算
SELECT DATEDIFF("2022-03-10","2022-03-09");

datediff 默认是按照日期来计算差值, 单位为 天;
SELECT DATEDIFF("2022-03-10 11:41:30","2022-03-09 21:10:10")
timediff 时间之差
SELECT TIMEDIFF("2022-03-10 11:41:30","2022-03-10 10:41:30")
Date_format 格式化
| 格式 | 描述 |
|---|---|
| %a | 缩写星期名 |
| %b | 缩写月名 |
| %c | 月,数值 |
| %D | 带有英文前缀的月中的天 |
| %d | 月的天,数值(00-31) |
| %e | 月的天,数值(0-31) |
| %f | 微秒 |
| %H | 小时(00-23) |
| %h | 小时(01-12) |
| %I | 小时(01-12) |
| %i | 分钟,数值(00-59) |
| %j | 年的天(001-366) |
| %k | 小时(0-23) |
| %l | 小时(1-12) |
| %M | 月名 |
| %m | 月,数值(00-12) |
| %p | AM 或 PM |
| %r | 时间,12-小时(hh:mm:ss AM 或 PM) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %T | 时间, 24-小时(hh:mm:ss) |
| %U | 周(00-53)星期日是一周的第一天 |
| %u | 周(00-53)星期一是一周的第一天 |
| %V | 周(01-53)星期日是一周的第一天,与 %X 使用 |
| %v | 周(01-53)星期一是一周的第一天,与 %x 使用 |
| %W | 星期名 |
| %w | 周的天(0=星期日, 6=星期六) |
| %X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
| %x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
| %Y | 年,4 位 |
| %y | 年,2 位 |
SELECT DATE_FORMAT(NOW(),'%Y %b %d')

查询 近 30天的订单信息
SELECT * FROM orders-- 用当前的时间 减去 订单中的时间WHERE DATEDIFF(NOW(), create_time) <=30
查询 最近7-15天的订单信息
select * from orderswhere datediff(now(),create_time) between 7 and 15;
统计 每个月的订单数量; ```sql — 将日期转换为 2022-3 格式 在进行分组 统计; select DATE_FORMAT(create_time,”%Y-%c”) as 月份, COUNT(id) from orders GROUP BY 月份;
4. 分别统计 0:00-8:00, 8:00--16:00, 16:00-24:00 的订单数量。```sqlSELECT "0:00-8:00" as 时间, sum(total) from(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from ordersWHERE DATE_FORMAT(create_time,"%H") >= 0 and DATE_FORMAT(create_time,"%H") <8GROUP BY DATE_FORMAT(create_time,"%H")) as tmp1UNIONSELECT "8:00-16:00" as 时间, sum(total) from(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from ordersWHERE DATE_FORMAT(create_time,"%H") >= 8 and DATE_FORMAT(create_time,"%H") < 16GROUP BY DATE_FORMAT(create_time,"%H")) as tmp1UNIONSELECT "16:00-24:00" as 时间, sum(total) from(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from ordersWHERE DATE_FORMAT(create_time,"%H") >= 16 and DATE_FORMAT(create_time,"%H") < 24GROUP BY DATE_FORMAT(create_time,"%H")) as tmp1
ifnull 如果为空

表中的字段里面 如果没有值,可以使用ifnull 为该字段设置默认值。
select * from jobs;
-- 在查询的时候,如果字段为空,设置默认值select username, IFNULL(degree,"文盲"), IFNULL(workyear,"小白") from jobs;

case… when …then 不同条件

这里有个成绩表
当分数为 < 60 评价 差
分数为 >=60 并且 <80 评价 良好
分数为 80-100 评价 优秀
select *, casewhen score<60 Then "差"when score >=60 and score<80 then "良好"when score >=80 and score<=100 then "优秀"else "无效的成绩" -- 如果上面的条件都不符合,则显示 无效的成绩。end as 评价from stus;

更多其他函数内容
MySQL必知必会.pdf
