附錄:
1、SQL 簡(jiǎn)介
2、SQL 操作符
3、Oracle 常用數(shù)據(jù)類型
4、Oracle 函數(shù)
5、[轉(zhuǎn)] Oracle 常用SQL語法
字符串函數(shù)
LENGTH() 字符長(zhǎng)度
LENTTHB() 字節(jié)長(zhǎng)度;一個(gè)漢字內(nèi)存中占用 2字節(jié)
LTRIM、RTRIM、TRIM
截串
SUBSTR(表達(dá)式,位置,長(zhǎng)度)
Oracle 無左右取串函數(shù),但可以使用變通方式完成。
左取串: SUBSTR('abcdefg', 1, 3)
右取串: SUBSTR('abcedfg', LENGTH('abcdefg')-3+1, 3)
時(shí)間函數(shù)
sysdate、current_day
設(shè)置時(shí)間格式: ALERT SESSION SET NLS_DATE_FORMAT = 'dd-mon-yyyy HH:mi:ss'
求時(shí)間: NEXT_DAY(sysdate, '星期三')
轉(zhuǎn)換函數(shù)
TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss')
TO_DATE('12-3月-04')
TO_NUMBER('333') 必須是能轉(zhuǎn)換
TO_TIMESTAMP('2007-10-10 00:00:00.0', 'yyyy-mm-dd hh24:mi:ssxff') 轉(zhuǎn)換為時(shí)間戳格式
聚合函數(shù)
count(*) :查詢表行數(shù)
count(column) :查詢列行數(shù),會(huì)忽略空值,注意
ps.聚合函數(shù)不能做為 where 里查詢條件出現(xiàn)(因?yàn)榫酆鲜菍?duì)所有查詢結(jié)果的運(yùn)算?)
其他函數(shù)
USER:當(dāng)前用戶
SUM(DECODE(SEX, '男', 1, 0)) 篩選出行被為男的記錄 并加1
SUM(DECODE(SEX, '女', 1, 0)) 篩選出行被為女的記錄 并加1
NVL(a2, '非輸入') 布爾值判斷,利用系統(tǒng)對(duì)空值進(jìn)行處理
SELECT DISTINCT a1 FROM aa
表連接
內(nèi)連接:查詢時(shí),把能夠公共匹配的數(shù)據(jù)完全查詢出來。
FROM e, d WHERE e.id = d.id
標(biāo)準(zhǔn): FROM e JOIN d ON e.id = d.id
外連接:不完全匹配
左連接: FROM e JOIN d ON e.id = d.id(+)
左邊數(shù)據(jù)全部顯示,右邊匹配不上的部分用空值代替
右連接: FROM e JOIN d ON e.id(+) = d.id
(同理左連接)
子查詢
無關(guān)子查詢
相關(guān)子查詢
EXISTS(): 根據(jù)子查詢返回是否存在數(shù)據(jù)來決定父查詢。
UNION: 將多個(gè)查詢出來的信息行整合成一個(gè)結(jié)果集。
SELECT eid, ename FROM e
UNION
SELECT id, name FROM d
ps.UNION 查詢出來的重復(fù)記錄不會(huì)顯示,UNION ALL 則顯示全部(包括重復(fù)的)。
INTERSECT: 返回查詢出來信息行的交集,Oracle 獨(dú)有。
利用查詢結(jié)果批量更新:
INSERT INTO e(eid, ename) SELECT id, name FROM d
或者利用查詢結(jié)果創(chuàng)建新表:
CREATE TABLE ttt AS ttt (SELECT * FROM e)
附加:

1、SQL 簡(jiǎn)介
SQL 簡(jiǎn)介
SQL (Structured Query Language,結(jié)構(gòu)化查詢語言)支持如下類別命令:
數(shù)據(jù)定義語言:CREATE(創(chuàng)建)、ALTER(更改)、TRUNCATE(截?cái)啵?/span>DROP(刪除)命令。
數(shù)據(jù)操縱語言:INSERT(插入)、SELECT(選擇)、DELETE(刪除)、UPDATE(修改)命令。
事務(wù)控制語言:COMMIT(提交)、SAVEPOINT(保存點(diǎn))、ROLLBACK(回滾)命令。
數(shù)據(jù)控制語言:GRANT(授予)、REVOKE(回收)命令。
特點(diǎn):
1、非過程語言,它同時(shí)可以訪問多條記錄。
2、所有關(guān)系型數(shù)據(jù)庫(kù)的通用型語言,可移植性強(qiáng)。
3、對(duì)于數(shù)據(jù)和對(duì)象的操作簡(jiǎn)單。
數(shù)據(jù)定義語言
用于改變數(shù)據(jù)庫(kù)結(jié)構(gòu),包括創(chuàng)建、修改和刪除數(shù)據(jù)庫(kù)對(duì)象。
1、CREATE TABLE 創(chuàng)建表
CREATE TABLE [schema.]table
(columname datetype [,
.]);
.表名的最大長(zhǎng)度為30個(gè)字符;
.表名首字母為字母,可以用下劃線、數(shù)字和字母,但不能使用空格和單引號(hào);
.同一用戶模式下的不同表不能有相同的名稱;
.表名、列名、用戶名、和其他對(duì)象名不區(qū)分大小寫,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換成大寫。
2、ALTER TABLE 修改表
ALTER TABLE <tablename>
MODIFY (column definition
);
ADD (column definition
);
DROP COLUMN column;
3、TRUNCATE TABLE 截取表
TRUNCATE TABLE <tablename>;
快速刪除記錄并釋放空間,不使用事務(wù)處理,無法回滾,效率高。
DESC <tablename> 查看表結(jié)構(gòu)
4、DROP TABLE 刪除表
DROP TABLE <tablename>
數(shù)據(jù)操縱語言
DISTINCT 防止選擇重復(fù)的行。
事務(wù)控制語言
COMMIT 提交并結(jié)束事務(wù)處理。
SAVEPOINT 保存點(diǎn),將很長(zhǎng)的事務(wù)處理劃分為較小的部分,用于標(biāo)記事務(wù)中可以應(yīng)用回滾的點(diǎn)。
ROLLBACK 用來撤銷在當(dāng)前的事務(wù)中已完成的操作。可以回滾整個(gè)事務(wù)處理;也可以將事務(wù)回滾到某個(gè)保存點(diǎn)。
UPDATE xxx;
SAVEPOINT mark1;
DELETE FROM xxx;
SAVEPOINT mark2;
ROLLBACK TO SAVEPOINT mark1;
COMMIT;
數(shù)據(jù)控制語言
為用戶提供權(quán)限控制命令。
授予對(duì)象權(quán)限
GRANT SELECT,UPDATE ON order_master
TO MARTIN;
取消對(duì)象權(quán)限
REVOKE SELECT,UPDATE ON order_master
FROM MARTIN;

