Oracle 10g數據庫基礎之基本查詢語句-下-鏈接&子查詢

 Oracle 10g數據庫基礎之基本查詢語句-下-鏈接&子查詢sql

-- 資料參考:張烈 張建中《數據庫管理員培訓講義》
實驗18:表的鏈接查詢
該實驗的目的是掌握基本的聯合查詢 .
表的鏈接
咱們要從多張表中要獲得信息,就得以必定的條件將錶鏈接在一塊兒查詢。

Cartesian (笛卡兒)鏈接

當多張表在一塊兒查詢時,沒有給定正確的鏈接條件,結果是第一張表的全部行和第二張表的全部行進行矩陣相乘,獲得n*m行的結果集。數據庫

通常來講笛卡兒鏈接不是咱們須要的結果。
但表若是有一行的狀況下,結果有可能正確。

SQL> select ename,dname from emp,dept;ide

 
ENAME      DNAME

---------- --------------spa

SMITH      ACCOUNTING
ALLEN      ACCOUNTING
……..
SMITH      RESEARCH
ALLEN      RESEARCH
……..
SMITH      SALES
ALLEN      SALES
……..
SMITH      OPERATIONS
ALLEN      OPERATIONS
……..
 
56 rows selected
 
SQL>

結果爲每一個員工在每一個部門上了一次班,4*14=56,這並非咱們想獲得的結果。3d

要避免笛卡兒鏈接必定要給定一個正確的鏈接條件。
等值鏈接
在鏈接中給定一個相等的鏈接條件。
SQL> select ename,dname from emp,dept where emp.deptno=dept.deptno;

當列的名稱在兩張表內重複的時候,要加表的前綴來區分,避免不明確的定義。
表的別名
1 。便於書寫
2 。將同名的表區分
3 。一旦定義了別名,表的本名就無效
4 。只在該語句內有效
5 。定義方式爲表名後緊跟別名,用空各間隔。

SQL> select ename,dname from emp e,dept d where e.deptno=d.deptno;blog

SQL99 的書寫方式

select ename,dname from emp e join dept d on (e.deptno=d.deptno)get

效率是相同的,SQL99是國標it

列的別名,爲了區分相同的列的名稱,這是別名的本質。
SQL> select ename,dname,e.deptno,d.deptno

  from emp e,dept dclass

  where e.deptno=d.deptno;效率

上述顯示有兩個列名稱都叫deptno,咱們沒法區分。

SQL> select ename,dname,e.deptno "員工表",d.deptno "部門表"

  from emp e,dept d
  where e.deptno=d.deptno;

不等鏈接
鏈接條件不是一個相等的條件。

SQL> select ename,sal,grade

  from emp,salgrade
  where sal between LOSAL and hisal;

外鍵鏈接
將一張表有,而另外一張表沒有的行也顯示出來。

SQL> select ename,dname,emp.deptno from emp,dept

where emp.deptno=dept.deptno;

這句話不會顯示40號部門,由於40部門沒有員工。

SQL> select ename,dname,dept.deptno from emp,dept where emp.deptno(+)=dept.deptno;

+號的意思爲將沒有員工的部門,用NULL來匹配

+號不能同時放在等號的兩邊,只能出如今一邊。

自鏈接
表的一列和同一個表的另外一列做爲鏈接的條件。

SQL> select w.ename "下級" ,m.ename "上級"

  from emp w,emp m
  where w.mgr=m.empno(+);

其中「下級」「上級」爲列的別名。區分相同的列。

Wm 爲表的別名。區分相同的表。別名的本質。

+)爲了將沒有上級的人也顯示。

過濾結果

想在結果中過濾去一些內容請用and運算。

SQL> select w.ename "下級" ,m.ename "上級"

  from emp w,emp m
  where w.mgr=m.empno(+)
  and w.deptno=30;

實驗19:sql99規則的錶鏈接操做

該實驗的目的是掌握新的ORACLE表之間的聯合查詢語法.

SQL99 規則的書寫格式

. Nature(天然)鏈接

這是SQL99規則。

全部同名的列都做爲等值條件。
同名的列的數據類型必須匹配。
列的名稱前不能加表的前綴。

SQL> select ename,deptno,dname from emp natural join dept;

Using 指定列的鏈接
當有多列同名,但想用其中某一列做爲鏈接條件時使用。
SQL> select ename,deptno ,dname from emp join dept using (deptno);

SQL99 的外鍵鏈接
SQL99 寫法

select ename,dname,dept.deptno

from dept left outer join emp

on(dept.deptno=emp.deptno);
9I 前的寫法

select ename,dname from emp,dept

where emp.deptno(+)=dept.deptno;

SQL> select ename,dname,dept.deptno
  from dept left outer join emp
  on(dept.deptno=emp.deptno);

知識點
1 。笛卡兒鏈接
2 。等值鏈接
3 。不等鏈接
4 。外鍵鏈接
5 。自鏈接

6SQL99的書寫格式

實驗20:子查詢
該實驗的目的是掌握子查詢的語法和概念 .
子查詢
誰的工資最多

簡單子查詢
1 。先於主查詢執行。
2 。主查詢調用了子查詢的結果。
3 。注意列的個數和類型要匹配。
4 。子查詢返回多行要用多行關係運算操做。
5 。子查詢要用括號括起來。

SQL> --查詢工資總和高於10號部門工資總和的部門。

SQL> select deptno,sum(sal)

  from emp
  group by deptno

  having sum(sal)>(select sum(sal) from emp where deptno=10);

SQL> -- 查詢每一個部門的最大工資是誰。

SQL> select deptno,ename,sal from emp

  where (deptno,sal) in

  (select deptno,max(sal) from emp group by deptno);

子查詢返回多行,用=不能夠,得用in

子查詢返回多列,因此對比的列也要匹配。
Any all 操做

SQL> select ename,sal from emp where sal<any(1000,2000);

小於2000就能夠

SQL> select ename,sal from emp where sal<all(1000,2000);

必須小於 1000

小於all小於最小,大於all大於最大

SQL> select ename,sal,deptno from emp

where sal<all(select avg(sal) from emp group by deptno);

小於any小於最大,大於any大於最小

select ename,sal,deptno from emp

where sal>any(select avg(sal) from emp group by deptno)

From 子句中的子查詢
查詢工資大於本部門平均工資的員工。

select ename,e.deptno,sal,asal

from emp e,

(select deptno ,avg(sal) asal from emp group by deptno) a

where e.deptno=a.deptno and sal>asal;

A爲視圖,爲何要使用別名asal,由於表達式不能當列的名稱,別名的本質使用方法是使非法的合法化。

相互關聯的子查詢

select ename,sal ,deptno

from emp o

where sal>(select avg(sal) from emp where deptno=o.deptno) ;

先運行主查詢,獲得第一行,將DEPTNO傳入到子查詢,由子查詢求出AVGSAL),在斷定主查詢的行是否符合查詢的條件。

執行計劃是將子查詢看做視圖的關聯。這叫作SQL的自動改寫。

Exists 操做

找領導,其中3是常量,你寫什麼均可以。

當子查詢有行時,Exists返回true

查到行後就再也不繼續查詢

當子查詢沒有行時爲假,Exists返回false

select ename,empno,mgr from emp o

where exists(select 3 from emp where mgr=o.empno);

《完》

--xjzhujunjie

--2012/05/17

相關文章
相關標籤/搜索