是否有确定的位置来查找mySQL语句的操作顺序?下面的命令是否正确?MySQL的操作顺序?
FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句
如果是这种情况,我可以使用在SELECT化酶定义的术语(SELECT名字为 “f_name” )在group by子句中?
谢谢!
是否有确定的位置来查找mySQL语句的操作顺序?下面的命令是否正确?MySQL的操作顺序?
FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句
如果是这种情况,我可以使用在SELECT化酶定义的术语(SELECT名字为 “f_name” )在group by子句中?
谢谢!
我假设你有兴趣SELECT
,根据MySQL documentation的语法如下
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
是的,你可以使用带有AS
定义的列的GROUP BY
子句。
我不太确定,但如果他真的这样做,那么查询计划完全取决于优化器。 – 2010-10-22 21:59:36
我认为这里的问题是能够选择尽可能多的记录,只要用户ID是唯一的。 – dudewad 2013-05-22 20:23:03
这实际上对我很有帮助。编写查询时,我对ORDER BY和GROUP BY命令感到困惑。谢谢。 – 2014-09-19 19:09:36
我认为Order By在选择之前(您可以对未选择的列进行排序),但Group By和Having已经死亡了。分组需要知道整个结果集,并且只能对选择列表中的非聚合列进行分组(并且必须对所有列进行分组)。一旦结果集被分组,“有”将作为一组条件应用于分组结果集。
所以,我想大多数的发动机,包括MySQL,过程如下:
您可能希望将您的列表与[用于SQL Server的这一个]进行比较(http://tsql.solidq.com/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf)。那个人有'ORDER BY'作为倒数第二步。 (在后面用'TOP' /'LIMIT')我可以看到你对未被选择的列进行排序的观点,但是对于你也可以通过'SELECT'部分中定义的列别名或者在'SELECT'列表。我想这个很好的整齐的逻辑分类在这里有一点点打破。 – 2010-10-22 22:40:39
此答案中的排序不正确。 Martin对SQL Server的参考更合理,尽管它对于MySQL可能并不严格正确。 – 2015-06-14 16:36:23
@MartinSmith和@GordonLinoff说了些什么。这个答案是不正确的。逻辑处理顺序是'FROM - > WHERE - > GROUP BY - > HAVING - > SELECT - > ORDER BY'。在MySQL中,'HAVING'可以被认为是在SELECT之后处理的(因此SELECT中定义的别名可以用在MySQL的HAVING子句中)。 – 2015-09-09 09:52:04
与SQL Server不同,您可以在MySQL中的'having'子句中使用别名。不知道这是否意味着操作的逻辑顺序是任何不同的。 – 2010-10-22 22:10:32