2、SQL 操作符
SQL 操作符
算術(shù)操作符
算術(shù)表達(dá)式有 NUMBER 數(shù)據(jù)類型的列名、數(shù)值常量和連接它們的算術(shù)操作符組成。(+ - * /)
比較操作符
用于比較兩個(gè)表達(dá)式的值。
=、!=、<、>、<=、>=、BETWEEN
AND (檢查是否在兩個(gè)值之間)
[NOT] IN(與列表中的值匹配)
[NOT] LIKE(匹配字符模式, * _ 通配符)
[NOT] IS NULL(檢查是否為空)
邏輯操作符
用于組合生成一個(gè)真或假的結(jié)果。AND OR NOT
集合操作符
集合操作符將兩個(gè)查詢的結(jié)果組合成一個(gè)結(jié)果集合。
UNION(聯(lián)合) 返回兩個(gè)查詢選定不重復(fù)的行。(刪除重復(fù)的行)
UNION ALL(聯(lián)合所有) 合并兩個(gè)查詢選定的所有行,包括重復(fù)的行。
INTERSECT(交集) 只返回兩個(gè)查詢都有的行。
MINUS(減集) 在第一個(gè)查詢結(jié)果中排除第二個(gè)查詢結(jié)果中出現(xiàn)的行。 (第一 -- 第二)
使用集合操作符連接起來的 SELECT 語句中的列應(yīng)遵循以下規(guī)則:
.通過集合操作連接的各個(gè)查詢相同列數(shù),匹配列的數(shù)據(jù)類型;
.這種查詢不應(yīng)含有 LONG 類型的列;
.列標(biāo)題來自第一個(gè) SELECT 語句。
SELECT orderno FROM order_master
UNION
SELECT orderno FROM order_detail;
連接操作符 (||)
用于將兩個(gè)或者多個(gè)字符串合并成一個(gè)字符串,或者將一個(gè)字符串與一個(gè)數(shù)值合并在一起。
SELECT ('供應(yīng)商'|| venname || '的地址是' || venaddress)
FROM vendor_master

3、Oracle 常用數(shù)據(jù)類型
Oracle 常用數(shù)據(jù)類型
1、字符數(shù)據(jù)類型
CHAR 固定長(zhǎng)度字符串 長(zhǎng)度 1~2000個(gè)字節(jié),未指定則默認(rèn)為 1字節(jié)
VARCHAR2 可變長(zhǎng)度字符串 長(zhǎng)度 1~4000個(gè)字節(jié),定義時(shí)必須指定大小
LONG 可變長(zhǎng)度字符串 最多能存儲(chǔ) 2GB,存儲(chǔ)超過 VARCHAR2 的長(zhǎng)文本信息
ps.一個(gè)表中只有一列為 LONG 數(shù)據(jù)類型,
.LONG 列不能建立索引,
.存儲(chǔ)過程不能接受 LONG 數(shù)據(jù)類型的參數(shù)
2、數(shù)值數(shù)據(jù)類型
NUMBER 數(shù)據(jù)類型可以存儲(chǔ) 正數(shù)、負(fù)數(shù)、零、定點(diǎn)數(shù)(不帶小數(shù)點(diǎn)的?)和精度為38為的浮點(diǎn)數(shù)。
格式: NUMBER [(precision 精度,數(shù)字總位數(shù) 1~38間
, scale 范圍,小數(shù)點(diǎn)右邊的位數(shù) -84~127間)]
3、時(shí)期時(shí)間數(shù)據(jù)類型
DATE 數(shù)據(jù)類型,用于存儲(chǔ)表中日期和時(shí)間數(shù)據(jù)。SYSDATE 函數(shù)功能就是返回當(dāng)前的日期和時(shí)間。
TIMESTAMP 數(shù)據(jù)類型,存儲(chǔ)時(shí)期、時(shí)間和時(shí)區(qū)信息。SYSTIMEATAMP 功能就是返回當(dāng)前日期、時(shí)間和時(shí)區(qū)。
4、二進(jìn)制數(shù)據(jù)類型
RAW 二進(jìn)制數(shù)據(jù)或字節(jié)串 長(zhǎng)度 1~2000 字節(jié),定義時(shí)應(yīng)指定大小,可建索引
LONG RAW 可變長(zhǎng)度的二進(jìn)制數(shù)據(jù) 最大能存儲(chǔ) 2GB,限制等同于 LONG 數(shù)據(jù)類型
5、LOB 數(shù)據(jù)類型
“大對(duì)象”數(shù)據(jù)類型,最多可存儲(chǔ)多達(dá) 4GB的信息。LOB 可以是外部的,也可以是內(nèi)部的,取決于相對(duì)于數(shù)據(jù)庫(kù)位置。
CLOB Character LOB 存儲(chǔ)大量的字符數(shù)據(jù)
BLOB Binary LOB 存儲(chǔ)大量的二進(jìn)制對(duì)象(多媒體對(duì)象等)
BFILE Binary FIle 能夠?qū)⒍M(jìn)制文件存儲(chǔ)在數(shù)據(jù)庫(kù)外部的操作系統(tǒng)文件中
BFILE 存儲(chǔ)一個(gè) BFILE 定位器,它指向位于服務(wù)器文件系統(tǒng)上的二進(jìn)制文件。
ps.一個(gè)表中可以有多個(gè) LOB 列,每個(gè) LOB 列可以是不同的 LOB 類型。
6、偽列
Oracle 中的一個(gè)表列,但實(shí)際上未存儲(chǔ)表中。可以從表中查詢,但是不能插入,更新或者刪除。
ROWID 返回行記錄的行地址,通常情況下,ROWID 值可以唯一地標(biāo)識(shí)數(shù)據(jù)庫(kù)中的一行。
作用: .能最快形式訪問表中的一行。
.能顯示表中的行是如何存儲(chǔ)的。
.可以作為表中行的唯一標(biāo)識(shí)。
例:SELECT ROWID, * FROM EMP WHERE empno='7900';
ROWNUM 返回一個(gè)數(shù)值單表行的次序,第一行為1,第二行為2
.
通過使用 ROWNUM 用戶可以限制查詢返回的行數(shù)(或者分頁(yè)?)
例:SELECT * FROM EMP WHERE ROWNUM <= 10;

