1. 特殊别名 ( 重要指数 * )
当想起的别名中有特殊字符时,要用 “”括起来
select employee_id “#emp_id#”from employees;
2. DINSTINCT ( 重要指数 * )
当使用DISTINCT关键字时,即想要去除重复内容时,distinct一定要放在查询列表中的第一个位置
select distinct first_name, phone_number from employees;
3. escape 用法 ( 重要指数 * )
SELECT *
FROM ZHPPEXP05
WHERE WORK_DATE = '20080104'
AND BUYER2 LIKE 'XAA\_%' ESCAPE '\'
这样以后, _ 只代表普通字符,下划线,而没有特殊意义了。
4. 常用函数 ( 重要指数 ** )
CONCAT, INITCAP, INSTR, LENGTH, LOWER, UPPER, RPAD, LPAD, LTRIM, RTRIM, TRIM, SUBSTR, REPLACE, ABS, CEIL, FLOOR, MOD, ROUND, TRUNC, SIGN, ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, SYSDATE, TO_CHAR, TO_DATE, TO_NUMBER
具体函数内容, 请参阅另一篇, 函数大全。
5. 子查询 ( 重要指数 *** )
返回单值子查询比较符号 ( = , > , < , <> 等等 )
返回多值子查询比较符号( in , Any , All 等等 )
Any ( 同意词 some ) : <ANY means less than the maximum , >ANY means more than the minimum =ANY means IN
<ALL means less than the minimum , >ALL means more than the maximum
子查询: 最容易出现的错误就是返回 NULL , 而进行了相应的判断。
相关子查询
每一次执行,都要执行一遍子查询,而以上标量子查询,总共只需要执行一次子查询。
SELECT column1 , column2
FROM table1 outer --> 有时外部表和内部表是一个表, 所以使用别名好一点 , 必须的用
WHERE column1 operator
( SELECT column1 , column2
FROM table2
WHERE expr1 = outer.expr2 ) ;
使用 EXISTS 关键字 ( 只是逻辑判断,所以速度快,例如子查询可以查出10,000条数据,如果使用 exists的话,那么当发现可以查询到时,就返回。)
SEELCT column1, column2
FROM table1 outer
WHERE exists ( select cola from table2 where expr1 = outer. expr2 ) ;
个人推荐 exists
修改使用子查询
UPDATE table1 别名1
SET column = ( SELECT expression FROM table2 别名2 WHERE 别名1.column = 别名2.column ) ;
删除使用子查询
DELETE FROM table1 别名1
WHERE column operator ( SELECT expression FROM table2 别名2 WHERE 别名1.column = 别名2.column ) ;
6. with 语句 ( 重要指数 * )
当写的query 太长时,可以将部分内容分解,然后用一个标识符将其替代, 这样,整个query看起来就没有那么复杂,类似C中函数分解功能
with
with_plan_qty as ( select plan from zhppexp05 ) ; 这样以后就可以使用 with_plan_qty 来代替括号中的内容。
7. merge ( 重要指数 ** )
merge的作用是,根据不同的条件来判断是进行 insert 操作,还是update操作, 一般是从一个 table | view 复制到另一个 table.
MERGE INTO copy_emp as c
USING employees e
ON ( C.employee_id = e.employee_id )
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT(employee_id, first_name, last_name, department_id)
VALUES(e.employee_id,e.first_name,e.last_name,e.department_id)
注意, merge 最后不需要 ; 分号, 并且 update 和 insert 关键词后每有表明
8. Database transaction
DML , DCL , DDL
数据状态是 , 硬盘database data block保存一份 , 还有 undo segment也保存一份 , 当一个用户改变数据时 , 他可以读data block中的一份,在他没 commit 之前 , 只有他本人可以看到这个数据 , 其他用户查看的是 undo segment中的数据 , 当他 commit 之后 , 其他用户才可以看到data block中的内容, database 并将 undo segment 清空 , 而当用户 rollback 时 , The original , older version , of the data in the undo segment iswritten back to the table . All user can see this existed before the transaction began .

DCL : SAVEPOINT A, SAVEPOINT B , ROLLBACK TO SAVEPOINT A
DML : INSERT 等等
DDL : CREATE TABLE
9. Date类型 & TIMESTAMP
Timestamp类型是指在传统的 date类型下 (最小单位是秒) , 更加精确 , 可以指定精确秒的位数 , 例如 TIMESTAMP(6) 精确到秒后6位
Timestamp主要是应对国际化的要求
oracle 时区分为2部分 : 数据库时区 和 session时区
SELECT DBTIMEZONE FROM DUAL ( 数据库时区 )
SELECT SESSIONTIMEZONE FROM DUAL ( session时区 )
数据类型 : DATE, TIMESTAMP, TIMESTAMP WITH TIMEZONE, TIMESTAMP WITH LOCAL TIMEZONE
DATE类型 : 存储日期和时间,精确到秒
TIMESTAMP : DATE类型的扩展,保留小数级别的秒,默认为小数点后6位,不保存时区和地区信息。
TIMESTAMP WITH TIMEZONE : 带时区的 TIMESTAMP类型
TIMESTAMP WITH LOCAL TIMEZONE: 和 TIMESTAMP WITH TIMEZONE的区别在于,数据库不保存时区信息,而是把客户端输入的事件转换为基于 database timezone 的时间后存入数据库(这也是 database timezone设置的意义 ) 当用户请求时, oracle把数据转为用户所在 session的时区返回给用户,所以,oracle建议吧 database timezone设置为标准时间 UTC, 这样可以节省转换的开销。
如何选择时间数据类型
当你不需要保存时区/地区信息的时候,选择使用TIMESTAMP数据类型,因为它一般需要7-11bytes的存储空间,可以节省空间。
当你需要保存时区/地区信息的时候,请选择使用TIMESTAMP WITH TIMEZONE数据类型。比如一个跨国银行业务应用系统,需要精确纪录每一笔交易的时间和地点(时区),在这种情况下就需要纪录时区相关信息。因为需要纪录时区相关信息,所以需要多一些的存储空间,一般需要13bytes。
当你并不关心操作发生的具体地点,而只是关心操作是在你当前时区的几点发生的时候,选择使用TIMESTAMP WITH LOCALTIME ZONE。比如一个全球统一的change controlsystem。用户可能只关心某某操作是在我的时间几点发生的(比如中国用户看到的是北京时间8:00am,而伦敦的用户看到的是0:00am)。记住,此类行不保存时区/地区信息,因此如果需要保存相关信息的要慎重!
存储时间间隔
interval year to month ( 年和月 )
interval day to second ( 天和秒 )
存储时间间隔,只存储一段时间,例如 1年3个月,是一个线或段, 而储存时间值,是某一个点。