温习 SQL 01(Z)

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 .

image

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个月,是一个线或段, 而储存时间值,是某一个点。

时区介绍 : 全球共分为24个时区 , 每个时区占经度15度 , 以本初子午线为中央经线的时区为 零 时区 , 由零时区向东 , 向西各分为12 时区 . 地球是自西向东转动 , 东边比西边先看到太阳 , 东边的时间比西边早 , 每个相领时区相差1个小时 , 但是有的国家为了时间统一 , 不是按照时区作为时间基础 , 例如 : 中国以北京 ( 东8区 ) 作为统一时间 . ( 本初子午线时区为标准时间 , 其余的时区参考这个时间 , 例如 : 本初的时间为 0 时 , 东一区 时间为 -1 , 西一区时间为 1 , 12, 11,10,9,8,7,6,5,4,3,2,1, 0 , -1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12 。所以中间的时间为基准时间 ( standard time ) 其他的是参考时间 ( reference time ) 中间基准时间又叫 GMT = UTC ( 0 度经线 ) .

10. 利用查询语句创建一个 table

create table as select * from employees;

原文地址:https://www.cnblogs.com/moveofgod/p/2766460.html