4、Oracle 函數(shù)
Oracle 函數(shù)
函數(shù)接受一個(gè)或多個(gè)參數(shù)并返回一個(gè)值。
單行函數(shù)
也稱標(biāo)量函數(shù),對(duì)于從表中查詢的每一行,該函數(shù)都返回一個(gè)值。
單行函數(shù)出現(xiàn)在 SLEECT / WHERE 子句中。
1、日期函數(shù)
對(duì)日期值進(jìn)行運(yùn)算,根據(jù)用途產(chǎn)生日期/數(shù)值類型的結(jié)果。
ADD_MONTHS(d, n) 返回 指定日期加上月數(shù)后的 日期值
MONTHS_BETWEEN(d1, d2) 返回 兩個(gè)日期間的 月數(shù)
LAST_DAY(d) 返回 指定日期當(dāng)前的最后一天的 日期值
RONUD(d,[fmt]) 返回 指定日期四舍五入格式(YEAR、MONTH、DAY)后的 日期值
NEXT_DAY(d,day) 返回 指定日期下一個(gè)星期幾的 日期值
TRUNC(d,[fnt]) 返回 指定日期截?cái)酁楦袷胶蟮?nbsp;日期值
EXTRACT(fmt FROM d) 返回 指定日期提取的格式的 值
2、字符函數(shù)
字符函數(shù)接受字符輸入,并返回字符或數(shù)值。
INITCAP(char) 首字母大寫
LOWER(char) 轉(zhuǎn)換為小寫
UPPER(char) 轉(zhuǎn)換為大寫
LTRIM(char, set) 左裁切
RTRIM(char, set) 右裁切
TRANSLATE(char, from, to) 按字母翻譯
REPLACE(char, search_str, replace_str) 字符串替換
INSTR(char, substr[,pos]) 查找子串位置
SUBSTR(char, pos, len) 取子字符串
CONCAT(char1, char2) 連接字符串
CHR(ascii) 根據(jù) ASCII 碼返回對(duì)應(yīng)字符串
LPAD / RPAD 左 / 右 填充
LPAD ('function', 15 , '=') 返回 '=======function'
TRAM 開頭或結(jié)尾(或 開頭和結(jié)尾)裁剪特定的字符,默認(rèn)裁剪空格。
TRIM ([LEADING | TRAILING] trim_char)
LENGTH(char) 返回字符串長(zhǎng)度
DECODE 逐個(gè)值進(jìn)行字符串替換
DECODE (expr, search1, result1, search2, result2, 
[ ,default])
DECODE (ostalus, 'p', '準(zhǔn)備處理', 'c', '已完成')
3、數(shù)字函數(shù)
數(shù)字函數(shù)接受數(shù)字輸入并返回?cái)?shù)值作為輸出結(jié)果。
ABS(n) 取絕對(duì)值
CEIL(n) 向上取值
FLOOR(n) 向下去整
SIN(n) 正弦值
COS(n) 余弦值
POWER(m, n) 指數(shù)函數(shù)
SQRT(n) 平方根
MOD(m, n) 取余
ROUND(m, n) 小數(shù)點(diǎn)后精度四舍五入
TRUNC(m, n) 小數(shù)點(diǎn)后精度截?cái)?br />
4、轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。
TO_CHAR (d|n, [,fmt]) 格式化 日期 / 數(shù)值
TO_DATE (char [,fmt]) 將 fmt模型格式的字符串 轉(zhuǎn)換為日期型
TO_NUMBER (char) 將 包含數(shù)字的的字符串轉(zhuǎn)換為 數(shù)值型
5、其他函數(shù)
NVL (exp, exp2) 如果 exp 為空返回 exp2;如果非空返回 exp
NVL2 (exp, exp2, exp3) 如果 exp 為空返回 exp3;如果非空返回 exp2
NULLIF (exp1, exp2) 比較兩表達(dá)式,相等返回空值,不等則返回 exp1
分組函數(shù) / 聚合函數(shù)
分組函數(shù)基于一組行返回結(jié)果,即為每一組行返回單個(gè)值。
AVG (columname) 返回指定列的平均值
MAX (columname) 返回指定列的最大值
MIN (columname) 返回指定列的最小值
SUM (columname) 返回指定列的總值
COUNT
COUNT (*) 統(tǒng)計(jì)所有行個(gè)數(shù),包括重復(fù)行和空值得行
COUNT (columname) 統(tǒng)計(jì)指定列非空值的個(gè)行數(shù)
COUNT (DISTINCR columname) 統(tǒng)計(jì)指定列中 非重復(fù),非空值得行個(gè)數(shù)
GROUP BY 子句
用于將信息表劃分為組,對(duì)查詢結(jié)果按組進(jìn)行聚合運(yùn)算,為每組返回一個(gè)結(jié)果。
HAVING 子句
用來指定 GROUP BY 子句的檢索條件。
分析函數(shù)
分析函數(shù)根據(jù)一組行來計(jì)算聚合值。這些函數(shù)通常用來完成對(duì)聚集的累積排名、移動(dòng)平均數(shù)和報(bào)表計(jì)算。
分析函數(shù)與聚合函數(shù)不同的是他們?yōu)槊拷M記錄返回多個(gè)行。
ROW_NUMBER () OVER ([PARTITION BY colum] ORDER BY colum)
為有序組中的每一行返回一個(gè)唯一的排序值,序號(hào)由 ORDER BY 子句指定,從 1 開始,即使具有相等的值,排位也不同。
PARTITION BY colum 按列值進(jìn)行區(qū)分,各分組內(nèi)在進(jìn)行排序。
RANK () OVER ([PARTITION BY colum] ORDER BY colum)
計(jì)算一個(gè)值在一個(gè)組中的地位,由 1 開頭,具有相等值得行排位相同,序數(shù)隨后跳躍相應(yīng)的數(shù)值。
DENSE_RANK () OVER ([PARTITION BY colum] ORDER BY colum)
計(jì)算一個(gè)值在一個(gè)組中的地位,由 1 開頭,具有相等值得行排位相同,并且排位是連續(xù)的。
5、[轉(zhuǎn)] Oracle 常用SQL語法和數(shù)據(jù)對(duì)象

