在Mysql的參考手冊中,並沒有對union和order by的優先級進行說明
它建議的方法是,對SQL語句加上(),這樣能使SQL的語義更清晰
例如,需要對union後的結果進行order by,則:
(SELECT a FROM tbl_name WHERE a=10 AND B=1)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
如果,需要對單個SQL語句進行order by,則應把order by子句放入圓括號中,如下:
(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
另外注意:圓括號中用於單個SQL語句的ORDER BY只有當與LIMIT結合後,才起作用。否則,ORDER BY被優化去除。
我在innodb引擎的2個表上測試了沒有加(),進行union和order by的操作,如下:
SELECT a FROM tbl_name WHERE a=10 AND B=1
UNION
SELECT a FROM tbl_name WHERE a=11 AND B=2
ORDER BY a LIMIT 10;
發現,它默認的結果也是先進行union,然後再order by,和第一種情況執行結果相同
不過,為了邏輯清晰,最好還是加上對應的()比較好
另外:Mysql中union可以有union,union distinct,union all這3中形式
union和union distinct會對union後的結果進行排重,保證所有返回的行都是唯一的
union all則會返回所有SELECT語句中得到所有匹配的行