【Oracle】第四單元 多表關聯查詢

等於鏈接
SELECT e.employee_id
      ,e.department_id
      ,d.department_name
      ,d.location_id
  FROM employees   e
      ,departments d
 WHERE e.department_id = d.department_id;
不等鏈接

包括>,<,!=,between

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;
外鏈接

包括左外連接,右外連接

SELECT e.last_name
      ,e.department_id
      ,d.department_name
  FROM employees   e
      ,departments d
 WHERE e.department_id = d.department_id(+);
SELECT e.last_name
      ,e.department_id
      ,d.department_id
      ,d.department_name
  FROM employees   e
      ,departments d
 WHERE e.department_id(+) = d.department_id;
自鏈接

是一種概念,某個table和自己本身鏈接,比如:table1給另一個“自己”起別名爲table2

SELECT worker.last_name || ' works for ' || manager.last_name,
       worker.employee_id,
       worker.manager_id
  FROM employees worker, employees manager
 WHERE worker.manager_id = manager.employee_id;
交叉連接

相當於沒有鏈接條件的多表關聯查詢,結果是個笛卡爾乘積,實際工作中很少用到

select last_name,department_name
 from employees
 cross join departments
自然鏈接

相當於Oracle的“等於連接”,只不過是讓系統自己去找兩張表中字段名相同的字段爲“等於連接”條件

注:如果兩個表中有相同的列名,但字段類型不一樣,會引起錯誤

避免使用

select department_id, department_name, location_id, city
  from departments natural
  join locations

相當於

select department_id, department_name, d.location_id, city
  from departments d, locations l
 Where d.location_id = l.location_id;
Using子句

Using子句可開着是 自然連接 的一種補充功能,我們知道自然連接會讓系統自動查找兩張表中的所有列名相同的字段,並試圖建立“等於連接”;但有的時候我們不期望這麼做,而只是期望某個特定的字段作爲“等於連接”的條件,這種情況下可以使用Using 子句來做限制

SELECT e.employee_id, e.last_name, d.location_id
  FROM employees e
  JOIN departments d
 USING (department_id);
內連接

相當於Oracle的“等於鏈接” , 關鍵字:INNER JOIN

注:INNER JOIN 可簡寫爲JOIN ,即省去INNER

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;
外連接

可細分爲左外連接、右外連接、全外連接

左外連接

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;

右外連接

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

發佈了102 篇原創文章 · 獲贊 18 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章