1. Oracle中的函数
函数可以进行组合,如:select name UPPER(SUBSTR(name, 2, 8)) ...
1) 单行函数
字符函数、数字函数、转换函数、日期函数、正则表达式函数(10g)
转换函数就是从一种类型转换为另一种数据类型的函数。
2) 聚合函数
聚合函数同时对一组行进行操作,对每组行返回一行输出结果。
AVG/COUNT/MAX/MEDIAN/MIN/STDDEV/SUM/VARIANCE
2. 日期时间的存储与处理
可以由DATE类型存储时间值。
使用时间戳(timestamp),时间戳可以存储一个特定的日期和时间。与DATE相比,它的优点是可以存储带有小数位的秒,以及能存储时区。
使用时间间隔(interval),可以存储时间的长度。
TO_DATE()和TO_CHAR()可在时间值和字符串之间进行转换。
TO_CHAR(x [, format]) TO_DATE(x [, format]) format为格式控制
时间值函数:
ADDMONTH(x, y)
LAST_DAY(x)
MONTHS_BETWEEN(x,y)
ROUND(x [, unit])
SYSDATE()
TRUNC(x[, unit])
与时区有关的函数:
CURRENT_DATE()
DBTIMEZONE()
NEW_TIME(x, time_zone1, time_zone2)
SESSIONTIMEZONE()
TZ_OFFSET(time_zone)
与时间戳相关的也有一些函数,如CURRENT_TIMESTAMP()等。
时间间隔也有几个相应的函数。
3. SQL*Plus的使用
命令:a c clbuff del l r / x等来编辑操作缓冲区命令等。
保存、检索、运行:SAVE GET START @filename ED SPOOL SPOOL OFF
格式化列:COLUMN 清除列格式:COLUMN CLEAR
设置页面大小:SET PAGESIZE
设置行大小:SET LINESIZE
使用变量
临时变量
使用字符 & 来定义临时变量。sql语句中包含变量时,如果执行该语句,就会提示为该变量输入一个值。
关于变量的一些控制命令:
SET VERIFY OFF|ON
SET DEFINE '#'
已定义变量
可以在sql语句中多次使用已定义变量,直到显示地将其删除、重定义或退出SQL*Plus
使用DEFINE定义查看变量。(UNDEFINE删除)
如:DEFINE product_id_var = 7
ACCEPT也可以定义变量,不过要等待用户的输入。
可以用SQL*Plus创建简单报表。
在脚本中可以通过 $1 $2 等来引用传给脚本的参数。
TTITLE BTITLE可以用来添加页眉页脚。
自动生成SQL语句。通过输出固定格式的查询结果,这样的结果就是可以直接使用的SQL语句。
4. 高级查询
DECODE(value, search_value, result, default_value)
value与search_value进行比较,如果这两个值相等,则返回result,否则就返回default_value。 DECODE()允许在SQL中执行if-then-else类型的逻辑处理。
CASE表达式,也可以在SQL中实现if-then-else型的逻辑,工作方式与DECODE类似。
简单CASE表达式:
CASE search_expression
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
ELSE default_result
END
搜索CASE表达式:
CASE
WHEN condition1 THEN result1
...
WHEN conditionN THEN resultN
ELSE default_result
END
在表中可以进行自引用,如:
REFERENCES table_name(name_id)
table_name为自身表明,name_id为表的某列
这样表就是有层次的了,要进行层次化查询,使用CONNECT BY和START WITH
可以使用伪列LEVEL来显示节点在树中的层次。
使用LEVEL和LPAD可以对层次化查询结果进行格式化处理。
ROLLUP,是GROUP BY子句的一种扩展,可以为每个分组返回小计记录。
CUBE,也是GROUP BY子句的扩展,可以返回每一个列组合的小计记录,同时在末尾加上总计记录。
GROUPING()函数,可以接受一列,返回0或1.如果列值为空,那么GROUPING返回1;如果列值非空,则返回0。
GROUPING SET可以只返回小计记录。GROUPING_ID()可以借助HAVING子句对记录进行过滤,将不包含小计或者总计的记录除去。GROUP_ID(),可以用于消除GROUP BY子句返回的重复
记录。
数据库中还有很多分析函数,如评级函数、窗口函数、报表函数等等……
ORACLE 10g 中的MODEL子句可以用来进行行间计算。
5. PL/SQL编程
块结构:
[DECLARE
declaration_statements
]
BEGIN
executable_statements
[EXCEPTION
exception_handling_statements
]
END;
在DECLARE部分可以声明变量、游标等。并且这种变量只能在块内部访问。
EXCEPTION部分是出现异常的时候被执行的代码。
PL/SQL中可以有条件逻辑,如IF、THEN、ELSE、以及ENDIF等关键字。也有FOR和WHILE循环。
游标的声明方法为:
CURSOR cursor_name IS
SELECT_statement;
在执行打开游标操作的时候,就会执行SELECT语句。OPEN cursor_name;
FETCH从游标中取得记录。
FETCH cursor_name
INTO variable[, variable ...];
CLOSE cursor_name;关闭游标。
可以通过CREATE PROCEDURE创建过程。(存储过程)
创建的过程可以被任何能够访问数据库的程序所使用。
可以通过CALL语句来调用过程
函数与过程类似,惟一的区别是函数必须向调用它的语句返回一个值。 存储过程和函数有时合起一被称为存储子程序。
CREATE FUNCTION可以用于创建函数。
调用函数:
SELECT function_name(param)
FROM dual;
包:可以将过程和函数一起组织到包中,包可以将彼此相关的功能划分到一个自包含的单元中。通过这种方式将PL/SQL代码模块化,可以构建供其他编程人员重用的代码库。
CREATE PACKAGE创建包规范。
CREATE PACKAGE BODY创建包体。
用SELECT FROM dual或CALL都可以调用包中的函数或过程,在函数或过程名之前加上包名限定。
包、函数、过程的信息都可以从user_procedures视图中获取。
用DROP能删除创建的包、函数、过程。
触发器:当特定的SQL DML语句,如INSERT、UPDATE、DELETE等在特定的数据库表上运行时,由数据库自动运行的过程。
触发器可以在SQL语句运行之前和之后激活。
语句级触发器,行级触发器。
CREATE TRIGGER创建触发器。
在user_triggers视图中可以获得触发器的信息。
ALTER TRIGGER可以启用或禁用触发器。 DROP TRIGGER可以删除触发器。
6. 数据库对象
CRATE TYPE可以创建对象
对象中可以包含函数,用MEMBER FUNCTION来声明。
DESCRIBE可以获取有关对象类型的信息
在PL/SQL中也可以使用对象
对象类型可以被继承,只要在CREATE TYPE的时候在最后指定 NOT FINAL,即表示可以被继承。
如果某个对象仅用作超类,而且并不实例化,则可用NOT INSTANTIABLE来表示类不可被实例化。
可以自定义构造函数。
7. 集合
oracle8后引入了两种新的数据库类型,称为集合(collection),它允许存储元素集合。
集合类型:
变长数组:一维的,有最大大小,在创建时设置。不过以后可以更改该大小。(CREATE TYPE来创建)
嵌套表:嵌套在另一张表中的表。大小也没有限制。(CREATE TYPE来创建)
关联数组:(10g新增) 关联数组是一个键值对集合。类似于哈希表。(CREATE PROCEDURE来创建)
集合也有一些函数,如COUNT、DELETE、EXISTS、EXTEND、FIRST、LAST、NEXT、PRIOR、TRIM等。
8. 大对象
在Oracle8之前,存储大对象,必须用LONG或LONGRAW(二进制)。
LONG RAW和LONG最多可以存储2GB数据,RAW只能存储4KB二进制数据。
Oracle8之后可以使用大对象,大对象称为LOB,最大可存储128T数据。
LOB的四种类型:
CLOB 字符LOB,用来存储字符
BLOB 二进制LOB,存储二进制
BFILE 存储文件指针,文件位于文件系统中,即位于数据库之外。
NCLOB 国家语言字符的LOB
在插入数据之前,大对象必须被初始化。可用EMPTY_BLOB() EMPTY_CLOB()等来初始化
如:INSERT INTO mytable(id, clob_colom) VALUES ( 1, EMPTY_CLOB() ); 用UPDATE来更新其中的数据。
在使用BFILE之前,要先在数据库中用CREATE DIRECTORY来创建一个目录对象
使用方法:INSERT INTO bfile_content(id, bfile_colom) VALUES (1, BFILENAME('FILES_DIRS', 'text.txt') )
FILES_DIRS即是创建的目录对象
在PL/SQL中使用大对象,有很多函数可以使用,如OPEN、READ、SUBSTR、APPEND、CLOSE等等…
9. SQL优化
1) 使用WHERE子句过滤行
2) 使用表链接而不是多个查询
3) 执行连接时使用完全限定的列引用
4) 使用case表达式,而不是多个查询
5) 添加表索引
6) 使用where而不是HAVING
7) 使用UNION ALL而不是UNION
8) 使用EXISTS而不是IN
9) 使用EXISTS而不是DISTINCT
10) 使用绑定变量