Oracle 第1章 Oracle入门
Oracle 第3章 锁、表分区
Oracle 第2章 Oracle查询、数据类型、函数
注意:本章提供Oracle SQL帮助文档(PDF)下载
1、技术目标
- 了解 Oracle 数据类型
- 了解数据定义语言和数据操纵语言
- 了解事务控制语言和数据控制语言
- 掌握 SQL 操作符和 SQL 函数
2、SQL简介
- SQL(Structured Query Language)是指结构化查询语言
- SQL是基于数据库的语言,由IBM在二十世纪七十年代初开发用于控制关系型数据库,Oracle公司实现的SQL完全符合ANSI标准的SQL语言,Oracle使用SQL存储和检索信息
- SQL是一种非过程语言,用于查询、添加、删除以及修改数据和对象的命令非常简单
- SQL是所有关系型数据库的通用语言
Oralce用户通过SQL与Oralce的交互,如图:
SQL 支持下列类别的命令:
- 数据定义语言(DDL)
- 数据操纵语言(DML)
- 事务控制语言(TCL)
- 数据控制语言(DCL)
2.1)DDL(Data Definition Language)包含的指令如下,
- CREATE : 在数据库中创建新的数据对象
- ALTER : 修改数据库中对象的数据结构
- DROP : 删除数据库中的对象
- DISABLE/ENABLE TRIGGER : 修改触发器的状态
- UPDATE STATISTIC : 更新表/视图统计信息
- TRUNCATE TABLE : 清空表中数据
- COMMENT : 给数据对象添加注释
- RENAME : 更改数据对象名称
2.2)DML(Data Manipulation Language)包含的指令如下,
- INSERT :将数据插入到表或视图
- DELETE :从表或视图删除数据
- SELECT :从表或视图中获取数据,例如:
使用1: 利用现有的表创建表,语法:
CREATE TABLE 新表名 ASSELECT 列名 FROM 原表名;
使用2: 选择无重复的行,用DISTINCT关键字,语法:
SELECT DISTINCT 列名 FROM 表名;
使用3: 查询中为列取别名,使用AS关键字,语法:
SELECT 列名 AS 列别名 FROM 表名;
- UPDATE :更新表或视图中的数据
- MERGE : 对数据进行合并操作(插入/更新/删除)
2.3)TCL(Transaction Control Language)
事务是最小的工作单元,作为一个整体进行工作保证事务的整体成功或失败,
称为事务控制,包含的指令如下,
- COMMIT : 提交并结束事务处理
- SAVEPOINT : 标记事务中可以回滚的点
- ROLLBACK : 撤销事务中已完成的工作
- SET TRANSACTION : 设置事务选项
使用: 设置事务以及回滚点
--执行修改操作
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)包含的指令如下,
- GRANT : 赋予用户某种控制权限
- REVOKE :取消用户某种控制权限
3、Oracle 数据类型
用户创建表时,必须为各个列指定数据类型
以下是 Oracle 数据类型的类别:
- 字符类型
- 数值类型
- 日期时间类型
- RAW和LONG RAW类型
- LOB类型
4、字符类型有3种
4.1)CHAR 类型
- 当需要固定长度的字符串时,使用 CHAR 数据类型。
- CHAR 数据类型存储字母数字值。
- CHAR 数据类型的列长度可以是 1 到 2000 个字节
- 如果输入的值小于指定长度,则用空格填充至固定长度
- 如果输入的值大于指定长度,则返回错误报告
4.2)VARCHAR2 类型
- VARCHAR2数据类型支持可变长度字符串
- VARCHAR2数据类型存储字母数字值
- VARCHAR2数据类型的大小在1至4000个字节范围内
与CHAR类型相比,VARCHAR可节省存储空间 ,如某
列为VARCHAR2类型,大小为50字节,用户输入20个
字节的字符,则最终其长度只有20个字节,而CHAR将
占50字节,剩余部分采用空格填充
4.3)LONG 类型
- LONG 数据类型存储可变长度字符数据
- LONG 数据类型最多能存储 2GB
该类型主要用于存储超过VARCHAR2存储容量的长文本
信息,其长度受磁盘可用存储空间的限制,使用LONG类
型还需要遵守如下规则:
- 一个表中只能有一列可以是LONG类型
- LONG类型的列不能使用唯一约束或主键约束
- LONG类型的列不能建立索引
- 存储过程或过程不能接受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类型的数据可以使用如下方式:
- 使用SQL数据操作语言
- 使用PL/SQL提供的程序包DBMS_LOB
一个表中可以有多列为LOB类型 ,这多列的LOB可以是不同的LOB类型,Oracle
提供了3种LOB类型,分别是:
- CLOB
- BLOB
- BFILE
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)
- UNION运算符返回两个查询选定的所有不重复的行
- UNION ALL运算符合并两个查询选定的所有行,包括重复的行
- INTERSECT运算符只返回两个查询的公共行
- MINUS 操作符返回从第一个查询结果中排除第二个查询中出现的行
集合操作符将两个查询结果合成一个结果,使用集合运算符需遵守如下规则 :
- 通过集合运算符连接的各查询具有相同的列数且对应列的类型必须相同
- 查询中不应含有LONG类型的列
- 列标题来自第一个select语句
使用: 查询订单表的订单号,排除订单明细中已有的订单号:
SELECT orderNo FROM orderMaster
MINUS SELECT orderno FROM orderDetail;
10.5)连接运算符 :||
用于将两个或多个字符串合并 成一个字符串 ,或者将一个字符串
与一个数值合并在一起,通过使用连接操作符可以将表中的多个
列合并成逻辑上的一个列,例如:
SELECT (venName || ' 的地址是 ' || venadd1 || ' ' || venadd2 || ' '
||venadd3) address FROM vendorMaster WHERE vencode='V001';
11、操作符的优先级
优先级从上往下递减:
- 算术操作符 -------->最高优先级
- 连接操作符
- 比较操作符
- NOT 逻辑操作符
- AND 逻辑操作符
- OR 逻辑操作符 -------->最低优先级
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)分组函数,又称为聚合函数
- avg ,求平均值
- max ,求最大值
- sum ,求总和
- count(*) ,统计行总数,包括重复值和空值的行
- count(列名) ,统计行总数,不包括空值的行
- count(distinct 列名) ,与count(列名)相似,不过在统计时去除重复值
12.3)分析函数
分析函数根据一组行来计算聚合值,这些函数通常用来完成对聚合值的累计排
名、移动平均数和报表等计算,在使用分析函数之前,需要完成所有的连接以
及所有的where、group by、having子句,因此分析函数只能出现在select列
表或order by子句中,介绍几个分析函数如下,
- ROW_NUMBER 返回连续的排位,不论值是否相等
- RANK 具有相等值的行排位相同,序数随后跳跃
- DENSE_RANK 具有相等值的行排位相同,序号是连续的
其具体用法可参考"Oracle SQL帮助文档"
13、总结
- SQL是通用的数据库语言
- SQL命令可分为数据定义语言、数据操纵语言、事务控制语言和数据控制语言
- Oracle支持的数据类型包括字符、数值、日期时间、RAW 和 LOB 等
- SQL支持的操作符包括算术、比较、逻辑、集合和连接操作符
- SQL函数可大致分为单行函数、聚合函数和分析函数
Oracle 第1章 Oracle入门
Oracle 第3章 锁、表分区