MySQL零散拾遗(七)--- 突发奇想的一些疑虑

mysql中从2018-12-18提取出2018-12,如何实现

要在MySQL中从日期2018-12-18提取出2018-12,可以使用DATE_FORMAT()函数或者EXTRACT()函数。这两种方法都可以达到目的,下面是具体的实现方式:

使用 DATE_FORMAT()

DATE_FORMAT()函数允许指定日期格式化字符串,以从日期值中提取特定的部分。

示例代码:
sql 复制代码
SELECT DATE_FORMAT('2018-12-18', '%Y-%m') AS extracted_date;

这里,%Y代表四位数的年份,%m代表两位数的月份。因此,'%Y-%m'格式化字符串会返回形如2018-12的格式。

使用 EXTRACT()

EXTRACT()函数可以从日期或时间表达式中提取指定的部分。

示例代码:
sql 复制代码
SELECT EXTRACT(YEAR_MONTH FROM '2018-12-18') AS extracted_date;

这里,YEAR_MONTH是从日期中提取年和月的标识符。EXTRACT(YEAR_MONTH FROM '2018-12-18')会返回一个形如201812的整数值,如果你需要的是2018-12这样的格式,可以在外面加上CONCAT()函数:

sql 复制代码
SELECT CONCAT(EXTRACT(YEAR_MONTH FROM '2018-12-18'), '-') AS extracted_date;

或者,如果需要更完整的格式,可以使用DATE_FORMAT()来格式化EXTRACT()的结果:

sql 复制代码
SELECT DATE_FORMAT(EXTRACT(YEAR_MONTH FROM '2018-12-18'), '%Y-%m') AS extracted_date;

总结

  • DATE_FORMAT(): 更通用的日期格式化函数,可以灵活地控制输出格式。
  • EXTRACT(): 专门用于从日期中提取特定的部分,返回的是数字或数字的组合。

根据需求选择合适的函数。如果只需要简单地提取年份和月份,DATE_FORMAT()可能更为直观和方便。

MySQL中 使用 ORDER BY 列别名,没有报错,这是为什么?

按照执行顺序,GROUP BYSELECT之前执行,可是GROUP BY列别名 执行了,没有报不认识 列别名 的错误,这是为什么?

举一个具体的例子,

sql 复制代码
SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month,
	   country,
	   COUNT(*) AS trans_count
FROM Transactions
GROUP BY month, country

在MySQL中,GROUP BY子句确实是在SELECT子句之前执行的,但是在执行GROUP BY时,MySQL会首先解析GROUP BY子句中的列或表达式,以确定如何对数据进行分组。在这个过程中,如果GROUP BY子句中引用了别名或表达式,MySQL会根据上下文理解这些别名或表达式所代表的内容。

在您的查询中,GROUP BY子句中的month实际上是DATE_FORMAT(trans_date, '%Y-%m')表达式的别名。这是因为GROUP BY子句能够识别SELECT子句中定义的别名,并使用它们来进行分组。

查询分析

sql 复制代码
SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month,
       country,
       COUNT(*) AS trans_count
FROM Transactions
GROUP BY month, country;
  • SELECT子句中定义了一个别名month,它是通过DATE_FORMAT(trans_date, '%Y-%m')得到的。
  • GROUP BY子句中使用了month别名和country列来进行分组。

在执行过程中,MySQL会识别GROUP BY子句中的month别名,并将其与SELECT子句中的DATE_FORMAT(trans_date, '%Y-%m') AS month相对应。因此,GROUP BY子句实际上是对DATE_FORMAT(trans_date, '%Y-%m')进行分组,而不是直接对名为month的列进行分组。

MySQL 对别名的支持

MySQL允许在GROUP BY子句中使用SELECT子句中定义的别名。这与其他一些数据库系统有所不同,后者可能要求在GROUP BY子句中使用实际的列名,而不是别名。

总结

在查询中,GROUP BY month, country实际上是对DATE_FORMAT(trans_date, '%Y-%m')country进行分组,因此不会出现不认识month的错误。这是因为MySQL能够理解month别名代表的内容,并据此进行分组操作。

相关推荐
Hello.Reader2 小时前
RedisJSON 路径语法深度解析与实战
数据库·redis·缓存
TDengine (老段)2 小时前
TDengine 使用最佳实践(2)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
设计师小聂!5 小时前
Linux系统中部署Redis详解
linux·运维·数据库·redis
kfepiza5 小时前
Debian-10编译安装Mysql-5.7.44 笔记250706
linux·数据库·笔记·mysql·debian·bash
Touper.5 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
不剪发的Tony老师5 小时前
phpMyAdmin:一款经典的MySQL在线管理工具又回来了
数据库·mysql·phpmyadmin
极限实验室5 小时前
TDBC 2025 可信数据库发展大会,极限科技邀您来赴约!
数据库
lixia0417mul27 小时前
使用Starrocks替换Clickhouse的理由
数据库
张璐月8 小时前
mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
数据库·mysql·性能优化
沐尘而生8 小时前
【AI智能体】智能音视频-搭建可视化智能体
数据库·人工智能·ai作画·音视频·娱乐