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

相关推荐
i***2795几秒前
使用 Canal 实时从 MySql 向其它库同步数据
数据库·mysql
e***75393 分钟前
SQL Server 数据库迁移到 MySQL 的完整指南
android·数据库·mysql
b***46245 分钟前
【mysql】锁机制 - 2.行锁间隙锁临键锁
数据库·mysql
yeshihouhou6 分钟前
redis数据类型 stream消息队列
数据库·redis·缓存
bug管理者15 分钟前
接口测试面试题汇总(含答案)
软件测试·数据库·面试
g***267928 分钟前
PostgreSQL 查看数据库及表中数据占用空间大小
数据库·postgresql·oracle
小龙报30 分钟前
VS2022调试技巧 + 实战案例
android·服务器·c语言·数据库·c++·windows·visual studio
i***486130 分钟前
【MySQL】MySQL库的操作
android·数据库·mysql
翔云12345631 分钟前
MySQL offline_mode:安全隔离流量,高效完成数据库维护
数据库·mysql·安全
篮球只打两年半32 分钟前
普罗米修斯监控sql(CentOS7)
数据库·sql