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

相关推荐
刘一哥GIS2 分钟前
Windows环境搭建:PostGreSQL+PostGIS安装教程
数据库·python·arcgis·postgresql·postgis
云和数据.ChenGuang21 分钟前
uri: mongodb://jack:123456@localhost://27017 数据库访问其他的写法
数据库·mongodb·oracle
ManageEngineITSM1 小时前
IT 服务自动化的时代:让效率与体验共进
运维·数据库·人工智能·自动化·itsm·工单系统
SelectDB1 小时前
Apache Doris 内部数据裁剪与过滤机制的实现原理
数据库·数据分析·github
Derrick__11 小时前
Python访问数据库——使用SQLite
数据库·python·sqlite
Databend1 小时前
Databend 九月月报:自增列 AUTOINCREMENT 与行级安全
数据库
-雷阵雨-2 小时前
MySQL——数据库入门指南
数据库·mysql
玄妙尽在颠倒间2 小时前
SQL中的四大核心语言:DQL、DML、DDL、DCL
大数据·数据库
就叫飞六吧2 小时前
DataX适合全量同步和简单的增量场景
mysql
苏打水com3 小时前
企业级数据库实操手册:从架构部署到安全运维的落地指南
数据库·后端