MySQL统计查询常用组件整理

字段去重distinct

语法格式:

select 
    distinct expression[,expression...] 
from 
    tables 
[where conditions];

注意事项:

  • distinct要放在所有字段的前面
  • 如果去重的字段大于一个,则会进行组合去重,只有多个字段组合起来相同时才会被去重

详见:MySQL 数据库去重

日期和时间处理

DATE_FORMAT函数

使用DATE_FORMAT函数进行时间格式化,常用格式:

  • %Y:年(4位,如:2023)
  • %m:月,数值(00-12)
  • %d:月的天,数值(00-31)

详见:MySQL DATE_FORMAT() 函数

DATE_SUB和SUBDATE函数

DATE_SUB函数从DATE或DATETIME值中减去时间值(或间隔),语法:DATE_SUB(start_date, INTERVAL expr unit)
DATE_SUB函数接受三个参数:

  • start_date:是DATE或DATETIME的起始值
  • expr:是一个字符串,用于确定从起始日期减去的间隔值
  • unit:是expr可解析的间隔单位,例如DAY,HOUR等

SUBDATE函数从日期中减去时间/日期间隔,然后返回日期,语法:SUBDATE(date, INTERVAL expr unit)
SUBDATE函数接受以下三个参数:

  • date:第一个指定的日期
  • expr:要减去的时间/日期间隔的值
  • unit:是expr可解析的间隔单位,例如DAY,HOUR等
# 求昨天的日期值:将今天的日期值减去 1 天
mysql> SELECT DATE_SUB(curdate(),INTERVAL 1 DAY);
+------------------------------------+
| DATE_SUB(curdate(),INTERVAL 1 DAY) |
+------------------------------------+
| 2023-10-28                         |
+------------------------------------+
1 row in set (0.00 sec)

# 查询上个月
mysql> select date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') as LAST_MONTH;
+------------+
| LAST_MONTH |
+------------+
| 2023-10    |
+------------+
1 row in set (0.00 sec)

详见:
MySQL date_sub()函数
mysql时间相减获取秒值

DAYOFWEEK和WEEKDAY函数

DAYOFWEEK函数返回日期的工作日索引值,即星期日为1,星期一为2,星期六为7,这些索引值对应于ODBC标准。
DAYOFWEEK函数的语法:DAYOFWEEK(date)
DAYOFWEEK函数接受1个参数,即DATE或DATETIME值。 它返回一个整数,范围从1到7,表示星期日到星期六。
WEEKDAY函数接受1个参数,即DATE或DATETIME值,它返回一个整数,范围从0到6,表示星期一到星期日。

# 查询指定日期对应的星期名称和数字
mysql> SELECT DAYNAME('2023-10-29'), DAYOFWEEK('2023-10-29');
+-----------------------+-------------------------+
| DAYNAME('2023-10-29') | DAYOFWEEK('2023-10-29') |
+-----------------------+-------------------------+
| Sunday                |                       1 |
+-----------------------+-------------------------+
1 row in set (0.00 sec)

# 查询上周一日期
mysql> select DATE_SUB(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 1 WEEK) as LAST_WEEK_MONDAY;
+------------------+
| LAST_WEEK_MONDAY |
+------------------+
| 2023-10-23       |
+------------------+
1 row in set (0.00 sec)

# 查询上周天日期
mysql> select SUBDATE(CURDATE(), WEEKDAY(CURDATE()) + 1) as LAST_WEEK_SUNDAY;
+------------------+
| LAST_WEEK_SUNDAY |
+------------------+
| 2023-10-29       |
+------------------+
1 row in set (0.00 sec)

详见:
MySQL dayofweek()函数
MySQL weekday()函数
MySQL DATE_SUB和SUBDATE函数:日期减法运算
MySQL查询本周、上周、本月、上个月份数据的sql代码

时间范围BETWEEN…AND…

当数据库字段中存储的是yyyy-MM-dd格式,即date类型:用between and查询,参数yyyy-MM-dd格式时,包含头尾,相当于x>=y && x<=z
当数据库字段中存储的是yyyy-MM-dd HH:mm:ss格式,即datetime类型:用between and查询,参数yyyy-MM-dd HH:mm:ss格式时,包含头尾,相当于:x>=y && x<=z;参数yyyy-MM-dd格式时,只包含头,相当于:x>=y && x<z

详见:MySQL之BETWEEN AND包含范围查询总结

if语句、if…else语句、case语句

if语句做为表达式使用,语法格式为:IF(expr1,expr2,expr3)。如果expr1是TRUE (expr1 <> 0 and expr1 <> NULL),则IF()的返回值为expr2; 否则返回值则为expr3。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。

if也可以用CASE WHEN来实现:

SELECT CASE 列名 
        WHEN 条件1 THEN 结果1
        WHEN 条件2 THEN 结果2
        ELSE 结果3
    END
as 别名

IF…ELSE…做为流程控制语句使用,语法格式如下:

IF search_condition THEN
	statement_list

ELSEIF search_condition THEN
	statement_list
 
ELSE
	statement_list
 
END IF;

详见:MySQL:if语句、if…else语句、case语句,使用方法解析

联合查询

mysql left join 可以写不等值吗
MySQL联合查询(多表查询)
sql中的join和inner join的区别

精度控制

MySQL中保留两位小数
MySQL数字的取整、四舍五入、保留n位小数

使用索引

MySQL中in到底走不走索引?
MySQL中NULL对索引的影响

为空判断

MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用

字符串处理

详解MySQL中CONCAT()函数的用法(链接字符串)
MySQL中group_concat函数用法总结
mysql使用instr实现字符串startWith和endWith效果


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^