(高手就不要笑話了^_^)。
好了,其他的不說現在就開始:
select 子句主要決定了從表中取出的列名,列數以及列的顯示順序等信息,"*"表示查詢所有的列,有關select的用法應該結合其它子句的用法。
1.from 子句:
①from子句用於指定被查詢的表,試圖或快照。
②如果指定多個實體,用逗號講它們分割。為了查詢方便,特別是進行自連接查詢時,可以給表起別名。(這裡我要說很多剛開始使用sql的朋友開始的時候總覺得這個很簡單,沒有什麼可學的,可是到後來在做一些復雜的sql的時候總是想不起來這一點導致其實不難的sql語句無從下手)。
③如果被查詢的實體不在當前的模式中,則必須用模式名來限定該對象。
select *from admin.emp
④若查詢遠程數據庫中的實體,必須使用數據庫鏈路,如果查詢分區表中某個分區的數據,則必須使用關鍵字Partition來指定分區名。
select *from emp@cbf107
select *from emp partition(A_hiredate)
2.where 子句
where 子句用於限定處理的行數,選擇滿足條件的行,where 子句中的任何邏輯條件都使用比較運算符,滿足where子句中邏輯條件的數據被返回或者被處理,在where子句中可以使用列名或表達式。
select ename from emp where deptno=10
①如果列類型為字符型,where ename='smith';(單引號內字符串大小寫有區別)
②列類型為數字型deptno=20;
③如果列值取其他列值,可用如下形式表示
where emp.depno=dept.deptno
④in 與 not in 擇列的值與值列表中某一個值相符的相關行信息(如果進行"或操作")
查詢表EMP中有那些雇員和分析員
select name,job from emp where job in ('clerk','analyst');
查詢表EMP中有那些人不是雇員和分析員
select name,job from emp where job not in ('clerk','analyst');
有那些雇員的工資在/不在2000~3000之間
select ename,job,sal from emp where sal between 2000 and 3000;
select ename,job,sal from emp where sal not between 2000 and 3000
select ename,oeptno from emp where ename like 's%';
"%" 匹配0個或n個長度的字符串,而"_"僅匹配一個字符。假如查詢條件中本身含有"_"或"%",為了與模式匹配符"_"和"%"區分,必須在like運算符中加ESCAPE"%子句.
查詢雇員名以A_開始的行
select *from emp where ename like 'a\_%' ESCAPE '\';
is null 和 is not null
空值(null)不等同於0,0是一個數字,而空值表示未知的,不存在的或不可用的數據.它不能像0那樣進行算術運算,null用於查詢列值為空值或非空的信息。
在Oracle的RDBMS中,null(空值)不占空間,判斷某一列值是否為空,不能用"="或"!="運算符號,而要用is null或is not null。
選擇沒有獎金的雇員信息
select ename,job from emp where comm is null
3.order by
在關系型模式中,行是沒有順序可言的。order by 子句確定的行信息顯示時的先後順序,當按多列進行排序時,首先由第一個列名確定順序,其次由第二個列名確定順序。
先按工資的降序排列,在工資相同的情況下,按姓名的字母順序排列
select
ename employee,
sal salary
from
emp
where
deptno=30
order by
sal desc employee;
假如在select子句中使用distinct關鍵字,在order by 子句中只能使用select 子句中列出來的列名,不能使用列的別名。
在查詢語句中不僅可以使用列名或列的別名進行排序,也可以使用在select 子句中列的位置進行排序。(select 子句中有一個很長的表達式,並且要用此表達式的結果進行排序時用列的位置是很有用的)。對於涉及集合操作:union,minus的查詢,不能使用列名,在這種情況下,必須提供列的位置。
select
'name:'||ename "employee",
sal "salary",
from
emp
where
deptno=30
order by
2,1;
4.group by
在select 語句中可以使用group by 子句將行劃分成較小的組,然後,使用聚組函數返回每一個組的匯總信息,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,並返回行的匯總信息Oracle 按照group by 子句中指定的表達式的值分組查詢結果。
在帶有group by 子句的查詢語句中,在select 列表中指定的列要麼是group by 子句中指定的列,要麼包含聚組函數
select max(sal),job emp group by job;
(注意max(sal),job的job並非一定要出現,但有意義)
查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
當在gropu by 子句中使用having 子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用於設置限定條件
where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。
查詢每個部門的每種職位的雇員數
select deptno,job,count(*) from emp group by deptno,job;
5.多表連接
笛卡爾連接就是指從多張表中取數據時,在where子句中沒有指定多張表的公共關系(即一張表中取出每條記錄與另一張表中的每條記錄作連接)。假如第一張表中有M條記錄,而第二張表中用N條記錄,結果是M*N條記錄。要盡量避免產生笛卡爾連接。所以一般有N張表連接,至少有N-1個連接條件。
select
D.dname,D.Loc,E.ename,e.sal
from
delpt D,emp E
where
D.deptno=E.deptno;
一但定義了表的別名,在本條select語句中就不能用表名去限制列名,應該用表的別名去限制別名。
哪些雇員的工資屬於第三級別?
select
empno,ename,sal
from
emp,salgrade
where
grade=3
and
sal between losal and hisal;
找出emp表中的每一雇員屬於哪一等級。
select
empno,ename,sal,grade
from
emp,sal,grade
where
emp.sal between lowsal and hisal.
5.外連接與內連接
有時候,即使在連接的表中沒有相應的行,用戶可能想從一張表中看數據,Oracle提供了外連接實現該功能。
內連接是指連接查詢只顯示完全滿足連接條件的記錄,即等值連接,外連接的查詢結果是內連接查詢結果的擴展。外連接不僅返回滿足連接條件的所有記錄而且也返回了一個表中那些在另一個表中沒有匹配行的記錄。外連接的操作符是“+”。“+”號放在連接條件中信息不完全的那一邊(即沒有相應行的那一邊)。運算符“+”影響NULL行的建立。建一行或多行NULL來匹配連接的表中信息完全的行。
外連接運算符“+”只能出現在where子句中表達式的一邊。
假如在多張表之間有多個連接條件,外連接運算符不能使用or,in邏輯運算符與其它條件組合。
假如emp表中deptno=10的ename為空值,dept表中deptno=20的loc為空值:
1.
select
ename,dept.deptno,loc
from
emp,dept
where
emp.depno(+)=dept.deptno;
如果在dept.deptno中有的數值在emp.deptno中沒有值,則在做外連接時,
結果中ename會產生一個空值。(emp.deptno=10)
2.
select
ename,dept.deptno,loc
from
emp,dept
where
emp.depno=dept.deptno(+);
如果在emp.deptno中有的數值在dept.deptno中沒有值,則在做外連接時,
結果中loc會產生一個空值。。(dept.deptno=20)
5.自連接
自連接是指同一張表的不同行間的連接。該連接不受其他表的影響。用自連接可以比較同一張表中不同行的某一列的值。因為自連接查詢僅涉及到某一張表與其自身的連接。所以在from子句中該表名出現兩次,分別用兩個不同的別名表示,兩個別名當作兩張不同的表進行處理,與其它的表連接一樣,別名之間也使用一個或多個相關的列連接。為了區分同一張表的不同行的列,在名前永別名加以限制。
select
worker.ename,
manager.ename manager
from
emp worker,
emp manager
where
work.mgr=manager.empno;
7.集合運算
基合運算符可以用於從多張表中選擇數據。
①UNION運算
用於求兩個結果集合的並集(兩個結果集合的所有記錄),並自動去掉重復行。
select ename,sal from account where sal>2000
union
select ename,sal from research where sal>2000
union
select ename,sal from sales where sal>2000;
注:ename,sal 是必須一致的。
②UNION ALL運算
用於求兩個結果集合的並集(兩個結果集中的所有記錄)源碼天空,並且不去掉重復行。
select ename,sal from account where sal>2000
union
select ename,sal from research where sal>2000
union
select ename,sal from sales where sal>2000;
③INTERSECT運算
intersect運算返回查詢結果中相同的部分。
各部門中有哪些相同的職位?
select Job from account
intersect
select Job from research
intersect
select Job from sales;
④MINUS運算
minus返回兩個結果集的差集。(在第一個結果集中存在的,而在第二個結果集中不存在的行。)
有那些職位是財務部中有,而在銷售部門中沒有?
select Job from account
minus
select Job from sales;