Oracle系列五 多表查詢

笛卡爾集
笛卡爾集會在下面條件下產生:spa

  • 省略鏈接條件
  • 鏈接條件無效
  • 全部表中的全部行互相鏈接


爲了不笛卡爾集, 能夠在 WHERE 加入有效的鏈接條件。3d


 

Oracle 鏈接

使用鏈接在多個表中查詢數據。code

SELECT    table1.column, table2.column
FROM    table1, table2
WHERE    table1.column1 = table2.column2;
  • 在 WHERE 子句中寫入鏈接條件。
  • 在表中有相同列時,在列名以前加上表名前綴

等值鏈接

示例blog

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 操做符


區分重複的列名

ci

  • 使用表名前綴在多個表中區分相同的列。
  • 在不一樣表中具備相同列名的列能夠用表的別名加以區分。



表的別名it

  • 使用別名能夠簡化查詢。
  • 使用表名前綴能夠提升執行效率。
SELECT
    e.employee_id,
    e.last_name,
    e.department_id,
    d.department_id,
    d.location_id
FROM
    employees e,
    departments d
WHERE
    e.department_id = d.department_id;


鏈接多個表

io

  • 鏈接 n個表,至少須要 n-1個鏈接條件。 例如:鏈接三個表,至少須要兩個鏈接條件。

非等值鏈接
EMPLOYEES表中的列工資應在JOB_GRADES表中的最高工資與最低工資之間

示例table

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;

 

內鏈接和外鏈接

ast

  • 內鏈接: 合併具備同一列的兩個以上的表的行, 結果集中不包含一個表與另外一個表不匹配的行
  • 外鏈接: 兩個表在鏈接過程當中除了返回知足鏈接條件的行之外還返回左(或右)表中不知足條件的行 ,這種鏈接稱爲左(或右) 外鏈接。沒有匹配的行時, 結果表中相應的列爲空(NULL). 外鏈接的 WHERE 子句條件相似於內部鏈接, 但鏈接條件中沒有匹配行的表的列後面要加外鏈接運算符, 即用圓括號括起來的加號(+).
  • 在SQL: 1999中,內鏈接只返回知足鏈接條件的數據
  • 兩個表在鏈接過程當中除了返回知足鏈接條件的行之外還返回左(或右)表中不知足條件的行,這種鏈接稱爲左(或右) 外鏈接。
  • 兩個表在鏈接過程當中除了返回知足鏈接條件的行之外還返回兩個表中不知足條件的行 ,這種鏈接稱爲滿 外鏈接。

 
外鏈接語法class

  • 使用外鏈接能夠查詢不知足鏈接條件的數據。
  • 外鏈接的符號是 (+)。
右外鏈接
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;



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

使用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;









左外鏈接
示例

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

相關文章
相關標籤/搜索