在Mysql的参考手册中,并没有对union和order by的优先级进行说明


它建议的方法是,对SQL语句加上(),这样能使SQL的语义更清晰


例如,需要对union后的结果进行order by,则:



折叠复制代码




  1. (SELECT a FROM tbl_name WHERE a=10 AND B=1)  

  2. UNION  

  3. (SELECT a FROM tbl_name WHERE a=11 AND B=2)  

  4. ORDER BY a LIMIT 10;  






如果,需要对单个SQL语句进行order by,则应把order by子句放入圆括号中,如下:



折叠复制代码




  1. (SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)  

  2. UNION  

  3. (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的操作,如下:



折叠复制代码




  1. SELECT a FROM tbl_name WHERE a=10 AND B=1  

  2. UNION  

  3. SELECT a FROM tbl_name WHERE a=11 AND B=2  

  4. ORDER BY a LIMIT 10;  






发现,它默认的结果也是先进行union,然后再order by,和第一种情况执行结果相同


不过,为了逻辑清晰,最好还是加上对应的()比较好


另外:Mysql中union可以有union,union distinct,union all这3中形式


union和union distinct会对union后的结果进行排重,保证所有返回的行都是唯一的


union all则会返回所有SELECT语句中得到所有匹配的行