數(shù)據(jù)控制(DML)
=============================================================================================
一.數(shù)據(jù)控制語句 (DML) 部分
=============================================================================================
1.INSERT (往數(shù)據(jù)表里插入記錄的語句)
INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……);
INSERT INTO 表名(字段名1, 字段名2, ……) SELECT 字段名1, 字段名2, …… FROM 另外的表名;
字符串類型的字段值必須用單引號(hào)括起來, 例如: ’GOOD DAY’
如果字段值里包含單引號(hào)’ 需要進(jìn)行字符串轉(zhuǎn)換, 我們把它替換成兩個(gè)單引號(hào)''.
字符串類型的字段值超過定義的長(zhǎng)度會(huì)出錯(cuò), 最好在插入前進(jìn)行長(zhǎng)度校驗(yàn).
日期字段的字段值可以用當(dāng)前數(shù)據(jù)庫(kù)的系統(tǒng)時(shí)間SYSDATE, 精確到秒
或者用字符串轉(zhuǎn)換成日期型函數(shù)TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.
年-月-日 小時(shí):分鐘:秒 的格式Y(jié)YYY-MM-DD HH24:MI:SS
INSERT時(shí)最大可操作的字符串長(zhǎng)度小于等于4000個(gè)單字節(jié), 如果要插入更長(zhǎng)的字符串, 請(qǐng)考慮字段用CLOB類型,
方法借用ORACLE里自帶的DBMS_LOB程序包.
INSERT時(shí)如果要用到從1開始自動(dòng)增長(zhǎng)的序列號(hào), 應(yīng)該先建立一個(gè)序列號(hào)
CREATE SEQUENCE 序列號(hào)的名稱 (最好是表名+序列號(hào)標(biāo)記) INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長(zhǎng)度來定, 如果定義的自動(dòng)增長(zhǎng)的序列號(hào) NUMBER(6) , 最大值為999999
INSERT 語句插入這個(gè)字段值為: 序列號(hào)的名稱.NEXTVAL
------------------------------------------------------------------
2.DELETE (刪除數(shù)據(jù)表里記錄的語句)
DELETE FROM表名 WHERE 條件;
注意:刪除記錄并不能釋放ORACLE里被占用的數(shù)據(jù)塊表空間. 它只把那些被刪除的數(shù)據(jù)塊標(biāo)成unused.
如果確實(shí)要?jiǎng)h除一個(gè)大表里的全部記錄, 可以用 TRUNCATE 命令, 它可以釋放占用的數(shù)據(jù)塊表空間
TRUNCATE TABLE 表名;
此操作不可回退.
------------------------------------------------------------------
3.UPDATE (修改數(shù)據(jù)表里記錄的語句)
UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 條件;
如果修改的值N沒有賦值或定義時(shí), 將把原來的記錄內(nèi)容清為NULL, 最好在修改前進(jìn)行非空校驗(yàn);
值N超過定義的長(zhǎng)度會(huì)出錯(cuò), 最好在插入前進(jìn)行長(zhǎng)度校驗(yàn)..
------------------------------------------------------------------
注意事項(xiàng):
A. 以上SQL語句對(duì)表都加上了行級(jí)鎖,
確認(rèn)完成后, 必須加上事物處理結(jié)束的命令 COMMIT 才能正式生效,
否則改變不一定寫入數(shù)據(jù)庫(kù)里.
如果想撤回這些操作, 可以用命令 ROLLBACK 復(fù)原.
B. 在運(yùn)行INSERT, DELETE 和 UPDATE 語句前最好估算一下可能操作的記錄范圍,
應(yīng)該把它限定在較小 (一萬條記錄) 范圍內(nèi),. 否則ORACLE處理這個(gè)事物用到很大的回退段.
程序響應(yīng)慢甚至失去響應(yīng). 如果記錄數(shù)上十萬以上這些操作, 可以把這些SQL語句分段分次完成,
其間加上COMMIT 確認(rèn)事物處理.
=============================================================================================
二.數(shù)據(jù)定義 (DDL) 部分
=============================================================================================
1.CREATE (創(chuàng)建表, 索引, 視圖, 同義詞, 過程, 函數(shù), 數(shù)據(jù)庫(kù)鏈接等)
ORACLE常用的字段類型有
CHAR 固定長(zhǎng)度的字符串
VARCHAR2 可變長(zhǎng)度的字符串
NUMBER(M,N) 數(shù)字型M是位數(shù)總長(zhǎng)度, N是小數(shù)的長(zhǎng)度
DATE 日期類型
創(chuàng)建表時(shí)要把較小的不為空的字段放在前面, 可能為空的字段放在后面
創(chuàng)建表時(shí)可以用中文的字段名, 但最好還是用英文的字段名
創(chuàng)建表時(shí)可以給字段加上默認(rèn)值, 例如 DEFAULT SYSDATE
這樣每次插入和修改時(shí), 不用程序操作這個(gè)字段都能得到動(dòng)作的時(shí)間
創(chuàng)建表時(shí)可以給字段加上約束條件
例如 不允許重復(fù) UNIQUE, 關(guān)鍵字 PRIMARY KEY
------------------------------------------------------------------
2.ALTER (改變表, 索引, 視圖等)
改變表的名稱
ALTER TABLE 表名1 TO 表名2;
在表的后面增加一個(gè)字段
ALTER TABLE表名 ADD 字段名 字段名描述;
修改表里字段的定義描述
ALTER TABLE表名 MODIFY字段名 字段名描述;
給表里的字段加上約束條件
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (字段名);
把表放在或取出數(shù)據(jù)庫(kù)的內(nèi)存區(qū)
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
------------------------------------------------------------------
3.DROP (刪除表, 索引, 視圖, 同義詞, 過程, 函數(shù), 數(shù)據(jù)庫(kù)鏈接等)
刪除表和它所有的約束條件
DROP TABLE 表名 CASCADE CONSTRAINTS;
------------------------------------------------------------------
4.TRUNCATE (清空表里的所有記錄, 保留表的結(jié)構(gòu))
TRUNCATE 表名;
=============================================================================================
三.查詢語句 (SELECT) 部分
=============================================================================================
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 條件;
字段名可以帶入函數(shù)
例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名),
TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS')
---------------------------------------------------------------
NVL(EXPR1, EXPR2)函數(shù)
解釋:
IF EXPR1=NULL
RETURN EXPR2
ELSE
RETURN EXPR1
---------------------------------------------------------------
DECODE(AA﹐V1﹐R1﹐V2﹐R2
.)函數(shù)
解釋:
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
---------------------------------------------------------------
LPAD(char1,n,char2)函數(shù)
解釋:
字符char1按制定的位數(shù)n顯示,不足的位數(shù)用char2字符串替換左邊的空位
---------------------------------------------------------------
字段名之間可以進(jìn)行算術(shù)運(yùn)算
例如: (字段名1*字段名1)/3
---------------------------------------------------------------
查詢語句可以嵌套
例如: SELECT …… FROM
(SELECT …… FROM表名1, [表名2, ……] WHERE 條件) WHERE 條件2;
---------------------------------------------------------------
兩個(gè)查詢語句的結(jié)果可以做集合操作
例如: 并集 UNION (去掉重復(fù)記錄),
并集 UNION ALL(不去掉重復(fù)記錄),
差集 MINUS,
交集 INTERSECT
----------------------------------------------------------------
分組查詢
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1
[HAVING 條件] ;
兩個(gè)以上表之間的連接查詢
SELECT 字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名
[ AND ……] ;
SELECT字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名(+)
[ AND ……] ;
有(+)號(hào)的字段位置自動(dòng)補(bǔ)空值
----------------------------------------------------------
查詢結(jié)果集的排序操作, 默認(rèn)的排序是升序ASC, 降序是DESC
SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……]
ORDER BY字段名1, 字段名2 DESC;
----------------------------------------------------------
字符串模糊比較的方法
INSTR(字段名, ‘字符串’)>0
字段名 LIKE ‘字符串%’ [‘%字符串%’]
每個(gè)表都有一個(gè)隱含的字段ROWID, 它標(biāo)記著記錄的唯一性.
=============================================================================================
四.ORACLE里常用的數(shù)據(jù)對(duì)象 (SCHEMA)
=============================================================================================
1.索引 (INDEX)
CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] );
ALTER INDEX 索引名 REBUILD;
一個(gè)表的索引最好不要超過三個(gè) (特殊的大表除外), 最好用單字段索引, 結(jié)合SQL語句的分析執(zhí)行情況,
也可以建立多字段的組合索引和基于函數(shù)的索引
ORACLE8.1.7字符串可以索引的最大長(zhǎng)度為1578 單字節(jié)
ORACLE8.0.6字符串可以索引的最大長(zhǎng)度為758 單字節(jié)
ORACLE DOC上說字符串最大可以建索引的長(zhǎng)度約是:數(shù)據(jù)塊的大小(db_block_size)*40%
----------------------------------------------------------------
2.視圖 (VIEW)
CREATE VIEW 視圖名AS SELECT …. FROM …..;
ALTER VIEW視圖名 COMPILE;
視圖僅是一個(gè)SQL查詢語句, 它可以把表之間復(fù)雜的關(guān)系簡(jiǎn)潔化.
----------------------------------------------------------------
3.同義詞 (SYNONMY)
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名@數(shù)據(jù)庫(kù)鏈接名;
----------------------------------------------------------------
4.數(shù)據(jù)庫(kù)鏈接 (DATABASE LINK)
CREATE DATABASE LINK數(shù)據(jù)庫(kù)鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING ‘數(shù)據(jù)庫(kù)連接字符串’;
數(shù)據(jù)庫(kù)連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定義.
數(shù)據(jù)庫(kù)參數(shù)global_name=true時(shí)要求數(shù)據(jù)庫(kù)鏈接名稱跟遠(yuǎn)端數(shù)據(jù)庫(kù)名稱一樣
數(shù)據(jù)庫(kù)全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查詢遠(yuǎn)端數(shù)據(jù)庫(kù)里的表
SELECT …… FROM 表名@數(shù)據(jù)庫(kù)鏈接名;
=============================================================================================
五.權(quán)限管理 (DCL) 語句
=============================================================================================
1.GRANT 賦于權(quán)限
常用的系統(tǒng)權(quán)限集合有以下三個(gè):
CONNECT(基本的連接), RESOURCE(程序開發(fā)), DBA(數(shù)據(jù)庫(kù)管理)
常用的數(shù)據(jù)對(duì)象權(quán)限有以下五個(gè):
ALL ON 數(shù)據(jù)對(duì)象名, SELECT ON 數(shù)據(jù)對(duì)象名, UPDATE ON 數(shù)據(jù)對(duì)象名,
DELETE ON 數(shù)據(jù)對(duì)象名, INSERT ON 數(shù)據(jù)對(duì)象名, ALTER ON 數(shù)據(jù)對(duì)象名
GRANT CONNECT, RESOURCE TO 用戶名;
GRANT SELECT ON 表名 TO 用戶名;
GRANT SELECT, INSERT, DELETE ON表名 TO 用戶名1, 用戶名2;
-------------------------------------------------------------------
2.REVOKE 回收權(quán)限
REVOKE CONNECT, RESOURCE FROM 用戶名;
REVOKE SELECT ON 表名 FROM 用戶名;
REVOKE SELECT, INSERT, DELETE ON表名 FROM 用戶名1, 用戶名2;
=============================================================================================
*********************************************************************************************
=============================================================================================

