本文使用的數據來自《精通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(物料清單)等。這里暫不舉例,后面再填坑。