資料庫多表連線查詢

2021-09-29 20:03:40 字數 4315 閱讀 8448

一、多表查詢

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

1)笛卡爾積

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

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

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

例如:

select *

from s_emp,s_dept;

1)連線查詢

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

連線查詢分為:1.等值連線2.不等值連線3.外連線(左外連線,右外連線,全連線)4.自連線

a)等值連線

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

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

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

b)不等值連線: 通過範圍確定

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

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

from s_emp e, salgrade s

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

c)外連線

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

左外連線

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

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;

右外連線

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

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;

注意:(+)是oracle資料庫獨有的

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

select last_name,dept_id,name 

from s_emp full outer join s_dept

on s_emp.dept_id=s_dept.id;

d)自連線

一張表,自己和自己連線

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

select s1.last_name,s2.last_name manager_name

from s_emp s1,s_emp s2

where s1.manager_id = s2.id;

二、對查詢結果集的操作

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

union 取倆個結果集的並集

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

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

intersect 求倆個結果集的交集

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

union 取倆個結果集的並集

例如:

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(

+)union

select last_name,dept_id,name

from s_emp,s_dept

where s_emp.

dept_id(+

)=s_dept.id;

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

例如:

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(

+)union all

select last_name,dept_id,name

from s_emp,s_dept

where s_emp.

dept_id(+

)=s_dept.id;

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

例如:

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(

+)minus

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,s_dept

where s_emp.

dept_id(+

)=s_dept.id

minus

select last_name,dept_id,name

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(

+);

intersect 求倆個結果集的交集

select last_name,dept_id,name 

from s_emp,s_dept

where s_emp.dept_id=s_dept.id(

+)intersect

select last_name,dept_id,name

from s_emp,s_dept

where s_emp.

dept_id(+

)=s_dept.id;

*三、oracle中的偽列 rownum

偽列rownum,就像表中的列一樣,但是在表中並不儲存。偽列只能查詢,不能進行增刪改操作。它會根據返回的結果為每一條資料生成乙個序列化的數字.rownum是oracle才有的偽列

rownum 只能等於1 如果讓其等於其他數 則查不到資料

例如:

select last_name

from s_emp

where rownum=

1

rownum 是動態的

rownum 大於0 如果讓其大於其他數 則查不到資料

例如:

select last_name

from s_emp

where rownum>

0

rownum 可以小於任何數

例如:

select last_name

from s_emp

where rownum<

7

資料庫之多表查詢(連線查詢)

一 非等值和等值的多表查詢 select c.catname 圖書類別 b.bookname 書名 b.price from cats c,book b select c.catname 圖書類別 b.bookname 書名 b.price from cats c,book b where c.id...

MySQL資料庫 多表連線查詢

多表連線查詢 注意 使用連線技術建議將表經行重新命名!explain 檢索連線是否達標 內連線 語法1 from 表1 inner join 表2 on 主鍵字段 外來鍵字段 where 條件表示式 語法2 from 表1,表2 where 主鍵字段 外來鍵字段 and 條件表示式 三個表連線 fr...

Access資料庫多表連線查詢

第一次在access中寫多表查詢,就按照ms資料庫中的寫法,結果報語法錯,原來access的多表連線查詢是不一樣的 表a b c,a關聯b,b關聯c,均用id鍵關聯 一般寫法 select from a inner join b on a.id b.id inner join c on b.id c...