數(shù)據(jù)定義(DDL)
=============================================================================================
二.數(shù)據(jù)定義 (DDL) 部分
=============================================================================================
1.CREATE (創(chuàng)建表, 索引, 視圖, 同義詞, 過程, 函數(shù), 數(shù)據(jù)庫(kù)鏈接等)
ORACLE常用的字段類型有
CHAR 固定長(zhǎng)度的字符串
VARCHAR2 可變長(zhǎng)度的字符串
NUMBER(M,N) 數(shù)字型M是位數(shù)總長(zhǎng)度, N是小數(shù)的長(zhǎng)度
DATE 日期類型
創(chuàng)建表時(shí)要把較小的不為空的字段放在前面, 可能為空的字段放在后面
創(chuàng)建表時(shí)可以用中文的字段名, 但最好還是用英文的字段名
創(chuàng)建表時(shí)可以給字段加上默認(rèn)值, 例如 DEFAULT SYSDATE
這樣每次插入和修改時(shí), 不用程序操作這個(gè)字段都能得到動(dòng)作的時(shí)間
創(chuàng)建表時(shí)可以給字段加上約束條件
例如 不允許重復(fù) UNIQUE, 關(guān)鍵字 PRIMARY KEY
------------------------------------------------------------------
2.ALTER (改變表, 索引, 視圖等)
改變表的名稱
ALTER TABLE 表名1 TO 表名2;
在表的后面增加一個(gè)字段
ALTER TABLE表名 ADD 字段名 字段名描述;
修改表里字段的定義描述
ALTER TABLE表名 MODIFY字段名 字段名描述;
給表里的字段加上約束條件
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (字段名);
把表放在或取出數(shù)據(jù)庫(kù)的內(nèi)存區(qū)
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
------------------------------------------------------------------
3.DROP (刪除表, 索引, 視圖, 同義詞, 過程, 函數(shù), 數(shù)據(jù)庫(kù)鏈接等)
刪除表和它所有的約束條件
DROP TABLE 表名 CASCADE CONSTRAINTS;
------------------------------------------------------------------
4.TRUNCATE (清空表里的所有記錄, 保留表的結(jié)構(gòu))
TRUNCATE 表名;
=============================================================================================
*********************************************************************************************
=============================================================================================

查詢語句(SELECT)
================================================================================
三.查詢語句 (SELECT) 部分
================================================================================
SELECT 字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
WHERE 條件;
--------------------------
字段名可以帶入函數(shù)
例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名),
TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS')
------------------------------
NVL(EXPR1, EXPR2)函數(shù)
解釋:
IF EXPR1=NULL
RETURN EXPR2
ELSE
RETURN EXPR1
------------------------------
DECODE(AA﹐V1﹐R1﹐V2﹐R2
.)函數(shù)
解釋:
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
------------------------------
LPAD(char1,n,char2)函數(shù)
解釋:
字符char1按制定的位數(shù)n顯示,不足的位數(shù)用char2字符串替換左邊的空位
------------------------------
字段名之間可以進(jìn)行算術(shù)運(yùn)算
例如: (字段名1*字段名1)/3
===============================================================
查詢語句可以嵌套
---------------------
例如:
SELECT …… FROM
(
SELECT ……
FROM表名1, [表名2, ……]
WHERE 條件1
)
WHERE 條件2;
===============================================================
兩個(gè)查詢語句的結(jié)果可以做集合操作
--------------------------------
例如: 并集 UNION (去掉重復(fù)記錄),
并集 UNION ALL(不去掉重復(fù)記錄),
差集 MINUS,
交集 INTERSECT
===============================================================
分組查詢
------------
SELECT 字段名1, 字段名2, ……
FROM 表名1, 表名2, ……
GROUP BY 字段名1
HAVING 條件
===============================================================
兩個(gè)以上表之間的連接查詢
-----------------------
SELECT 字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名
[ AND ……] ;
SELECT 字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名(+)
[ AND ……] ;
有(+)號(hào)的字段位置自動(dòng)補(bǔ)空值
===============================================================
查詢結(jié)果集的排序操作, 默認(rèn)的排序是升序ASC, 降序是DESC
----------------------------------------------------
SELECT 字段名1, 字段名2, ……
FROM 表名1, [表名2, ……]
ORDER BY 字段名1, 字段名2 DESC;
===============================================================
字符串模糊比較的方法
----------------------
INSTR(字段名, ‘字符串’)>0
字段名 LIKE ‘字符串%’ [‘%字符串%’]
----------------------------------------------------------------
每個(gè)表都有一個(gè)隱含的字段ROWID, 它標(biāo)記著記錄的唯一性.
=============================================================================================
*********************************************************************************************
=============================================================================================

ORACLE里常用的數(shù)據(jù)對(duì)象
=============================================================================================
四.ORACLE里常用的數(shù)據(jù)對(duì)象 (SCHEMA)
=============================================================================================
1.索引 (INDEX)
CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] );
ALTER INDEX 索引名 REBUILD;
一個(gè)表的索引最好不要超過三個(gè) (特殊的大表除外), 最好用單字段索引, 結(jié)合SQL語句的分析執(zhí)行情況,
也可以建立多字段的組合索引和基于函數(shù)的索引
ORACLE8.1.7字符串可以索引的最大長(zhǎng)度為1578 單字節(jié)
ORACLE8.0.6字符串可以索引的最大長(zhǎng)度為758 單字節(jié)
ORACLE DOC上說字符串最大可以建索引的長(zhǎng)度約是:數(shù)據(jù)塊的大小(db_block_size)*40%
---------------------------------------------------------------------------------------
----------------------------------------------------------------
2.視圖 (VIEW)
CREATE VIEW 視圖名AS SELECT …. FROM …..;
ALTER VIEW視圖名 COMPILE;
視圖僅是一個(gè)SQL查詢語句, 它可以把表之間復(fù)雜的關(guān)系簡(jiǎn)潔化.
----------------------------------------------------------------
3.同義詞 (SYNONMY)
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名@數(shù)據(jù)庫(kù)鏈接名;
----------------------------------------------------------------
4.數(shù)據(jù)庫(kù)鏈接 (DATABASE LINK)
CREATE DATABASE LINK數(shù)據(jù)庫(kù)鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING ‘數(shù)據(jù)庫(kù)連接字符串’;
數(shù)據(jù)庫(kù)連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定義.
數(shù)據(jù)庫(kù)參數(shù)global_name=true時(shí)要求數(shù)據(jù)庫(kù)鏈接名稱跟遠(yuǎn)端數(shù)據(jù)庫(kù)名稱一樣
數(shù)據(jù)庫(kù)全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查詢遠(yuǎn)端數(shù)據(jù)庫(kù)里的表
SELECT …… FROM 表名@數(shù)據(jù)庫(kù)鏈接名;
=============================================================================================
*********************************************************************************************
=============================================================================================

權(quán)限管理(DCL)
=============================================================================================
五.權(quán)限管理 (DCL) 語句
=============================================================================================
1.GRANT 賦于權(quán)限
常用的系統(tǒng)權(quán)限集合有以下三個(gè):
CONNECT(基本的連接), RESOURCE(程序開發(fā)), DBA(數(shù)據(jù)庫(kù)管理)
常用的數(shù)據(jù)對(duì)象權(quán)限有以下五個(gè):
ALL ON 數(shù)據(jù)對(duì)象名, SELECT ON 數(shù)據(jù)對(duì)象名, UPDATE ON 數(shù)據(jù)對(duì)象名,
DELETE ON 數(shù)據(jù)對(duì)象名, INSERT ON 數(shù)據(jù)對(duì)象名, ALTER ON 數(shù)據(jù)對(duì)象名
GRANT CONNECT, RESOURCE TO 用戶名;
GRANT SELECT ON 表名 TO 用戶名;
GRANT SELECT, INSERT, DELETE ON表名 TO 用戶名1, 用戶名2;
-------------------------------------------------------------------
2.REVOKE 回收權(quán)限
REVOKE CONNECT, RESOURCE FROM 用戶名;
REVOKE SELECT ON 表名 FROM 用戶名;
REVOKE SELECT, INSERT, DELETE ON表名 FROM 用戶名1, 用戶名2;
=============================================================================================
*********************************************************************************************
=============================================================================================
--------------------------------------------------------------------------------

簡(jiǎn)單查詢
=====================================================================
使用表達(dá)式
=====================================================================
Select ename || ' 是一位 ' || job As 雇員細(xì)節(jié),
to_char(hiredate,'yyyy-mm-dd') As 雇傭時(shí)間,
sal*1.2
From emp;
=====================================================================
取消重復(fù)行 distinct
=====================================================================
Select Distinct deptno, job From emp;
=====================================================================
指定列排序 order by
=====================================================================
asc 升序,desc 降序
--------------------------------------------
Select * From emp
where sal between 1500 and 3000
Order By deptno Desc,ename;
--------------------------------------------
如果使用dsitinct,排序列必須是選擇列
---------------------------
select distinct depton, job
from emp
order by job;
---------------------------------------------
order by 子句必須是最后一個(gè)子句
=====================================================================
=====================================================================

分組查詢語句
============================================================
分組查詢語句
============================================================
1。組處理函數(shù)不能出現(xiàn)在 where 子句中
2。選擇列表中的列、表達(dá)式,必須出現(xiàn)在 group by 子句中
3。組處理函數(shù)中可以指定 all 和 distinct
============================================================
分組函數(shù)
---------------------------------------
select avg(sal) as avg1,
avg(distinct sal) as avg2,
max(sal) as max,
min(sal) as min,
sum(sal) as sum,
count(*) as cnt1,
count(sal) as cnt2,
count(distinct sal) as cnt3
from emp
where deptno = 30;
============================================================
單列分組
---------------------------------------------
select deptno, avg(sal), max(sal) from emp
group by deptno;
select deptno, avg(sal), max(sal) from emp
group by deptno
order by avg(sal);
============================================================
多列分組
---------------------------------------------
select deptno, job, avg(sal), max(sal), from emp
group by deptno, job;
============================================================
============================================================
rollup 用于生成橫向統(tǒng)計(jì)信息
--------------------------
Select deptno, job, Avg(sal), Max(sal) From emp
Group By rollup(deptno,job)
--------------------------------------------------
cube 用于生產(chǎn)縱向統(tǒng)計(jì)信息
------------------------------
Select deptno, job, Avg(sal), Max(sal) From emp
Group By Cube(deptno,job)
============================================================
having 子句
============================================================
select deptno, avg(sal), max(sal) from emp
group by deptno
having avg(sal) > 2000;
============================================================
============================================================

連接查詢
===========================================================
不等連接
----------------------------
Select e.ename, e.sal, s.grade
From emp e,salgrade s
Where e.sal Between s.losal And s.hisal
And e.deptno = 30
===========================================================
自連接
---------------------------------------
Select e.ename As 雇員, p.ename As 管理員
From emp e,emp p
Where e.mgr = p.empno
And e.deptno = 30
===========================================================
合并查詢
===========================================================
union --- 兩個(gè)集合的并集,去掉重復(fù)行,按第一列結(jié)構(gòu)排序
-------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Union
Select empno, ename, mgr From emp
Where job = 'MANAGER'
===========================================================
union all --- 兩個(gè)集合并集,不去重復(fù)行,不排序
-------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Union All
Select empno, ename, mgr From emp
Where job = 'MANAGER'
===========================================================
Intersect --- 只會(huì)顯示同時(shí)存在兩個(gè)集合中的數(shù)據(jù)
-----------------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Intersect
Select empno, ename, mgr From emp
Where job = 'MANAGER'
===========================================================
minus --- 在一個(gè)集合存在,在第二個(gè)集合不存在的數(shù)據(jù),按第一個(gè)排序
-----------------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Minus
Select empno, ename, mgr From emp
Where job = 'MANAGER'
===========================================================
合并查詢中,只能有一個(gè) order by 子句。在這個(gè)子句中使用列名或
第一個(gè)查詢的別名。
--------------------------------------
Select empno, ename 雇員, mgr From emp
Where deptno = 30
Minus
Select empno, ename 雇員, mgr From emp
Where job = 'MANAGER'
Order By 雇員
===========================================================
===========================================================

子查詢
============================================================
單行子查詢
------------------------------
Select ename, deptno, sal From emp
Where sal = (Select Max(sal) From emp);
============================================================
多行子查詢 --- where子句中使用多行子查詢,必須使用多行運(yùn)算符,
(in,notin,exists,not exists,all,any)
---------------------------------------------------
Select ename, deptno, sal, job From emp
Where job In ( Select Distinct job From emp Where deptno = 20 )
------------------------------------------------------------
Select e.ename, e.job, e.sal
From emp e
Where sal > All ( Select sal From emp Where emp.deptno = 20)
------------------------------------------------------------
Select e.ename, e.job, e.sal
From emp e
Where sal > Any ( Select sal From emp Where emp.deptno = 20)
============================================================
相關(guān)子查詢
------------------------------
Select deptno,
( Select Max(sal) From emp b Where b.deptno = a.deptno ) maxsal
From emp a
Order By deptno
------------------------------
Select ename, deptno, sal, job From emp
Where Exists
(
Select 'x' From dept
Where dept.deptno = emp.deptno And dept.loc = 'NEW YORK'
)
============================================================
標(biāo)量子查詢 --- 顯示每個(gè)部門的最高工資員工信息
-----------------------
select distinct deptno,
(select max(sal) from emp b where b.deptno = a.deptno) maxsal
from emp a
order by deptno;
============================================================
多列子查詢 --- 顯示與smith部門和崗位完全相同的所有雇員信息。
-----------------------
Select ename, deptno, sal, job From emp
Where (deptno, job) =
(Select deptno, job From emp Where ename = 'SMITH')
-----------------------
顯示崗位或者管理員匹配于部門編號(hào)為20的所有雇員信息.
-----------------------
Select ename, deptno, sal, job, mgr From emp
Where job In ( Select job From emp Where deptno = 20 )
Or mgr In ( Select mgr From emp Where deptno = 20 )
Order By deptno
============================================================

