先解釋單詞的翻譯問題:
在絕大多數書本,教材,網路教程等中:
join都被稱為(翻譯)為連線查詢;
union被稱為(翻譯)為聯合查詢;
但:
在mysql的中文官方手冊中,
join被翻譯為“聯合查詢”
union沒有翻譯。
工具/原料
Mysql聯合(union)查詢
方法/步驟
基本概念
將兩個“欄位數量相同”的查詢結果資料,以“上下堆疊”的方式合併為一個結果資料的查詢語句;
比如假設:
select f1, f2, f3 from tab1 的結果為:
聯合查詢的基本語法形式:
select 語句1
union 【distinct all】
select 語句2
union 【distinct all】
select 語句3
。。。。。
;
可見:
可以將若干個查詢語句,聯合為一個查詢結果,只要他們的欄位數量相同——通常也最好對應欄位餓型別也相同,否則內部會進行一定的轉換,結果可能有問題。
說明:
1,多個聯合查詢語句的欄位數量必須一樣,型別最好一致;
2,union 後面可以加distinct或all,來設定是否需要消除重複行。預設可以不寫,就是distinct(消除)
3,每個select語句中的order by 和limit子句,都只對其本身單獨有效,而對整體結果無效。
但注意:
3.1 通常都必須將每個select語句的order 子句和limit子句括起來,類似這樣:
(select .... order by ... limit ... )
union
(select .... order by ... limit ... )
;
則,此時,其中每個內部的order 和limit其實是失去意義了(即無效)
3.2, 如果不括起來,則前面的語句會報錯(語法錯誤),而最後一個order 或limit,是對整體的排序和限定,而不是對最後一個。
select .... order by ... limit ...
union
select .... order by ... limit ...
; #此語句出錯
select ....
union
select .... order by ... limit ...
; #此語句ok,只是order 和limit其實是針對“總體結果”
4,多個select語句聯合查詢後的結果欄位,都是以第一個select語句的欄位為準。如果其加了別名,則結果也是以別名為準。——包括在order 子句中,也應以別名為準。
舉例1:
select pro_id, protype_id, price from product where protype_id = 1
union
select pro_id, protype_id, price from product where protype_id = 2 order by price
舉例2:
(select pro_id, protype_id, price from product where protype_id = 1 order by price)
union
(select pro_id, protype_id, price from product where protype_id = 2 order by price)
舉例3:使用union實現“full join”(全連線)的效果:
select * from join1 left join join2 on join1.f1 = join2.c1
union
select * from join1 right join join2 on join1.f1 = join2.c1;