2010-10-22 82 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