SQL 操作結果集 -並集、差集、交集、結果集排序


 

操作結果集

  為了配合測試,特地建了兩個表,並且添加了一些測試數據,其中重復記錄為東吳的人物。

  表:Person_1魏國人物

   

  表:Person_2蜀國人物

  

  A、Union形成並集

    Union可以對兩個或多個結果集進行連接,形成“並集”。子結果集所有的記錄組合在一起形成新的結果集。

     1、限定條件

     要是用Union來連接結果集,有4個限定條件。

     (1)、子結果集要具有相同的結構。

     (2)、字結果集的列數必須相同。

     (3)、子結果集對應的數據類型必須可以兼容。

     (4)、每個子結果集不能包含order by和compute子句。

     2、語法形式

    select_statement union [all] select_statement

   all代表最終的結果集中將包含所有的行,而不能刪除重復行。

    示例:

  SELECT Name FROM Person_1
  UNION
  SELECT Name FROM Person_2

   生成的結果為:

   

  注意到重復記錄,孫權與周瑜僅僅顯示了一個。下面來將UNION替換成UNION ALL看看是什么結果:

  SELECT Name FROM Person_1
  UNION ALL
  SELECT Name FROM Person_2

  注意到重復記錄,孫權與周瑜出現了兩次,這就是UNION ALL 與 UNION的不同之處。

  

          UNION有重復記錄只取一條,UNION ALL 時取所有重復記錄。

   B、Except形成差集

   Except可以對兩個或多個結果集進行連接,形成“差集”。返回左邊結果集合中已經有的記錄,而右邊結果集中沒有的記錄。

   限定條件:

    1、子結果集要具有相同的結構。

    2、子結果集的列數必須相同。

    3、子結果集對應的數據類型必須可以兼容。

    4、每個子結果集不能包含order by 和 compute子句。

    語法形式:

    select_statement except select_statement 

    自動刪除重復行。

    示例:

  SELECT Name FROM Person_1
  EXCEPT
  SELECT Name FROM Person_2

    結果:

    

    留意到表Person_2有的,孫權周瑜已被去除。

  C、InterSect形成交集

    InterSect可以對兩個或多個結果集進行連接,形成“交集”。返回左邊結果集和右邊結果集中都有的記錄。

  1、限定條件  

    要是用Except來連接結果集,有4個限定條件。

    (1)、子結果集要具有相同的結構。

    (2)、子結果集的列數必須相同。

    (3)、子結果集對應的數據類型必須可以兼容。

    (4)、每個子結果集不能包含order by或compute子句。

  2、語法形式

  select_statement intersect select_statement        

  示例:

  SELECT Name FROM Person_1
  INTERSECT
  SELECT Name FROM Person_2

   返回的結果如下:

   

   留意到只取兩張表都有的記錄(周瑜,孫權),這就是所謂的交集。

  D、結果集的排序

  SELECT Name FROM Person_1
  INTERSECT
  SELECT Name FROM Person_2
  ORDER BY Name DESC    --此處的字段名相同了,如果不同,請切記排序列名,只能夠是第一個表的列名

  這里只有兩點要注意

  1.ORDER BY是對整個運算后的結果排序,並不是對單個數據集。

  2.ORDER BY后面排序的字段名稱是第一個數據集的字段名或者別名。

 

並集
SELECT * FROM Table1 FULLl JOIN Table2 ON table1.id=table2.id;

交集
SELECT * FROM table1 AS a JOIN table2 AS b ON a.name =b.name;

差集
SELECT * FROM table1 WHERE name NOT IN (SELECT name FROM table2);

笛卡爾積:
SELECT * FROM table1 CROSS JOIN table2;
沒有WHERE子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。
不過,如果添加一個 WHERE 子句,則交叉聯接的作用將同內聯接一樣。
注意:不能使用ON關鍵字,只能用WHERE條件

union 和join不一樣,union這個運算子是將資料列合並,而join是將欄位合並
如果從欄位合並來講,full join 算是並集,inner join 算是交集!left join 或right join 不完全是差集,也包括交集的結果,具體你的語句的查詢結果如何還是要看實際的語句,就如cross join,加上where就變成inner join,前后的結果相差甚遠。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM