oracle 多表查詢

2021-08-08 00:06:54 字數 2983 閱讀 6620

多表查詢:

多表查詢,又稱表聯合查詢,即一條sql語句涉及到的表有多張,資料通過特定的連線進行聯合顯示.

笛卡爾積

在數學中,兩個集合x和y的笛卡尓積(cartesian product),又稱直積,表示為x × y.

假設集合a=,集合b=,則兩個集合的笛卡爾積為。

在資料庫中,如果直接查詢倆張表,那麼其查詢結果就會產生笛卡爾積

例如:select *

from s_emp,s_dept;

連線查詢

為了在多表查詢中避免笛卡爾積的產生,我們可以使用連線查詢來解決這個問題.

連線查詢分為:

內連線:

1.等值連線

2.不等值連線

3.自然連線

外連線:

1.左外連線

2.右外連線

3.全連線

等值連線

利用一張表中某列的值和另一張表中某列的值相等的關係,把倆張表連線起來。

例如:查詢員工的名字、部門編號、部門名字

select last_name,dept_id,name

from s_emp,s_dept

where s_emp.dept_id=s_dept.id;

為了表述的更加清楚,可以給每張表起別名

select se.last_name,se.dept_id,sd.id,sd.name 

from s_emp se,s_dept sd

where se.dept_id=sd.id;

不等值連線

假設資料庫中還有一張工資等級表:salgrade

工資等級表salgrade:

gradename列表示等級名稱

losal

列表示這個級別的最低工資數

hisal    列表示這個級別的最高工資數

表中的資料類似於下面內容:

id  salgrade

losal hisal

1  初級程式設計師   2000  4000

2  中級程式設計師   4000  6000

例如:查詢出員工的名字、職位、工資、工資等級名稱

select  e.last_name, e.title, e.salray, s.gradename

from    s_emp e, salgrade s

where   e.salary between s.losal and s.hisal

自然連線

一張表,自己和自己連線

例如:查詢每個員工的名字以及員工對應的管理者的名字

select s1.last_name,s2.last_name manager_name

from s_emp s1,s_emp s2

where s1.manager_id = s2.id;

外連線外連線分為:左外連線 右外連線 全連線

先分別在倆s_emp和s_dept表中插入新的資料

特點:新員工tom不在任何部門,新增部門st下面沒有任何員工

insert into s_emp(id,last_name) values(26,'tom');

insert into s_dept(id,name) values(60,'st');

commit;

下麵條sql語句可以把上面插入的資料給刪除掉

delete from s_emp where id=26;

delete from s_dept where id=60;

commit;

這個時候再使用等值連線的話,查詢出來的資料就會少,因為新增的員工tom和部門表中的資料連線不上,當然新增的部門st也和員工表中的資料連線不上.那麼這倆條資料都是在等值連線中查詢不出來.

左外連線   a left join b on

例如:查詢所有員工 以及對應的部門的名字,沒有部門的員工也要顯示出來

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(+);

或者 倆者是等價的   

select last_name,dept_id,name 

from s_emp left outer join s_dept

on s_emp.dept_id=s_dept.id;

注意:outer可以省去不寫

右外連線  a right join b on

例如:查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id(+)=s_dept.id;

select last_name,dept_id,name 

from s_emp right outer join s_dept

on s_emp.dept_id=s_dept.id;

注意:outer可以省去不寫

全連線 a full join b on

例如:查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來,沒有部門的員工也要顯示出來

select last_name,dept_id,name 

from s_emp full outer join s_dept 

on s_emp.dept_id=s_dept.id;

注意:outer可以省去不寫

對查詢結果集的操作

如果有倆條sql語句,每一條sql都可以查詢出乙個結果,這個被稱之為結果集。那麼我們可以使用下面的關鍵字對倆個結果集進行操作

union

獲得倆個結果集的並集 

union all

把倆個結果集 合在一起顯示出來

minus    

第乙個結果集除去第二個結果集和它相同的部分

intersect

獲得倆個結果集的交集

注意:前提條件 倆個結果集中【查詢的列】要完全一致

Oracle 多表查詢

sql 外連線 sql 按部門統計員工人數 部門號 部門名稱 人數 sql select d.deptno,d.dname,count e.empno 2 from dept d,emp e 3 where d.deptno e.deptno 4 group by d.deptno,d.dname ...

Oracle 多表查詢

等值和不等值連線查詢 為了避免笛卡爾集,可以在 where 加入有效的連線條件。oracle 連線多表查詢 在 where 子句中寫入連線條件。在表中有相同列時,在列名之前加上表名字首 select table1.column,table2.column from table1,table2 whe...

oracle多表查詢

分頁查詢 oracle的表中都有兩個偽列,可用於指定行號 1 rownum 會根據查詢到的行記錄的改變而改變.如,smith行在第一行那麼rownum就是1,smith行在第4行,那麼rownum就是4.2 rowid 固定行號,不會根據查詢到的行記錄的改變而改變。如,smith行在第一行rowid...