笛卡爾集
笛卡爾集會在下面條件下產生 :
省略連接條件
連接條件無效
所有表中的所有行互相連接
為了避免笛卡爾集,可以在 WHERE 加入有效的連接條件。
在實際運行環境下,應避免使用全笛卡爾集。
?
連接的類型
O racle 連接 :
Equijoin :等值連接
Non-equijoin :不等值連接
Outer join :外連接
Self join :自連接
????? SQL: 1999
?
Cross joins
Natural joins
Using clause
Full or two sided outer joins
Oracle 連接
使用連接在多個表中查詢數據。
SELECT table1.column, table2.column
FROM??? table1, table2
WHERE? table1.column1 = table2.column2;
?
在 WHERE 字句中寫入連接條件。
在表中有相同列時,在列名之前加上表名前綴
等值連接
SELECT employees.employee_id, employees.last_name,
?????? employees.department_id, departments.department_id,
?????? departments.location_id
FROM?? employees, departments
WHERE? employees.department_id = departments.department_id;
多個連接條件與 AND 操作符
區分重復的列名
使用表名前綴在多個表中區分相同的列。
在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名
使用別名可以簡化查詢。
使用表名前綴可以提高執行效率。
如果使用了表的別名,則不能再使用表的真名
?
連接多個表
連接 n 個表 , 至少需要 n-1 個連接條件。例如:連接三個表,至少需要兩個連接條件。
非等值連接
SELECT e.last_name, e.salary, j.grade_level
FROM?? employees e, job_grades j
WHERE? e.salary
?????? BETWEEN j.lowest_sal AND j.highest_sal;
外連接
內連接和外連接 (1)
內連接 : 合并具有同一列的兩個以上的表的行 , 結果集中不包含一個表與另一個表不匹配的行
外連接 : 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行,這種連接稱為左(或右)外聯接。沒有匹配的行時 , 結果表中相應的列為空 (NULL). 外連接的 WHERE 子句條件類似于內部鏈接 , 但連接條件中沒有匹配行的表的列后面要加外連接運算符 , 即用圓括號括起來的加號 (+).
外連接語法
使用外連接可以查詢不滿足連接條件的數據。
外連接的符號是 (+) 。
SELECT table1.column, table2.column
FROM??? table1, table2
WHERE? table1.column(+) = table2.column;
?
SELECT table1.column, table2.column
FROM??? table1, table2
WHERE? table1.column = table2.column(+);
?
外連接
SELECT e.last_name, e.department_id, d.department_name
FROM?? employees e, departments d
WHERE? e.department_id(+) = d.department_id ;
自連接
SELECT worker.last_name || ' works for '
?????? || manager.last_name
FROM?? employees worker, employees manager
WHERE? worker.manager_id = manager.employee_id ;
使用 SQL: 1999 語法連接
使用連接從多個表中查詢數據:
SELECT table1.column, table2.column
FROM??? table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
? ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
? ON (table1.column_name = table2.column_name)];
叉集
使用 CROSS JOIN 子句使連接的表產生叉集。
叉集和笛卡爾集是相同的。
SELECT last_name, department_name
FROM?? employees
CROSS JOIN departments ;
自然連接
NATURAL JOIN 子句,會以兩個表中具有相同名字的列為條件創建等值連接。
在表中查詢滿足等值條件的數據。
如果只是列名相同而數據類型不同,則會產生錯誤。
SELECT department_id, department_name,
?????? location_id, city
FROM?? departments
NATURAL JOIN locations ;
使用 USING 子句創建連接
在 NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列。
使用 USING 可以在有多個列滿足條件時進行選擇。
不要給選中的列中加上表名前綴或別名。
NATURAL JOIN 和 USING 子句經常同時使用。
SELECT e.employee_id, e.last_name, d.location_id
FROM?? employees e JOIN departments d
USING (department_id) ;
使用 ON 子句創建連接
自然連接中是以具有相同名字的列為連接條件的。
可以使用 ON 子句指定額外的連接條件。
這個連接條件是與其它條件分開的。
ON 子句使語句具有更高的易讀性。
SELECT e.employee_id, e.last_name, e.department_id,
?????? d.department_id, d.location_id
FROM?? employees e JOIN departments d
ON???? (e.department_id = d.department_id);
使用 ON 子句創建多表連接
SELECT employee_id, city, department_name
FROM?? employees e JOIN departments d
ON???? d.department_id = e.department_id
JOIN?? locations l
ON???? d.location_id = l.location_id;
內連接和外連接 (2)
在 SQL: 1999 中,內連接只返回滿足連接條件的數據
兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行,這種連接稱為左(右)外聯接。
兩個表在連接過程中除了返回滿足連接條件的行以外還返回兩個表中不滿足條件的行,這種連接稱為滿外聯接。
左外聯接
SELECT e.last_name, e.department_id, d.department_name
FROM?? employees e
LEFT OUTER JOIN departments d
ON?? (e.department_id = d.department_id) ;
右外聯接
SELECT e.last_name, e.department_id, d.department_name
FROM?? employees e
RIGHT OUTER JOIN departments d
ON??? (e.department_id = d.department_id) ;
滿外聯接
SELECT e.last_name, e.department_id, d.department_name
FROM?? employees e
FULL OUTER JOIN departments d
ON?? (e.department_id = d.department_id) ;
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
