2010-10-22 58 views
3

是否有确定的位置来查找mySQL语句的操作顺序?下面的命令是否正确?MySQL的操作顺序?

FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句

如果是这种情况,我可以使用在SELECT化酶定义的术语(SELECT名字为 “f_name” )在group by子句中?

谢谢!

+1

与SQL Server不同,您可以在MySQL中的'having'子句中使用别名。不知道这是否意味着操作的逻辑顺序是任何不同的。 – 2010-10-22 22:10:32

回答

2

我假设你有兴趣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子句。

+1

我不太确定,但如果他真的这样做,那么查询计划完全取决于优化器。 – 2010-10-22 21:59:36

+0

我认为这里的问题是能够选择尽可能多的记录,只要用户ID是唯一的。 – dudewad 2013-05-22 20:23:03

+0

这实际上对我很有帮助。编写查询时,我对ORDER BY和GROUP BY命令感到困惑。谢谢。 – 2014-09-19 19:09:36

0

我认为Order By在选择之前(您可以对未选择的列进行排序),但Group By和Having已经死亡了。分组需要知道整个结果集,并且只能对选择列表中的非聚合列进行分组(并且必须对所有列进行分组)。一旦结果集被分组,“有”将作为一组条件应用于分组结果集。

所以,我想大多数的发动机,包括MySQL,过程如下:

  • 定义域源(FROM子句中包括联接)
  • 过滤器(WHERE)
  • 排序(ORDER BY)
  • 再次
  • 项目(SELECT)
  • 集团(GROUP BY)
  • 过滤器(有)
+1

您可能希望将您的列表与[用于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

+1

此答案中的排序不正确。 Martin对SQL Server的参考更合理,尽管它对于MySQL可能并不严格正确。 – 2015-06-14 16:36:23

+2

@MartinSmith和@GordonLinoff说了些什么。这个答案是不正确的。逻辑处理顺序是'FROM - > WHERE - > GROUP BY - > HAVING - > SELECT - > ORDER BY'。在MySQL中,'HAVING'可以被认为是在SELECT之后处理的(因此SELECT中定义的别名可以用在MySQL的HAVING子句中)。 – 2015-09-09 09:52:04