1、基本查詢
特殊運算符
運 算
|
功 能
|
實 例
|
[NOT] BETWEEN…AND…
|
用于測試是否在范圍內
|
Select * from emp Where sal between 1000 and 2000
|
[NOT] IN (…)
|
用于測試是否在列表中
|
Select*from emp Where job in('CLERK', 'SALESMAN','ANYLYST')
|
[NOT] LIKE
|
用于進行模式匹配
|
Select * from emp Where ename like '%A%'
|
IS [NOT] NULL
|
用于測試是否為空值
|
Select * from emp Where comm is not null
|
ANY SOME
|
同列表或查詢中的每一個值進行比較,測試是否有一個滿足,前面必須使用的運算符包括=、!=、>=、<=、>、<等
|
Select * from emp Where sal<any(select sal from emp where deptno=10)
|
ALL
|
同列表或查詢中的每一個值進行比較,測試是否所有的值都滿足,前面必須使用的運算符包括=、!=、>=、<=、>、<等
|
Select*from emp Where sal<all(1000,1500,
2000)
|
[NOT] EXISTS
|
測試是否子查詢至少返回一行
|
Select?'存在雇員SCOTT' from dual where exists(select*from emp where ename='SCOTT');
|
運算的優先順序是NOT,AND,OR。如果要改變優先順序,可以使用括號。
缺省中文日期格式為DD-MM月-YY,如2003年1月10日應該表示為“10-1月-03”。
字符串和日期型數據的值是包含在單引號中的,如SALESMAN,需要用單引號引起。字符的值對大小寫敏感。
比 較 運 算 符
運算符
|
功 能
|
實 例
|
>,<
|
大于,小于
|
Select * from emp where sal>2000
|
>=.<=
|
大于等于,小于等于
|
Select * from emp where sal>=2000
|
=
|
等于
|
Select * from emp where deptno=10
|
!=,<>,^=
|
不等于
|
Select * from emp where deptno!=10
|
如果要對計算列排序,可以為計算列指定別名,然后按別名排序。
別名如果含有空格或特殊字符或大小寫敏感,需要使用雙引號將它引起來。
表頭的顯示默認為全部大寫。對于日期和數值型數據,右對齊顯示,如deptno列。對于字符型數據,左對齊顯示,如dname列。
%:代表0個或多個任意字符。_ :代表一個任意字符。
2、函數
數值型函數
函 數
|
功 能
|
實 例
|
結 果
|
abs
|
求絕對值函數
|
abs(−5)
|
5
|
sqrt
|
求平方根函數
|
sqrt(2)
|
1.41421356
|
power
|
求冪函數
|
power(2,3)
|
8
|
cos
|
求余弦三角函數
|
cos(3.14159)
|
−1
|
mod
|
求除法余數
|
mod(1600, 300)
|
100
|
ceil
|
求大于等于某數的最小整數
|
ceil(2.35)
|
3
|
floor
|
求小于等于某數的最大整數
|
floor(2.35)
|
2
|
round
|
按指定精度對十進制數四舍五入
|
round(45.923, 1)
round(45.923, 0)
round(45.923,−1)
|
45.9
46
50
|
trunc
|
按指定精度截斷十進制數
|
trunc(45.923, 1)
trunc(45.923)
trunc(45.923,−1)
|
45.9
45
40
|
字符型函數
函數名稱
|
功 能
|
實 例
|
結 果
|
ascii
|
獲得字符的ASCII碼
|
Ascii('A')
|
65
|
chr
|
返回與ASCII碼相應的字符
|
Chr(65)
|
A
|
lower
|
將字符串轉換成小寫
|
lower ('SQL Course')
|
sql course
|
upper
|
將字符串轉換成大寫
|
upper('SQL Course')
|
SQL COURSE
|
initcap
|
將字符串轉換成每個單詞以大寫開頭
|
initcap('SQL course')
|
Sql Course
|
concat
|
連接兩個字符串
|
concat('SQL', ' Course')
|
SQL Course
|
substr
|
給出起始位置和長度,返回子字符串
|
substr('String',1,3)
|
Str
|
length
|
求字符串的長度
|
length('Wellcom')
|
7
|
instr
|
給出起始位置和出現的次數,求子字符串在字符串中出現的位置
|
instr('String', 'r',1,1)
|
3
|
lpad
|
用字符填充字符串左側到指定長度
|
lpad('Hi',10,'-')
|
--------Hi
|
rpad
|
用字符填充字符串右側到指定長度
|
rpad('Hi',10,'-')
|
Hi--------
|
trim
|
在一個字符串中去除另一個字符串
|
trim('S' FROM 'SSMITH')
|
MITH
|
replace
|
用一個字符串替換另一個字符串中的子字符串
|
replace('ABC', 'B', 'D')
|
ADC
|
SYSDATE是返回系統日期和時間的虛列函數。
使用日期的加減運算,可以實現如下功能:
* 對日期的值加減一個天數,得到新的日期。
* 對兩個日期相減,得到相隔天數。
* 通過加小時來增加天數,24小時為一天,如12小時可以寫成12/24(或0.5)。
日期函數
函 數
|
功 能
|
實 例
|
結 果
|
months_between
|
返回兩個日期間的月數
|
months_between ('04-11月-05','11-1月-01')
|
57.7741935
|
add_months
|
返回把月份數加到日期上的新日期
|
add_months('06-2月-03',1)
add_months('06-2月-03',-1)
|
06-3月-03
06-1月-03
|
next_day
|
返回指定日期后的星期對應的新日期
|
next_day('06-2月-03','星期一')
|
10-2月-03
|
last_day
|
返回指定日期所在的月的最后一天
|
last_day('06-2月-03')
|
28-2月-03
|
round
|
按指定格式對日期進行四舍五入
|
round(to_date('13-2月-03'),'YEAR')
round(to_date('13-2月-03'),'MONTH')
round(to_date('13-2月-03'),'DAY')
|
01-1月-03
01-2月-03
16-2月-03
(按周四舍五入)
|
trunc
|
對日期按指定方式進行截斷
|
trunc(to_date('06-2月-03'),'YEAR')
trunc(to_date('06-2月-03'),'MONTH')
trunc(to_date('06-2月-03'),'DAY')
|
01-1月-03
01-2月-03
02-2月-03
(按周截斷)
|
類型轉換函數
函 數
|
功 能
|
實 例
|
結 果
|
To_char
|
轉換成字符串類型
|
To_char(1234.5, '$9999.9')
|
$1234.5
|
To_date
|
轉換成日期類型
|
To_date('1980-01-01', 'yyyy-mm-dd')
|
01-1月-80
|
To_number
|
轉換成數值類型
|
To_number('1234.5')
|
1234.5
|
日期轉換格式字符
代 碼
|
代表的格式
|
例 子
|
AM、PM
|
上午、下午
|
08 AM
|
D
|
數字表示的星期(1~7)
|
1,2,3,4,5,6,7
|
DD
|
數字表示月中的日期(1~31)
|
1,2,3,…,31
|
MM
|
兩位數的月份
|
01,02,…,12
|
Y、YY、YYY、YYYY
|
年份的后幾位
|
3,03,003,2003
|
RR
|
解決Y2K問題的年度轉換
|
|
DY
|
簡寫的星期名
|
MON,TUE,FRI,…
|
DAY
|
全拼的星期名
|
MONDAY,TUESDAY,…
|
MON
|
簡寫的月份名
|
JAN,FEB,MAR,…
|
MONTH
|
全拼的月份名
|
JANUARY,FEBRUARY,…
|
HH、HH12
|
12小時制的小時(1~12)
|
1,2,3,…,12
|
HH24
|
24小時制的小時(0~23)
|
0,1,2,…,23
|
MI
|
分(0~59)
|
0,1,2,…,59
|
SS
|
秒(0~59)
|
0,1,2,…,59
|
,./-;:
|
原樣顯示的標點符號
|
|
'TEXT'
|
引號中的文本原樣顯示
|
TEXT
|
查詢中插入中文的年月日,其中原樣顯示部分區別于外層的單引號,需要用雙引號引起。
SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;
執行結果為:
TO_CHAR(SYSDAT
-------------------------
2003年11月18日
說明:雙引號中的中文字“年”、“月”、“日”原樣顯示,單引號為字符串的界定標記,區別于雙引號,不能混淆。
對于數字型的日期格式,可以用數字或全拼格式顯示,即在格式字符后面添加TH或SP。TH代表序列,SP代表全拼。
SELECT SYSDATE,to_char(SYSDATE,'yyyysp'),to_char(SYSDATE,'mmspth'),
to_char(SYSDATE,'ddth') FROM dual;
執行結果為:
SYSDATE TO_CHAR(SYSDATE,'YYYYSP') TO_CHAR( TO_C
------------- -------------------------------------------------------------- --------------- --------
07-2月 -04 two thousand four second 07th
說明:“two thousand four”為全拼表示的2004年;“second”為全拼序列表示的2月;“07th”為用序列表示的7號。
數值轉換符
代 碼
|
代表的格式
|
例 子
|
9
|
代表一位數字,如果是正數,前面是空格,如果是負數,前面是-號
|
9999
|
0
|
代表一位數字,在相應的位置上如果沒有數字則出現0
|
0000
|
,
|
逗號,用作組分隔符
|
99,999
|
.
|
小數點,分隔整數和小數
|
999.9
|
$
|
$貨幣符號
|
$999.9
|
L
|
本地貨幣符號
|
L999.99
|
FM
|
去掉前后的空格
|
FM999.99
|
EEEE
|
科學計數法
|
9.9EEEE
|
S
|
負數符號−放在開頭
|
S999.9
|
如果實際位數超過5位,則會填充為#號。
SQL> select to_char(1212121.2121,'99.99') from dual;
TO_CHA
------
######
其他常用函數
函 數
|
功 能
|
實 例
|
結 果
|
nvl
|
空值轉換函數
|
nvl(null, '空')
|
空
|
decode
|
實現分支功能
|
decode(1,1, '男',?2, '女')
|
男
|
userenv
|
返回環境信息
|
userenv('LANGUAGE')
|
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
|
greatest
|
返回參數的最大值
|
greatest(20,35,18,9)
|
35
|
least
|
返回參數的最小值
|
least(20,35,18,9)
|
9
|
在ASCII碼表中,排在后邊的字符大,小寫字母排在大寫字母之后。字符串的比較原則是,先比較第一位,如果相同,則繼續比較第二位,依此類推,直到出現大小關系。
常用的組函數
函 數
|
說 明
|
AVG
|
求平均值
|
COUNT
|
求計數值,返回非空行數,*表示返回所有行
|
MAX
|
求最大值
|
MIN
|
求最小值
|
SUM
|
求和
|
STDDEV
|
求標準偏差,是根據差的平方根得到的
|
VARIANCE
|
求統計方差
|
分組函數中SUM和AVG只應用于數值型的列,MAX、MIN和COUNT可以應用于字符、數值和日期類型的列。組函數忽略列的空值。
使用GROUP BY 從句可以對數據進行分組。所謂分組,就是按照列的相同內容,將記錄劃分成組,對組可以應用組函數。
如果不使用分組,將對整個表或滿足條件的記錄應用組函數。
在組函數中可使用DISTINCT或ALL關鍵字。ALL表示對所有非NULL值(可重復)進行運算(COUNT除外)。DISTINCT 表示對每一個非NULL值,如果存在重復值,則組函數只運算一次。如果不指明上述關鍵字,默認為ALL。
在查詢列中,不能使用分組列以外的其他列,否則會產生錯誤信息。
HAVING從句過濾分組后的結果,它只能出現在GROUP BY從句之后,而WHERE從句要出現在GROUP BY從句之前。
HAVING從句的限定條件中要出現組函數。如果同時使用WHERE條件,則WHERE條件在分組之前執行,HAVING條件在分組后執行。
子查詢一般出現在SELECT語句的WHERE子句中,Oracle也支持在FROM或HAVING子句中出現子查詢。子查詢比主查詢先執行,結果作為主查詢的條件,在書寫上要用圓括號擴起來,并放在比較運算符的右側。子查詢可以嵌套使用,最里層的查詢最先執行。子查詢可以在SELECT、INSERT、UPDATE、DELETE等語句中使用。
多列子查詢
如果子查詢返回多列,則對應的比較條件中也應該出現多列,這種查詢稱為多列子查詢。以下是多列子查詢的訓練實例。
查詢職務和部門與SCOTT相同的雇員的信息。
執行以下查詢:
SELECT empno, ename, sal FROM emp
WHERE (job,deptno) =(SELECT job,deptno FROM emp WHERE empno=7788);
集合運算操作
操 作
|
描 述
|
UNION
|
并集,合并兩個操作的結果,去掉重復的部分
|
UNION ALL
|
并集,合并兩個操作的結果,保留重復的部分
|
MINUS
|
差集,從前面的操作結果中去掉與后面操作結果相同的部分
|
INTERSECT
|
交集,取兩個操作結果中相同的部分
|
查詢部門10和部門20的所有職務。
執行以下查詢:
SELECT job FROM emp WHERE deptno=10
UNION(UNION ALL" MINUS" MINUS" INTERSECT)
SELECT job FROM emp WHERE deptno=20;