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

将这张表作为 临时表
SELECT * FROM
(SELECT * from stus WHERE course = "语文" ) AS tmp1 -- 临时表 tmp1
INNER JOIN
(SELECT * from stus WHERE course = "数学" ) as tmp2
ON 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 orders
- where 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 的订单数量。
```sql
SELECT "0:00-8:00" as 时间, sum(total) from
(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
WHERE DATE_FORMAT(create_time,"%H") >= 0 and DATE_FORMAT(create_time,"%H") <8
GROUP BY DATE_FORMAT(create_time,"%H")
) as tmp1
UNION
SELECT "8:00-16:00" as 时间, sum(total) from
(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
WHERE DATE_FORMAT(create_time,"%H") >= 8 and DATE_FORMAT(create_time,"%H") < 16
GROUP BY DATE_FORMAT(create_time,"%H")
) as tmp1
UNION
SELECT "16:00-24:00" as 时间, sum(total) from
(select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
WHERE DATE_FORMAT(create_time,"%H") >= 16 and DATE_FORMAT(create_time,"%H") < 24
GROUP 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 *, case
when score<60 Then "差"
when score >=60 and score<80 then "良好"
when score >=80 and score<=100 then "优秀"
else "无效的成绩" -- 如果上面的条件都不符合,则显示 无效的成绩。
end as 评价
from stus;

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

