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;