mysql中从2018-12-18提取出2018-12,如何实现
要在MySQL中从日期2018-12-18
提取出2018-12
,可以使用DATE_FORMAT()
函数或者EXTRACT()
函数。这两种方法都可以达到目的,下面是具体的实现方式:
使用 DATE_FORMAT()
DATE_FORMAT()
函数允许指定日期格式化字符串,以从日期值中提取特定的部分。
示例代码:
SELECT DATE_FORMAT('2018-12-18', '%Y-%m') AS extracted_date;
这里,%Y
代表四位数的年份,%m
代表两位数的月份。因此,'%Y-%m'
格式化字符串会返回形如2018-12
的格式。
使用 EXTRACT()
EXTRACT()
函数可以从日期或时间表达式中提取指定的部分。
示例代码:
SELECT EXTRACT(YEAR_MONTH FROM '2018-12-18') AS extracted_date;
这里,YEAR_MONTH
是从日期中提取年和月的标识符。EXTRACT(YEAR_MONTH FROM '2018-12-18')
会返回一个形如201812
的整数值,如果你需要的是2018-12
这样的格式,可以在外面加上CONCAT()
函数:
SELECT CONCAT(EXTRACT(YEAR_MONTH FROM '2018-12-18'), '-') AS extracted_date;
或者,如果需要更完整的格式,可以使用DATE_FORMAT()
来格式化EXTRACT()
的结果:
SELECT DATE_FORMAT(EXTRACT(YEAR_MONTH FROM '2018-12-18'), '%Y-%m') AS extracted_date;
总结
- DATE_FORMAT(): 更通用的日期格式化函数,可以灵活地控制输出格式。
- EXTRACT(): 专门用于从日期中提取特定的部分,返回的是数字或数字的组合。
根据需求选择合适的函数。如果只需要简单地提取年份和月份,DATE_FORMAT()
可能更为直观和方便。
MySQL中 使用 ORDER BY 列别名,没有报错,这是为什么?
按照执行顺序,GROUP BY
在SELECT
之前执行,可是GROUP BY
列别名 执行了,没有报不认识 列别名 的错误,这是为什么?
举一个具体的例子,
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
子句中定义的别名,并使用它们来进行分组。
查询分析
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
别名代表的内容,并据此进行分组操作。
子查询的注意点
子查询注意事项:
- 子查询要包含在括号内
- 将子查询放在比较条件的右侧
- 单行操作符对应单行子查询,多行操作符对应多行子查询
结论:在SELECCT中,除了 GROUP BY 和 LIMIT之外,其他位置都可以声明子查询!
SELECT ...,....,...(存在聚合函数)
FROM ...,...,.... (LEFT / RIGHT)JOIN ... ON 多表的连接条件
WHERE 不包含聚合函数的过滤条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含聚合函数的过滤条件
ORDER BY ... (ASC/DESC)
LIMIT ...,...
子查询的编写技巧(或步骤):① 从里往外写 ② 从外往里写