临时表
在做查询相关的操作时,比如一张表的内容很多。将这张表中的一部分内容筛选出来的结果 作为一张表。
临时表 语法 : 使用查询语句 查询出来的结果 起别名。
查询语文成绩大于数学成绩
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 月份;
![image.png](https://cdn.nlark.com/yuque/0/2022/png/87080/1646891661499-bb091795-661b-4136-9b8c-5a4ff6a55c65.png#clientId=u282231d1-9044-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=118&id=u95e42e70&margin=%5Bobject%20Object%5D&name=image.png&originHeight=235&originWidth=253&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6809&status=done&style=none&taskId=ua52e363f-9500-418f-8bb5-0411e8f27cd&title=&width=126.5)
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