笛卡爾集會在以下條件下產生:
省略連線條件
連線條件無效
所有表中的所有行互相連線
為了避免笛卡爾集, 可以在 where 加入有效的連線條件。
select count(employee_id)
from employees;
假設輸出107行
select count(department_id)
from departments;
假設輸出27行
select last_name, department_name
from employees, departments;
結果輸出107*27=2889行
使用連線在多個表中查詢資料。
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;
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;
employees表中的列工資在job_grades表中的最高工資與最低工資之間:
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;
連線 n個表,至少需要 n-1個連線條件。查詢出公司員工的 last_name, department_name, city(三個表,兩個連線條件):
select last_name, department_name, city
from employees,departments,locations
where employees.department_id = departments.department_id
and departments.location_id = locations.location_id
連線條件中匹配行的表的列後面要加外連線運算子(+)(1)左外連線
兩個表在連線過程中除了返回滿足連線條件的行以外還返回左表中不滿足條件的行,這種連線稱為左外連線。
select table1.column, table2.column
from table1, table2
where table1.column = table2.column(+);
(2)右外連線與左外連線相反,兩個表在連線過程中除了返回滿足連線條件的行以外還返回右表中不滿足條件的行 ,這種連線稱為右外連線。
select table1.column, table2.column
from table1, table2
where table1.column(+) = table2.column;
使用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 子句指定等值連線中需要用到的列。使用 using 可以在有多個列滿足條件時進行選擇。
不要給選中的列中加上表名字首或別名。
join和using 子句經常同時使用。
select department_id, department_name,
location_id, city
from departments join locations using(location_id);
是以具有相同名字的列為連線條件的。這個連線條件是與其它條件分開的。
select department_id, department_name,
d.location_id, city
from departments d 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;
(1)left outer join:左外連線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);
(2)right outer join:右外連線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);
(3)full outer join:滿外連線兩個表在連線過程中除了返回滿足連線條件的行以外還返回兩個表中不滿足條件的行,這種連線稱為滿外連線。
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);
oracle 資料庫 多表查詢
這裡以oracle 自帶的表為例項 1.等值連線 查詢員工資訊 員工號 姓名 月薪 部門名稱 select e.empno,e.ename,e.sal,d.dnamefrom emp e,dept d where e.deptno d.deptno e d 分別 值兩個表的別名,等值條件 為 dep...
oracle資料庫之多表查詢
select s.stuid,s.stuname,s.stuage,s.gender,cl.classesname from student s,classes cl where s.classesid cl.classesid select s.stuid,s.stuname,s.stuage,s...
Oracle資料庫學習多表查詢
此查詢設計到兩個表,其中兩個表中都有相同的列department id 此次查詢出現了笛卡兒積的錯誤,出現原因為1.省略連線條件2.連線條件無效3.所有表中的所有行相互連線 所以為了避免笛卡兒積,要在聯表查詢的時候在where後加有效的連線條件 這種方式為內連線的等值連線,如果涉及到n張表的查詢那麼...