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;