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

相关推荐
Jim60010 小时前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL16 小时前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
倔强的石头_18 小时前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_4 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横4 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二4 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab4 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐4 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence5 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle