一、聚合函數:(都會忽略null數據)
1、常用的有5種:將字段中所有的數據聚合在一條中
1、sum(字段名) :求總和
2、avg(字段名) :求平均值
3、max(字段名) :求最大值
4、min(字段名) :求最小值
5、count(字段名、*) :統計行數
2、按部門編號,查詢平均薪水 ,並且平均薪水<1300的不顯示,結果按降序排序
select empno,avg(sal) as avgsal
from scott.emp
group by empno
having avg(sal)>=1300
order by avgsal desc;
說明:
SQL語句的執行順序:一定是從上到下的!
group by 執行之后才會執行having、select中沒有使用聚合函數的字段名必須寫在這里
having 后不能使用字段的別名、可以聚合函數、一般字段名
order by 后面可以有:字段名、聚合函數、字段別名
注意:
Oracle 10g中才會出現的容錯性:
having 語句可以寫在group by 之前,不會報錯,但是實際上執行的順序還是先執行group by 后執行having子句
說明:
1、當一個查詢中,出現聚合函數和沒有使用聚合函數的字段,則該字段必須出現在group by子句中!
2、group by 字段1,字段2; 會先按照字段1分組得到一個結果集,再按照字段2進行分組!
3、where 發生在group by 前!
4、where 后面不能有聚合函數!
二、多表查詢:
表連接分類: 內連接、外連接、交叉連接、自連接
1、內連接: [inner] join on
SQL語法格式:
語法1:
select *
from 表1 [inner] join 表2 on 表1.字段1=表2.字段1;
語法2:
select *
from 表1,表2
where 表1.字段1=表2.字段1;
說明:
內連接中的inner join 和 join 是等價的!但是建議為了程序的可讀性
盡量不要省略inner!
2、外連接:
分類:左外連接、右外連接、全連接!
1)、左外連接:left outer join
連接效果:
左側的表中的全部數據都會被顯示出來,但是右側表的數據,
只有和左側匹配上的字段才會被查詢出來!否則都會顯示null!
SQL語法格式:
語法1:
select *
from 表1 left outer join 表2
on 表1.字段1=表2.字段1;
語法2:
select *
from 表1 left outer join 表2
where 表1.字段1=表2.字段1(+);
2)、右外連接:right outer join
連接效果:
右側的表中的全部數據都會被顯示出來,但是左側表的數據,
只有和右側匹配上的字段才會被查詢出來!否則都會顯示null!
SQL語法格式:
語法1:
select *
from 表1 right outer join 表2
on 表1.字段1=表2.字段1;
語法2:
select *
from 表1 left outer join 表2
where 表1.字段1(+)=表2.字段1;
3)、全外連接:full/all outer join
SQL語法格式:
select *
from 表1 full outer join 表2
on 表1.字段1=表2.字段1;
3、自連接(self join)
自連接(self join)是SQL語句中經常要用的連接方式,使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。
示例:
在oracle的scott的schema中有一個表是emp。在emp中的每一個員工都有自己的mgr(經理),並且每一個經理自身也是公司的員工,自身也有自己的經理。
但現在我們只有一張emp表。所以我們可以采用自連接。自連接的本意就是將一張表看成多張表來做連接。我們可以這樣來寫SQL語句:
SQL> select work.ename worker,mgr.ename manager from scott.emp work, scott.emp mgr
2 where work.mgr = mgr.empno
3 order by work.ename;
WORKER MANAGER
---------- ----------
ADAMS SCOTT
ALLEN BLAKE
BLAKE KING
CLARK KING
FORD JONES
JAMES BLAKE
JONES KING
MARTIN BLAKE
MILLER CLARK
SCOTT JONES
SMITH FORD
WORKER MANAGER
---------- ----------
TURNER BLAKE
WARD BLAKE
已選擇13行。
4、交叉連接: 表與表之間做笛卡爾積查詢!
SQL語法格式:(無條件查詢)
select *
from 表1 cross join 表2;
或者
select *
from 表1, 表2;