DDL,DML 中的子查詢
========================================================
DDL 中使用子查詢
========================================================
create table 語句中的子查詢
--------------------------
create table dept1 (deptno, dname, loc) as
select deptno, dname, loc from dept;
create table emp1 as
select * from emp;
========================================================
create view 中使用子查詢
-----------------------
create or replace view dept_20 as
select * from emp1 where deptno = 20 order by empno;
========================================================
DML 中使用子查詢
========================================================
update 語句中使用子查詢
-----------------------
update emp1 set (sal,comm) =
( select sal, comm from emp1 where ename = 'WARD' )
where job = ( select job from emp1 where ename= 'WARD' )
========================================================
delete 語句中使用子查詢
-----------------------
delete from emp1
where deptno = (select deptno from dept1 where dname = 'ACCOUNTING' )
========================================================
insert 語句中使用子查詢
-----------------------
insert into emp1
select * from emp
where deptno = (select deptno from where dname = 'ACCOUNTING')
========================================================
-----------------------------------------------------------------------------------

SQL 語句分析
============================================================
基礎(chǔ)查詢分類
============================================================
基本查詢 --- 所有列、指定列、where子句、order by子句
---------------------------------------------------
分組查詢 --- 組處理函數(shù)、group by子句、having子句
---------------------------------------------------
連接查詢 --- 相等連接、不等連接、自我連接
============================================================
============================================================
合并查詢 --- UNION,UNION ALL,INTERSECT,MINUS
-----------------------------------------------------
子查詢 --- 單行、多行、相關(guān)、標(biāo)量、多列、DDL中、DML中
============================================================
============================================================
1。order by 子句必須放在最后。
2。組處理函數(shù)只能出現(xiàn)在選擇列表、order by子句、having子句中,
不能出現(xiàn)在where子句和group by子句中。
3。在選擇列表中包含的列、表達(dá)式,則一定要出現(xiàn)在group by子句中。
4。where子句中可以使用單行子查詢,可以使用單行運(yùn)算符。
( =,>,<,>=,<=,<> )
5。where子句中可以使用多行子查詢,可以使用多行運(yùn)算符。
( in,not in,exists,not exists,all,any )
============================================================

SQL 優(yōu)化法則
===================================================================================
基本的Sql編寫注意事項(xiàng)
---------------------
1。盡量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
2。不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代。
3。Oracle在執(zhí)行IN子查詢時(shí),首先執(zhí)行子查詢,將查詢結(jié)果放入臨時(shí)表再執(zhí)行主查詢。
而EXIST則是首先檢查主查詢,然后運(yùn)行子查詢直到找到第一個(gè)匹配項(xiàng)。
NOT EXISTS 比 NOT IN 效率稍高。但具體在選擇IN或EXIST操作時(shí),
要根據(jù)主子表數(shù)據(jù)量大小來具體考慮。
4。不用“<>”或者“!=”操作符。對(duì)不等于操作符的處理會(huì)造成全表掃描,
可以用“<” or “>”代替。
5。Where子句中出現(xiàn)IS NULL或者IS NOT NULL時(shí),Oracle會(huì)停止使用索引而執(zhí)行全表掃描。
可以考慮在設(shè)計(jì)表時(shí),對(duì)索引列設(shè)置為NOT NULL。這樣就可以用其他操作來取代判斷NULL的操作。
6。當(dāng)通配符“%”或者“_”作為查詢字符串的第一個(gè)字符時(shí),索引不會(huì)被使用。
7。對(duì)于有連接的列“||”,最后一個(gè)連接列索引會(huì)無效。盡量避免連接,
可以分開連接或者使用不作用在列上的函數(shù)替代。
8。如果索引不是基于函數(shù)的,那么當(dāng)在Where子句中對(duì)索引列使用函數(shù)時(shí),索引不再起作用。
9。Where子句中避免在索引列上使用計(jì)算,否則將導(dǎo)致索引失效而進(jìn)行全表掃描。
10。對(duì)數(shù)據(jù)類型不同的列進(jìn)行比較時(shí),會(huì)使索引失效。
11。用“>=”替代“>”。
12。UNION操作符會(huì)對(duì)結(jié)果進(jìn)行篩選,消除重復(fù),數(shù)據(jù)量大的情況下可能會(huì)引起磁盤排序。
如果不需要?jiǎng)h除重復(fù)記錄,應(yīng)該使用UNION ALL。
13。Oracle從下到上處理Where子句中多個(gè)查詢條件,所以表連接語句應(yīng)寫在其他Where條件前,
可以過濾掉最大數(shù)量記錄的條件必須寫在Where子句的末尾。
14。Oracle從右到左處理From子句中的表名,所以在From子句中包含多個(gè)表的情況下,
將記錄最少的表放在最后。
15。Order By語句中的非索引列會(huì)降低性能,可以通過添加索引的方式處理。
嚴(yán)格控制在Order By語句中使用表達(dá)式。
16。不同區(qū)域出現(xiàn)的相同的Sql語句,要保證查詢字符完全相同,以利用SGA共享池,
防止相同的Sql語句被多次分析。
17。當(dāng)在Sql語句中連接多個(gè)表時(shí),使用表的別名,并將之作為每列的前綴。這樣可以減少解析時(shí)間。
======================================================================================
我們可以總結(jié)一下可能引起全表掃描的操作:
------------------------------------------
1。在索引列上使用NOT或者“<>”;
2。對(duì)索引列使用函數(shù)或者計(jì)算;
3。NOT IN操作;
4。通配符位于查詢字符串的第一個(gè)字符;
5。IS NULL或者IS NOT NULL;
6。多列索引,但它的第一個(gè)列并沒有被Where子句引用;
======================================================================================
posted on 2008-10-16 23:34
黃小二 閱讀(39876)
評(píng)論(0) 編輯 收藏 所屬分類:
[DB].Oracle