1. 程式人生 > >oracle 多表聯合查詢

oracle 多表聯合查詢

http://blog.csdn.net/rosekin/article/details/39298255

此時如果要對分組後的資料再次進行過濾,則使用HAVING子句完成,那麼此時的SQL語法格式如下:

複製程式碼
SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組欄位1 [,分組欄位2 ,…]]

[HAVING 分組後的過濾條件(可以使用統計函式)]

[ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC
]];

下面使用HAVING進行過濾。

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) mycount,NVL(AVG(e.sal),0) myavg
FROM dept d,emp e
WHERE d.deptno=e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc
HAVING AVG(sal)>2000;

注意點:WHERE和HAVING的區別

  • WHERE:是在執行GROUP BY操作之前進行的過濾,表示從全部資料之中篩選出部分的資料,在WHERE之中不能使用統計函式;
  • HAVING:是在GROUP BY分組之後的再次過濾,可以在HAVING子句中使用統計函式;

五、子查詢

子查詢 = 簡單查詢 + 限定查詢 + 多表查詢 + 統計查詢的綜合體;

在之前強調過多表查詢不建議大家使用,因為效能很差,但是多表查詢最有利的替代者就是子查詢,所以子查詢在實際的開發之中使用的相當的多;

所謂的子查詢指的就是在一個查詢之中嵌套了其他的若干查詢,巢狀子查詢之後的查詢SQL語句如下:

複製程式碼
SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式 ,(

      SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式

      FROM 表名稱 [別名], [表名稱 [別名
] ,…] [WHERE 條件(s)] [GROUP BY 分組欄位1 [,分組欄位2 ,…]] [HAVING 分組後的過濾條件(可以使用統計函式)] [ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC]]) FROM 表名稱 [別名], [表名稱 [別名] ,…] ,( SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式 FROM 表名稱 [別名], [表名稱 [別名] ,…] [WHERE 條件(s)] [GROUP BY 分組欄位1 [,分組欄位2 ,…]] [HAVING 分組後的過濾條件(可以使用統計函式)] [ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC]]) [WHERE 條件(s) ( SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式 FROM 表名稱 [別名], [表名稱 [別名] ,…] [WHERE 條件(s)] [GROUP BY 分組欄位1 [,分組欄位2 ,…]] [HAVING 分組後的過濾條件(可以使用統計函式)] [ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC]])] [GROUP BY 分組欄位1 [,分組欄位2 ,…]] [HAVING 分組後的過濾條件(可以使用統計函式)] [ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC]];
複製程式碼

理論上子查詢可以出現在查詢語句的任意位置上,但是從個人而言,子查詢出現在WHERE和FROM子句之中較多;

以下的使用特點為個人總結,不是官方宣告的:

  • WHERE:子查詢一般只返回單行列、多行單列、單行多列的資料;
  • FROM:子查詢返回的一般是多行的資料,當作一張臨時表出現。
<strong>內連線</strong> 
同時顯示部門名稱和員工資訊。Select兩個表的寫法,內連線。公共匹配的 
資料 
簡化的寫法 
Dept表,employee表 
Select d.name,e.name,sex from employee e,dept d where e.id=d.id 
標準的寫法: 
Select d.name,e.name,sex from employee e join dept d on e.id=d.id 

<strong>外連線:</strong> 
左連線: 
左邊員工表的記錄全部顯示。右邊表只顯示匹配的,相同的部分顯示一次 
Select d.name,e.name,sex from employee e,dept d where e.id=d.id(+) 
右連線正好相反 
左連線和右連接合成為外連線 

<strong>子查詢</strong> 
In寫法和下面的exists是一個意思 
Select * from employee e where id not in (select id from dept where id=’3’); 
Select * from employee e where id in (select id from dept where id=’3’); 

Exists寫法和上面的in是一個意思,exists可以用*來匹配。 
Select * from employee e where not exists (select * from d where id=e.id) 
Select * from employee e where exists (select id from d where id=e.id) 


union合併行資料,只是顯示,不變化物理資料 
select id from e 
union 
select id from d; 
相同的行資料合併。不同的只顯示一次 


<u>將兩個表中合併顯示。只是顯示相同的行資料</u> 
Select id from e 
Intersect 
Select id from d 


<strong>用別的表的結果集插入到別的表中</strong> 
Insert into e(eid,ename) select id,name from d; 

<strong>複製表</strong> 
將一行資料放進去表中,把已有表的欄位和資料行 
放到一個表中用來複制 
Create table ttt as select e.id,e.name from e where eid=’001’