临时表

在做查询相关的操作时,比如一张表的内容很多。将这张表中的一部分内容筛选出来的结果 作为一张表。

临时表 语法 : 使用查询语句 查询出来的结果 起别名。
查询语文成绩大于数学成绩
image.png

  1. select * from stus where course = "语文";

image.png
将这张表作为 临时表

  1. SELECT * FROM
  2. (SELECT * from stus WHERE course = "语文" ) AS tmp1 -- 临时表 tmp1
  3. INNER JOIN
  4. (SELECT * from stus WHERE course = "数学" ) as tmp2
  5. ON tmp1.`Name` = tmp2.`Name` AND tmp1.score > tmp2.score;

时间相关

Now 当前时间

  1. SELECT NOW();

image.png

Date 当前日期

  1. SELECT DATE("2022-01-01 00:30:40");
  2. SELECT DATE(NOW()); -- 当前的日期

datediff 日期之差

按天计算

  1. SELECT DATEDIFF("2022-03-10","2022-03-09");

image.png
datediff 默认是按照日期来计算差值, 单位为 天;

  1. SELECT DATEDIFF("2022-03-10 11:41:30","2022-03-09 21:10:10")

image.png

timediff 时间之差

  1. SELECT TIMEDIFF("2022-03-10 11:41:30","2022-03-10 10:41:30")

image.png

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 位
  1. SELECT DATE_FORMAT(NOW(),'%Y %b %d')

image.png

  1. 查询 近 30天的订单信息

    1. SELECT * FROM orders
    2. -- 用当前的时间 减去 订单中的时间
    3. WHERE DATEDIFF(NOW(), create_time) <=30
  2. 查询 最近7-15天的订单信息

    1. select * from orders
    2. where datediff(now(),create_time) between 7 and 15;
  3. 统计 每个月的订单数量; ```sql — 将日期转换为 2022-3 格式 在进行分组 统计; select DATE_FORMAT(create_time,”%Y-%c”) as 月份, COUNT(id) from orders GROUP BY 月份;

  1. ![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)
  2. 4. 分别统计 0:00-8:00, 8:00--16:00, 16:00-24:00 的订单数量。
  3. ```sql
  4. SELECT "0:00-8:00" as 时间, sum(total) from
  5. (select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
  6. WHERE DATE_FORMAT(create_time,"%H") >= 0 and DATE_FORMAT(create_time,"%H") <8
  7. GROUP BY DATE_FORMAT(create_time,"%H")
  8. ) as tmp1
  9. UNION
  10. SELECT "8:00-16:00" as 时间, sum(total) from
  11. (select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
  12. WHERE DATE_FORMAT(create_time,"%H") >= 8 and DATE_FORMAT(create_time,"%H") < 16
  13. GROUP BY DATE_FORMAT(create_time,"%H")
  14. ) as tmp1
  15. UNION
  16. SELECT "16:00-24:00" as 时间, sum(total) from
  17. (select DATE_FORMAT(create_time,"%H") ,COUNT(id) as total from orders
  18. WHERE DATE_FORMAT(create_time,"%H") >= 16 and DATE_FORMAT(create_time,"%H") < 24
  19. GROUP BY DATE_FORMAT(create_time,"%H")
  20. ) as tmp1

ifnull 如果为空

image.png
表中的字段里面 如果没有值,可以使用ifnull 为该字段设置默认值。

  1. select * from jobs;
  1. -- 在查询的时候,如果字段为空,设置默认值
  2. select username, IFNULL(degree,"文盲"), IFNULL(workyear,"小白") from jobs;

image.png

case… when …then 不同条件

image.png
这里有个成绩表
当分数为 < 60 评价 差
分数为 >=60 并且 <80 评价 良好
分数为 80-100 评价 优秀


  1. select *, case
  2. when score<60 Then "差"
  3. when score >=60 and score<80 then "良好"
  4. when score >=80 and score<=100 then "优秀"
  5. else "无效的成绩" -- 如果上面的条件都不符合,则显示 无效的成绩。
  6. end as 评价
  7. from stus;

image.png

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