Oracle 第2章 Oracle查询、数据类型、函数
注意:本章提供Oracle SQL帮助文档(PDF)下载
1、技术目标
2、SQL简介
Oralce用户通过SQL与Oralce的交互,如图:
SQL 支持下列类别的命令:
2.1)DDL(Data Definition Language)包含的指令如下,
2.2)DML(Data Manipulation Language)包含的指令如下,
2.3)TCL(Transaction Control Language)
事务是最小的工作单元,作为一个整体进行工作保证事务的整体成功或失败,
称为事务控制,包含的指令如下,
使用: 设置事务以及回滚点
--执行修改操作
UPDATE orderMaster SET delDate='18-5月-08' WHERE orderNo
<= 'O8008';
--设置回滚点1
SAVEPOINT mark1;
DELETE FROM orderMaster WHERE orderNo='O8008';
--设置回滚点2
SAVEPOINT mark2;
--事务回滚到回滚点1
ROLLBACK TO SAVEPOINT mark1;
--提交事务
COMMIT;
2.4)DCL(Data Control Language)包含的指令如下,
3、Oracle 数据类型
用户创建表时,必须为各个列指定数据类型
以下是 Oracle 数据类型的类别:
4、字符类型有3种
4.1)CHAR 类型
4.2)VARCHAR2 类型
与CHAR类型相比,VARCHAR可节省存储空间 ,如某
列为VARCHAR2类型,大小为50字节,用户输入20个
字节的字符,则最终其长度只有20个字节,而CHAR将
占50字节,剩余部分采用空格填充
4.3)LONG 类型
该类型主要用于存储超过VARCHAR2存储容量的长文本
信息,其长度受磁盘可用存储空间的限制,使用LONG类
型还需要遵守如下规则:
5、数值类型 NUMBER
数值类型NUMBER可以存储整数、浮点数和实数,最高精度为 38 位,
数值数据类型的格式为:
NUMBER [( p[, s])]
P表示精度,S表示小数点的位数(-84 ~ 127之间)
使用1: 列名 number,定义38位整数
使用2: 列名 number(位数),定义指定位数的整数
使用3: 列名 number(总位数, 小数位数),定义指定总位数和小数点右端数字位数的浮点数
6、日期时间类型
日期时间数据类型存储日期和时间值,包括年、月、日,小时、分钟、秒
6.1)DATE类型
DATE类型用于存储日期和时间数据,占7个字节固定长度,每个字节
分别存储世纪、年、月、日、小时、分、秒,DATE类型的值从公元
4712年1月1日到公元9999年12月31日,Oracle提供了函数sysdate
可返回当前的日期和时间,
注意:日期数据类型的默认格式为"DD-MON-RR","日-月-年",如
"18-5月-08"表示2008年5月18号
使用1: 添加记录时指定默认日期
INSERT INTO order_master
VALUES('D1008', '18-5月-08', 'X800', 'abc', '25-5月-08');
使用2: 添加记录时使用TO_DATE函数转换日期
INSERT INTO my_table (date_col)
VALUES (TO_DATE('2005-10-18', 'YYYY-MM-DD'));
6.2)TIMESTAMP类型
TIMESTAMP类型用于存储日期的年、月、日以及时间的小时、分和秒值,
其中秒值精确到小数点后6位,该类型同时包含时区信息,Oracle提供函数
systimestamp可返回当前日期、时间和时区
7、RAW和LONG RAW类型
RAW和LONG RAW类型用于存储二进制数据
7.1)RAW类型
RAW数据类型用于存储二进制数据,该类型最多能存储2000个字节,
该类型没有默认大小,使用时需指定大小,RAW类型可建立索引
7.2)LONG RAW类型
LONG RAW类型用于存储可变长度的二进制数据,最多存储2GB,该
类型与LONG数据类型需要遵守的规则一致
8、LOB类型
LOB又称为"大对象 "数据类型,可存储4GB的非结构化信息,比如声音、视频等
,允许对数据进行高效、随机、分段的访问。LOB根据相对于数据库的位置,可
以使外部的或者是内部的,操作LOB类型的数据可以使用如下方式:
一个表中可以有多列为LOB类型 ,这多列的LOB可以是不同的LOB类型,Oracle
提供了3种LOB类型,分别是:
8.1)CLOB(Character LOB,字符LOB)类型
该类型能存储大量字符数据,字符数据可以为单字节字符或者多字节字符,
还可用于存储XML文档数据
8.2)BLOC(Binary LOB,二进制LOB)
该类型可存储较大的二进制数据(图像、音视频等)
8.3)BFILE(Binary File,二进制文件)
该类型能将二进制文件存储在数据库之外的操作系统文件中,表中的BFILE
列则只存储一个BFILE定位器,该定位器指向文件系统中的二进制文件,可
存储的文件最大为4GB
9、Oracle中的伪列
伪列就像表中的一列,该列并未存储在表中,伪列可从表中查询但不能插入、更新、删除其值,伪列有两种,ROWID伪列和ROWNUM伪列
9.1)ROWID伪列:
表的每一行都有一个行地址,ROWID伪列返回该行的地址,
其值可以唯一标识表的行,使用该伪列可定为表中的一行,
可查看ROWID的值:select rowid from 表名;
ROWID伪列伪列还有如下作用:
1.能以最快的方式访问表中的行
2.显示表的行是如何存储的
3.作为表中行的唯一标识
9.2)ROWNUM伪列
ROWNUM伪列返回代表行序号 的值,第一行的ROWNUM为1,第二行为2,
依次类推,使用该伪列可限制查询返回的行数,如使用ROWNUM提取前10
条记录:select * from 表名 where rownum < 11;
10、SQL运算符
Oracle中的运算符分类图:
10.1)算术运算符 包括:(+)、减(-)、乘(*)、除(/)
可以在SQL语句中使用算术表达式,算术表达式由数值数据类型的列名、数值常
量和连接它们的算术操作符组成
10.2)关系运算符 包括:
=、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等,
关系运算符用于比较两个表达式的值
10.3)逻辑运算符 包括:(AND)、或(OR)和非(NOT)
逻辑操作符用于组合多个计较运算的结果以生成一个或真或假的结果
10.4)集合运算符 包括:
联合(UNION)、联合所有(UNION ALL)、交集(INTERSECT)、减集(MINUS)
集合操作符将两个查询结果合成一个结果,使用集合运算符需遵守如下规则 :
使用: 查询订单表的订单号,排除订单明细中已有的订单号:
SELECT orderNo FROM orderMaster
MINUS SELECT orderno FROM orderDetail;
10.5)连接运算符 :||
用于将两个或多个字符串合并 成一个字符串 ,或者将一个字符串
与一个数值合并在一起,通过使用连接操作符可以将表中的多个
列合并成逻辑上的一个列,例如:
SELECT (venName || ' 的地址是 ' || venadd1 || ' ' || venadd2 || ' '
||venadd3) address FROM vendorMaster WHERE vencode='V001';
11、操作符的优先级
优先级从上往下递减:
12、Oracle的SQL函数
Oracle提供了用于执行特定操作的专用函数 ,Oracle的函数
可分为单行函数、分组函数(聚合函数)、分析函数
12.1)单行函数
单行函数又称为"标量函数 ",对于从表中查询的每一行,函数都返回一个值,
单行函数可出现在select、where子句中,单行函数可分为:
1.日期函数:
add_months(日期, 月数)
该函数给指定的日期加上指定的月数
months_between(日期1, 日期2)
该函数返回两个日期间的月数,
如果日期期1晚于日期2为正数,否则为负数,
如果两日期为同月,有如下情况:
1.两日期为该月中的同一天或最后一天,其结果始终为整数
2.非同一天,将根据一月31天计算出小数部分并考虑时间差
last_day(日期)
该函数返回指定日期当月最后一天的日期值
round(日期, [格式])
该函数将日期四舍五入为格式指定的单位,
格式为可选值,日期默认舍入为最靠近的那一天,
如果指定格式为"year"年,则舍入到年的开始(1月1日),
如果格式为"month"月,则舍入到月的第一天,
如果格式为"day"周,则舍入到最靠近的星期天
next_day(日期, 星期几)
该函数返回下一个星期几的日期,
星期几指周内的任何一天,例如:
select next_day(sysdate, '星期三') from dual;
显示出当前日期后的第一个星期三的日期,参数'星期三'
可用整数 4 来表示
注意:dual 关键字用在没有目标表的查询中
2.字符函数:
3.数字函数:
4.转换函数 :将值从一种类型转换为另一种类型
to_char(日期 | 数字 [, 格式])
该函数将日期或数字按指定的格式转换为varchar2类型,如:
select to_char(sysdate, 'YYYY' '年' 'fmMM' '月' 'fmDD' '日'
' HH24:MI:SS ') from dual;
显示结果:xxxx年xx月xx日 xx:xx:xx
x为当前日期的值
to_date(字符串 [, 格式])
该函数将char或varchar类型的日期字符串按指定格式转换为日期类型,
如:select to_date('2008-08-18', 'yyyy-mm-dd') from dual;
显示结果:18-8月-08
to_number(字符串)
该函数将包含数字的字符串转换为number类型,通常不需使用该函数,
Oracle可以对数字字符串进行隐式转换
5.其他函数 ,介绍几个用来转换空值的函数:
注意:NULL值表示空(未知),零值表示0(未知)
nvl(表达式1, 表达式2)
如果表达式1为NULL则返回表达式2,否则返回表达式1,
如果表达式1和2是不同的类型,则将表达式2转换为表达式1的类型
nvl2(表达式1, 表达式2, 表达式3)
如果表达式1不是NULL,则返回表达式2,
如果表达式1是NULL,则返回表达式3
nullif(表达式1, 表达式2)
如果两表达式相等,则返回NULL,否则返回表达式1,该
函数等价于如下的表达式:
case
when 表达式1 = 表达式2
then NULL
else 表达式1
end
12.2)分组函数,又称为聚合函数
12.3)分析函数
分析函数根据一组行来计算聚合值,这些函数通常用来完成对聚合值的累计排
名、移动平均数和报表等计算,在使用分析函数之前,需要完成所有的连接以
及所有的where、group by、having子句,因此分析函数只能出现在select列
表或order by子句中,介绍几个分析函数如下,
其具体用法可参考"Oracle SQL帮助文档"
13、总结