連接條件和連接類型(內連接,等值連接,不等連接,外連接,左/右/全外連接)


  本文使用的數據來自《精通Oracle Database 12c SQL & PL/SQL編程(第三版)》。這里用到了兩張表,products和product_types,分別為產品表和產品類型表。

  products的數據展示如下:

  

  product_types的數據展示如下:

  

  連接分為三中類型,即內連接,外連接自連接。內連接根據連接條件不同,可以分為等值連接不等連接。等值連接中使用的是等於操作符(=),不等連接在連接中使用除等號外的操作符(<,>,BETWEEN等);外連接根據保留數據的方向,分為左外連接、右外連接全外連接

  這里給出等值連接和內連接的比較:  

-- 內連接
SELECT p.name, pt.name
FROM products p INNER JOIN product_types pt ON p.product_type_id = pt.product_type_id
ORDER BY p.name;
-- 等值連接
SELECT p.name, pt.name
FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id ORDER BY p.name;

  兩者查詢的結果一樣,查詢的效率也一樣,可以看出通常情況下,內連接是默認使用等值連接的。

  二者的查詢結果如下:

  

  二者在時間和空間的效率如下:

  

   等值連接的一個特殊情況是自然連接。自然連接是根據兩個表中同名的列進行連接的,因為在實際操作中,經常需要明確指出根據哪些列連接,因此自然連接很少用。

  外連接分為左外連接、右外連接和全外連接。左外連接保留左表的所有行(如果右表沒有匹配行,取空值),右外連接保留右表的所有行,全外連接保留左表和右表的所有行(取不到則另一側留空)。

  其中左外連接可以通過LEFT JOIN,或在右表加(+)實現;其中右外連接可以通過RIGHT JOIN,或在左表加(+)實現;(+)總是在被保留數據的另一側出現。

  全外連接只能通過FULL JOIN實現,不存在兩邊(+)的寫法。

-- 左外連接
SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id(+)
ORDER BY p.name;

-- 左外連接2
SELECT p.name, pt.name
FROM products p LEFT JOIN product_types pt ON p.product_type_id = pt.product_type_id
ORDER BY p.name;

-- 右外連接
SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id(+) = pt.product_type_id
ORDER BY p.name;

-- 右外連接2
SELECT p.name, pt.name
FROM products p RIGHT JOIN product_types pt ON p.product_type_id = pt.product_type_id
ORDER BY p.name

-- 全外連接
SELECT p.name, pt.name
FROM products p FULL JOIN product_types pt ON p.product_type_id = pt.product_type_id
ORDER BY p.name

  自連接一般用於有層級結構的,如員工表(查詢某員工的上級都有誰),BOM(物料清單)等。這里暫不舉例,后面再填坑。

  

  

  

 


免責聲明!

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



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