一、多表查詢
多表查詢,又稱表聯合查詢,即一條sql語句涉及到的表有多張,資料通過特定的連線進行聯合顯示。
1)笛卡爾積
在數學中,兩個集合x和y的笛卡尓積(cartesian product),又稱直積,表示為x × y.
假設集合a=,集合b=,則兩個集合的笛卡爾積為。
在資料庫中,如果直接查詢倆張表,那麼其查詢結果就會產生笛卡爾積
例如:
1)連線查詢select *
from s_emp,s_dept;
為了在多表查詢中避免笛卡爾積的產生,我們可以使用連線查詢來解決這個問題。
連線查詢分為:1.等值連線2.不等值連線3.外連線(左外連線,右外連線,全連線)4.自連線
a)等值連線
利用一張表中某列的值和另一張表中某列的值相等的關係,把倆張表連線起來。
例如:查詢員工的名字、部門編號、部門名字
b)不等值連線: 通過範圍確定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;
例如:查詢出員工的名字、職位、工資、工資等級名稱
c)外連線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
外連線分為:左外連線 右外連線 全連線
左外連線
例如:查詢所有員工 以及對應的部門的名字,沒有部門的員工也要顯示出來
右外連線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;
例如:查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來
注意:(+)是oracle資料庫獨有的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;
全連線例如:查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來,沒有部門的員工也要顯示出來
d)自連線select last_name,dept_id,name
from s_emp full outer join s_dept
on s_emp.dept_id=s_dept.id;
一張表,自己和自己連線
例如:查詢每個員工的名字以及員工對應的管理者的名字
二、對查詢結果集的操作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;
對比倆種情況的結果
intersect 求倆個結果集的交集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(
+);
*三、oracle中的偽列 rownumselect 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;
偽列rownum,就像表中的列一樣,但是在表中並不儲存。偽列只能查詢,不能進行增刪改操作。它會根據返回的結果為每一條資料生成乙個序列化的數字.rownum是oracle才有的偽列
rownum 只能等於1 如果讓其等於其他數 則查不到資料
例如:
rownum 是動態的select last_name
from s_emp
where rownum=
1
rownum 大於0 如果讓其大於其他數 則查不到資料
例如:
rownum 可以小於任何數select last_name
from s_emp
where rownum>
0
例如:
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...