笛卡爾集會在下面條件下產生:
省略連線條件
連線條件無效
所有表中的所有行互相連線
為了避免笛卡爾集,可以在where 加入有效的連線條件。
在實際執行環境下,應避免使用全笛卡爾集。
oracle 連線:
equijoin:等值連線
non-equijoin:不等值連線
outer join:外連線
self join:自連線
cross joins
natural joins
using clause
full or two sided outer joins
使用連線在多個表中查詢資料。
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;
區分重複的列名
使用表名字首在多個表中區分相同的列。
在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名
使用別名可以簡化查詢。
使用表名字首可以提高執行效率。
如果使用了表的別名,則不能再使用表的真名
連線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;
內連線: 合併具有同一列的兩個以上的表的行, 結果集中不包含乙個表與另乙個表不匹配的行
外連線: 兩個表在連線過程中除了返回滿足連線條件的行以外還返回左(或右)表中不滿足條件的行,這種連線稱為左(或右)外聯接。沒有匹配的行時, 結果表中相應的列為空(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 ;
使用連線從多個表中查詢資料:
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 ;
在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 子句使語句具有更高的易讀性。
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);
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;
在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) ;
Java喬曉松 oracle的基本sql語句
select from table select 標識 選擇哪些列。from 標識從哪個表中選擇。select from departments select department id,location id from departments sql 語言大小寫不敏感。sql 可以寫在一行或者多行...
Oracle的多列子查詢
今天學習oracle的時候,發現oracle支援多列子查詢。就是在子查詢中可以返回多個列,主查詢可以根據這個多列子查詢為條件進行再次篩選。例子如下 select empmain.ename from emp empmain where empmain.job,empmain.deptno selec...
Oracle 的併發與多版本
oracle的預設隔離級是快照 snapshot 寫入事務不會阻塞讀取事務,讀取事務可以獲取當前已提交值。db2預設是游標穩定性 cursor stability 寫入事務會阻塞讀取事務。oracle對併發的支援不僅使用高效的鎖定,還實現了一種多版本體系結構,它提供了一種受控但高度併發的資料訪問。這...