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别名代表的内容,并据此进行分组操作。

相关推荐
@大嘴巴子26 分钟前
MySQL知识回顾总结----数据库基础
数据库·mysql
lubiii_26 分钟前
SQL手工测试(MySQL数据库)
数据库·mysql·web安全·网络安全
凌辰揽月32 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
想你依然心痛37 分钟前
数据库入门:从原理到应用
数据库
20242817李臻2 小时前
20242817李臻-安全文件传输系统-项目验收
数据库·安全
行思理2 小时前
MongoDB慢查询临时开启方法讲解
数据库·mongodb
bbsh20993 小时前
WebFuture 升级提示“不能同时包含聚集KEY和大字段””的处理办法
数据库·sql·mysql·webfuture
霖檬ing3 小时前
Python——MySQL远程控制
开发语言·python·mysql
Zfox_7 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
陈丹阳(滁州学院)9 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle