在Mysql的參考手冊(cè)中,并沒(méi)有對(duì)union和order by的優(yōu)先級(jí)進(jìn)行說(shuō)明,它建議的方法是,對(duì)SQL語(yǔ)句加上(),這樣能使SQL的語(yǔ)義更清晰.
例如,需要對(duì)union后的結(jié)果進(jìn)行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)
- //開(kāi)源代碼Vevb.com
- ORDER BY a LIMIT 10;
如果,需要對(duì)單個(gè)SQL語(yǔ)句進(jìn)行order by,則應(yīng)把order by子句放入圓括號(hào)中,如下:
- (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);
另外注意:圓括號(hào)中用于單個(gè)SQL語(yǔ)句的ORDER BY只有當(dāng)與LIMIT結(jié)合后,才起作用,否則,ORDER BY被優(yōu)化去除,我在innodb引擎的2個(gè)表上測(cè)試了沒(méi)有加(),進(jìn)行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;
發(fā)現(xiàn),它默認(rèn)的結(jié)果也是先進(jìn)行union,然后再order by,和第一種情況執(zhí)行結(jié)果相同,不過(guò),為了邏輯清晰,最好還是加上對(duì)應(yīng)的()比較好.
另外:Mysql中union可以有union,union distinct,union all這3中形式.
union和union distinct會(huì)對(duì)union后的結(jié)果進(jìn)行排重,保證所有返回的行都是唯一的
union all則會(huì)返回所有SELECT語(yǔ)句中得到所有匹配的行.
新聞熱點(diǎn)
疑難解答
圖片精選