多表查詢:
多表查詢,又稱表聯合查詢,即一條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 多表查詢
多表查詢 多表查詢,又稱表聯合查詢,即一條sql語句涉及到的表有多張,資料通過特定的連線進行聯合顯示.笛卡爾積 在數學中,兩個集合x和y的笛卡尓積 cartesian product 又稱直積,表示為x y.假設集合a 集合b 則兩個集合的笛卡爾積為。在資料庫中,如果直接查詢倆張表,那麼其查詢結果就...