1. 程式人生 > >mysql union, union all合併兩個結果集

mysql union, union all合併兩個結果集

前言:

專案中一個功能需要從兩個表中查詢並且分頁。一開始沒想到這樣聯合查詢,跟著別人的思路在苦搞分頁,搞了一個多鍾都還沒搞定,鬱悶死我。同事提醒聯合查詢,如夢初醒。汗顏。。。。

在資料庫中,UNION和UNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使用和效率上來說都有所不同。

MySQL中的UNION

UNION在進行錶鏈接後會篩選掉重複的記錄,所以在錶鏈接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表UNION。如:

select * from gc_dfys union select * from ls_jg_dfys

這個SQL在執行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,如果表資料量大的話可能會導致用磁碟進行排序。

MySQL中的UNION ALL

而UNION ALL只是簡單的將兩個結果合併後就返回。這樣,如果返回的兩個結果集中有重複的資料,那麼返回的結果集就會包含重複的資料了。

從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認合併的兩個結果集中不包含重複的資料的話,那麼就使用UNION ALL,如下:

select * from gc_dfys union all select * from ls_jg_dfys


使用Union,則所有返回的行都是唯一的,如同您已經對整個結果集合使用了DISTINCT
使用Union all,則不會排重,返回所有的行
如果您想使用ORDER BY或LIMIT子句來對全部UNION結果進行分類或限制,則應對單個地SELECT語句加圓括號,並把ORDER BY或LIMIT放到最後一個的後面:

(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;


麻煩一點也可以這麼幹:
select userid from (
select userid from testa union all select userid from testb) as t 
order by userid limit 0,1;


如果你還想group by,而且還有條件,那麼:
select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;


注意:在union的括號後面必須有個別名,否則會報錯
當然了,如果當union的幾個表的資料量很大時,建議還是採用先匯出文字,然後用指令碼來執行
因為純粹用sql,效率會比較低,而且它會寫臨時檔案,如果你的磁碟空間不夠大,就有可能會出錯
Error writing file '/tmp/MYLsivgK' (Errcode: 28)

相關推薦

mysql union, union all合併結果

前言: 專案中一個功能需要從兩個表中查詢並且分頁。一開始沒想到這樣聯合查詢,跟著別人的思路在苦搞分頁,搞了一個多鍾都還沒搞定,鬱悶死我。同事提醒聯合查詢,如夢初醒。汗顏。。。。 在資料庫中,UNION和UNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使

解決UNION ALL合並結果後排序的問題

desc .so spa esc one rtb post 默認值 color 日常開發中,如果實用UNION ALL合並兩個已經排好序的結果集的時候,需求是第二個結果集數據排在第一個結果集數據下面,單純的實用order by是無效的,因為order by的優先級比UNIO

UNION合併結果

1)語法形式  select_statement UNION[ALL]select_statement 2)例子 select 顧客編號 as 編號,顧客姓名 as姓名,所在城市,郵編 from 顧客表 UNION SELEC 顧客編號,顧客名稱,家庭住址,郵編 FROM 僱

結果 union

使用 後來 兩個 當前時間 rec 查詢 union和 計劃 判斷 之前物流發布計劃的展示是按照失效時間降序排列的.但是後來我們需要讓沒有過期的發布計劃升序排列,過期了的發布計劃降序排列.這種要求如果要在一個查詢裏實現的話我暫時還沒有思路,所以我使用union拼接兩個查詢結

mysql合併

背景描述: 表A 欄位:id,  deal_time          deal_amount       deal_type          

MySql 查詢同一欄位多結果合併到一行顯示 GROUP_CONCAT

先直接給出程式碼: SELECT GROUP_CONCAT(tag) as tags FROM table_tag tt WHERE tt.id in ('1','2') 我們實現合併一個欄位的多個結果用到了mysql 函式 GROUP_CONCAT,

Java方法遍歷一次數組返回結果(最大值與最小值)

遍歷 get urn 個數 gets IV 限定 null int 使用內部類來存儲要返回的結果即可實現返回多個參數 使用泛型並限定類型必須實現Comparable接口,實現重用 使用T...a實現傳入不定量個數的數組 public class ArrayAlg{

【資料結構】【合併有序連結串列】

#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn = 1e5 + 5; struct node { int num; struct node *next; }; s

leetcode88 合併有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設&nbs

LeetCode演算法題21:合併有序連結串列解析

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。 示例: 輸入:1->2->4, 1->3->4 輸出:1->1->2->3->4->4 因為之前做過兩數之和的那道題,

合併有序的連結串列(LeetCode第21題)

方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None clas

合併單鏈表(連結串列方式)

假設頭指標為La、Lb單鏈表分別為線性表LA、LB的儲存結構,現在要合併La、Lb得到單鏈表Lc void MergeList_L(LinkList La, LinkList Lb, LinkList Lc){ //已知La、Lb的元素按值非遞減排列 //歸併La、Lb得到單鏈表Lc,

合併有序連結串列(注意空指標異常)

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。  要注意判斷兩個結點是否為空結點,不然會出現空指標異常 /** * Definition for singly-linked list. * public class

java POI合併word文件

有需要的可以將主函式中寫死的地方改為一個List。 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream;

python合併資料夾

# 作用: 7 # 合併並兩個目錄/資料夾。 8 # 將目錄A合併到目錄B,同級目錄下, 9 # 將A中有,B中沒有的目錄完全複製到B中; 10 # 將A中沒有,B中有的目錄不做改動; 11 # 將A中做了修改的檔案,在B的同級目錄下建立一個副本。(注意不是覆蓋)

LeetCode 21 合併有序連結串列--python

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。  示例: 輸入:1->2->4, 1->3->4 輸出:1->1->2->3->4->4 # Definiti

LeetCode 之合併有序陣列

問題描述: 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和&n

合併有序的單鏈表,合併後依然有序

分析過程:  首先我要合併有序的連結串列,合併後依然有序。我就要有兩個指標,分別指向兩個連結串列,觀察所給的兩個連結串列是升序還是降序的來確定合併後的連結串列是否有序。(這裡預設的認為連結串列時升序的)  用指標分別指向兩個連結串列的第一個節點,比較大小,那個大,將元素尾插進入我所要返

劍指offer程式設計題python實現(第16題)合併排序的連結串列

劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列 題目描述 輸入兩個單調遞增的連結串列, 輸出兩個連結串列合成後的連結串列, 當然我們需要合成後的連結串列滿足單調不減規則。 '''題目描述 輸入兩個單調遞增的連結串列, 輸出兩個連結串列合成後的連結串列, 當然我們需

合併排序的連結串列 java

合併兩個排序的連結串列 java 題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。 程式碼1: public class Solution { public ListNode Merg