Oracle 筆記(四)、SQL 幾個要點

字符串函數
LENGTH()    字符長度
LENTTHB()    字節長度;一個漢字內存中佔用 2字節

LTRIM、RTRIM、TRIM

截串
SUBSTR(表達式,位置,長度)
Oracle 無左右取串函數,但可以使用變通方式完成。
左取串:    SUBSTR('abcdefg', 1, 3)
右取串:    SUBSTR('abcedfg', LENGTH('abcdefg')-3+1, 3)


時間函數
sysdate、current_day
設置時間格式:    ALERT SESSION SET NLS_DATE_FORMAT = 'dd-mon-yyyy HH:mi:ss'
求時間:        NEXT_DAY(sysdate, '星期三')


轉換函數
TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss')
TO_DATE('12-3月-04')
TO_NUMBER('333')        必須是能轉換
TO_TIMESTAMP('2007-10-10 00:00:00.0', 'yyyy-mm-dd hh24:mi:ssxff')    轉換爲時間戳格式

聚合函數
count(*)    :查詢錶行數
count(column)    :查詢列行數,會忽略空值,注意
ps.聚合函數不能做爲 where 裏查詢條件出現(因爲聚合是對所有查詢結果的運算?)


其他函數
USER:當前用戶
SUM(DECODE(SEX, '男', 1, 0))    篩選出行被爲男的記錄 並加1
SUM(DECODE(SEX, '女', 1, 0))    篩選出行被爲女的記錄 並加1
NVL(a2, '非輸入')        布爾值判斷,利用系統對空值進行處理
SELECT DISTINCT a1 FROM aa   


表連接
內連接:查詢時,把能夠公共匹配的數據完全查詢出來。
    FROM e, d WHERE e.id = d.id
    標準: FROM e JOIN d ON e.id = d.id

外連接:不完全匹配
  左連接:  FROM e JOIN d ON e.id = d.id(+)
    左邊數據全部顯示,右邊匹配不上的部分用空值代替
  右連接:  FROM e JOIN d ON e.id(+) = d.id
    (同理左連接)


子查詢
    無關子查詢
    相關子查詢

EXISTS():    根據子查詢返回是否存在數據來決定父查詢。

UNION:        將多個查詢出來的信息行整合成一個結果集。
  SELECT eid, ename FROM e
  UNION
  SELECT id, name FROM d
  ps.UNION 查詢出來的重複記錄不會顯示,UNION ALL 則顯示全部(包括重複的)。

INTERSECT:    返回查詢出來信息行的交集,Oracle 獨有。

利用查詢結果批量更新:
  INSERT INTO e(eid, ename) SELECT id, name FROM d
或者利用查詢結果創建新表:
  CREATE TABLE ttt AS ttt (SELECT * FROM e)


附加:

1、SQL 簡介
SQL 簡介
SQL (Structured Query Language,結構化查詢語言)支持如下類別命令:
數據定義語言:
CREATE(創建)、ALTER(更改)、TRUNCATE(截斷)、DROP(刪除)命令。
數據操縱語言:
INSERT(插入)、SELECT(選擇)、DELETE(刪除)、UPDATE(修改)命令。
事務控制語言:
COMMIT(提交)、SAVEPOINT(保存點)、ROLLBACK(回滾)命令。
數據控制語言:
GRANT(授予)、REVOKE(回收)命令。

特點:
1、非過程語言,它同時可以訪問多條記錄。
2、所有關係型數據庫的通用型語言,可移植性強。
3、對於數據和對象的操作簡單。


數據定義語言
    用於改變數據庫結構,包括創建、修改和刪除數據庫對象。

1CREATE TABLE 創建表
CREATE TABLE [schema.]table
(columname    datetype 
[.]);

.表名的最大長度爲30個字符;
.表名首字母爲字母,可以用下劃線、數字和字母,但不能使用空格和單引號;
.同一用戶模式下的不同表不能有相同的名稱;
.表名、列名、用戶名、和其他對象名不區分大小寫,系統會自動轉換成大寫。


2ALTER TABLE 修改表
ALTER TABLE <tablename>
    MODIFY (
column definition);
    
ADD (column definition);
    
DROP COLUMN column;

3TRUNCATE TABLE 截取表
TRUNCATE TABLE <tablename>
    快速刪除記錄並釋放空間,不使用事務處理,無法回滾,效率高。

DESC <tablename>  查看錶結構

4DROP TABLE 刪除表
DROP TABLE <tablename>




數據操縱語言
DISTINCT 防止選擇重複的行。



事務控制語言
COMMIT  提交併結束事務處理。
SAVEPOINT  保存點,將很長的事務處理劃分爲較小的部分,用於標記事務中可以應用回滾的點。
ROLLBACK  用來撤銷在當前的事務中已完成的操作。可以回滾整個事務處理;也可以將事務回滾到某個保存點。

UPDATE xxx;
 SAVEPOINT mark1;
DELETE FROM xxx;
 SAVEPOINT mark2;
 
ROLLBACK TO SAVEPOINT mark1;
 
COMMIT;



數據控制語言  
爲用戶提供權限控制命令。

授予對象權限
GRANT SELECT,UPDATE  ON   order_master
  
TO MARTIN;

取消對象權限
REVOKE SELECT,UPDATE  ON  order_master
  
FROM MARTIN;



2、SQL 操作符
SQL 操作符

算術操作符
    算術表達式有 
NUMBER 數據類型的列名、數值常量和連接它們的算術操作符組成。(+ - * /


比較操作符
    用於比較兩個表達式的值。
    
=!=<><=>=BETWEEN  AND (檢查是否在兩個值之間)
    
[NOT] IN(與列表中的值匹配)  
    
[NOT] LIKE(匹配字符模式,  * _  通配符) 
    
[NOT] IS NULL(檢查是否爲空)


邏輯操作符
    用於組合生成一個真或假的結果。
AND OR NOT

集合操作符
    集合操作符將兩個查詢的結果組合成一個結果集合。
    
UNION(聯合)         返回兩個查詢選定不重複的行。(刪除重複的行)
    
UNION ALL(聯合所有)  合併兩個查詢選定的所有行,包括重複的行。
    
INTERSECT(交集)     只返回兩個查詢都有的行。
    MINUS(減集)         在第一個查詢結果中排除第二個查詢結果中出現的行。 (第一 
-- 第二)


使用集合操作符連接起來的 
SELECT 語句中的列應遵循以下規則:
.通過集合操作連接的各個查詢相同列數,匹配列的數據類型;
.這種查詢不應含有 
LONG 類型的列;
.列標題來自第一個 
SELECT 語句。


SELECT orderno FROM order_master
  
UNION 
SELECT orderno FROM order_detail;




連接操作符 (
||
    用於將兩個或者多個字符串合併成一個字符串,或者將一個字符串與一個數值合併在一起。
SELECT ('供應商'|| venname || '的地址是' || venaddress)
  
FROM vendor_master



3、Oracle 常用數據類型
Oracle 常用數據類型

1、字符數據類型
CHAR        固定長度字符串        長度 1~2000個字節,未指定則默認爲 1字節
VARCHAR2    可變長度字符串        長度 1~4000個字節,定義時必須指定大小
LONG        可變長度字符串        最多能存儲 2GB,存儲超過 VARCHAR2 的長文本信息
                    ps.一個表中只有一列爲 
LONG 數據類型,
                      .
LONG 列不能建立索引,
                      .存儲過程不能接受 
LONG 數據類型的參數


2、數值數據類型
NUMBER 數據類型可以存儲 正數、負數、零、定點數(不帶小數點的?)和精度爲38爲的浮點數。
格式: 
NUMBER [(precision 精度,數字總位數 1~38間
        , scale 範圍,小數點右邊的位數 -84~127間)
]


3、時期時間數據類型
DATE 數據類型,用於存儲表中日期和時間數據。SYSDATE 函數功能就是返回當前的日期和時間。
TIMESTAMP 數據類型,存儲時期、時間和時區信息。SYSTIMEATAMP 功能就是返回當前日期、時間和時區。


4、二進制數據類型
RAW        二進制數據或字節串    長度 12000 字節,定義時應指定大小,可建索引
LONG RAW     可變長度的二進制數據    最大能存儲 2GB,限制等同於 LONG 數據類型


5、LOB 數據類型
&#8220;大對象&#8221;數據類型,最多可存儲多達 4GB的信息。LOB 可以是外部的,也可以是內部的,取決於相對於數據庫位置。
CLOB        
Character LOB        存儲大量的字符數據
BLOB        
Binary LOB        存儲大量的二進制對象(多媒體對象等)
BFILE        
Binary FIle        能夠將二進制文件存儲在數據庫外部的操作系統文件中
                    BFILE 存儲一個 BFILE 定位器,它指向位於服務器文件系統上的二進制文件。
ps.一個表中可以有多個 LOB 列,每個 LOB 列可以是不同的 LOB 類型。



6、僞列
Oracle 中的一個表列,但實際上未存儲表中。可以從表中查詢,但是不能插入,更新或者刪除。

ROWID     返回行記錄的行地址,通常情況下,ROWID 值可以唯一地標識數據庫中的一行。
作用:    .能最快形式訪問表中的一行。
    .能顯示錶中的行是如何存儲的。
    .可以作爲表中行的唯一標識。
例:
SELECT ROWID, * FROM EMP  WHERE empno='7900';


ROWNUM    返回一個數值單錶行的次序,第一行爲1,第二行爲2.
    通過使用 ROWNUM 用戶可以限制查詢返回的行數(或者分頁?)
例:
SELECT * FROM EMP WHERE ROWNUM <= 10;



4、Oracle 函數
Oracle 函數
    函數接受一個或多個參數並返回一個值。

單行函數
    也稱標量函數,對於從表中查詢的每一行,該函數都返回一個值。
    單行函數出現在 SLEECT 
/ WHERE 子句中。

1、日期函數
    對日期值進行運算,根據用途產生日期
/數值類型的結果。
ADD_MONTHS(d, n)    返回 指定日期加上月數後的 日期值
MONTHS_BETWEEN(d1, d2)    返回 兩個日期間的 月數
LAST_DAY(d)        返回 指定日期當前的最後一天的 日期值
RONUD(d,
[fmt])        返回 指定日期四捨五入格式(YEARMONTHDAY)後的 日期值
NEXT_DAY(d,
day)        返回 指定日期下一個星期幾的 日期值
TRUNC(d,
[fnt])        返回 指定日期截斷爲格式後的 日期值
EXTRACT(fmt 
FROM d)    返回 指定日期提取的格式的 值 


2、字符函數
    字符函數接受字符輸入,並返回字符或數值。
INITCAP(
char)        首字母大寫
LOWER(char)        轉換爲小寫
UPPER(char)        轉換爲大寫
LTRIM(charset)    左裁切
RTRIM(charset)    右裁切
TRANSLATE(
charfromto)        按字母翻譯
REPLACE(char, search_str, replace_str)    字符串替換
INSTR(
char, substr[,pos])        查找子串位置
SUBSTR(
char, pos, len)            取子字符串
CONCAT(char1, char2)            連接字符串

CHR(
ascii)        根據 ASCII 碼返回對應字符串
LPAD 
/ RPAD        左 / 右 填充
    LPAD (
'function'15 , '=') 返回    '=======function'
TRAM            開頭或結尾(或 開頭和結尾)裁剪特定的字符,默認裁剪空格。
    TRIM (
[LEADING | TRAILING] trim_char)
LENGTH(
char)        返回字符串長度
DECODE            逐個值進行字符串替換
    DECODE (expr, search1, result1, search2, result2, 
[ ,default])
    DECODE (ostalus, 
'p''準備處理''c''已完成')



3、數字函數
    數字函數接受數字輸入並返回數值作爲輸出結果。
ABS(n)        取絕對值
CEIL(n)        向上取值
FLOOR(n)    向下去整
SIN(n)        正弦值
COS(n)        餘弦值
POWER(m, n)    指數函數
SQRT(n)        平方根
MOD(m, n)    取餘
ROUND(m, n)    小數點後精度四捨五入
TRUNC(m, n)    小數點後精度截斷


4、轉換函數
    轉換函數將一種數據類型轉換爲另一種數據類型。
TO_CHAR (d
|n, [,fmt])        格式化 日期 / 數值
TO_DATE (
char [,fmt])        將 fmt模型格式的字符串 轉換爲日期型
TO_NUMBER (
char)        將 包含數字的的字符串轉換爲 數值型


5、其他函數
NVL (
exp, exp2)        如果 exp 爲空返回 exp2;如果非空返回 exp
NVL2 (
exp, exp2, exp3)    如果 exp 爲空返回 exp3;如果非空返回 exp2
NULLIF (exp1, exp2)    比較兩表達式,相等返回空值,不等則返回 exp1





分組函數 
/ 聚合函數
    分組函數基於一組行返回結果,即爲每一組行返回單個值。

AVG (columname)         返回指定列的平均值
MAX (columname)         返回指定列的最大值
MIN (columname)         返回指定列的最小值
SUM (columname)         返回指定列的總值
COUNT    
    
COUNT (*)        統計所有行個數,包括重複行和空值得行
    
COUNT (columname)    統計指定列非空值的個行數
    
COUNT (DISTINCR columname)    統計指定列中 非重複,非空值得行個數    


GROUP BY 子句
    用於將信息表劃分爲組,對查詢結果按組進行聚合運算,爲每組返回一個結果。
HAVING 子句
    用來指定 
GROUP BY 子句的檢索條件。




分析函數
    分析函數根據一組行來計算聚合值。這些函數通常用來完成對聚集的累積排名、移動平均數和報表計算。
    分析函數與聚合函數不同的是他們爲每組記錄返回多個行。

ROW_NUMBER () 
OVER ([PARTITION BY colum] ORDER BY colum)
    爲有序組中的每一行返回一個唯一的排序值,序號由 
ORDER BY 子句指定,從 1 開始,即使具有相等的值,排位也不同。
    PARTITION 
BY colum 按列值進行區分,各分組內在進行排序。

RANK () 
OVER ([PARTITION BY colum] ORDER BY colum)
    計算一個值在一個組中的地位,由 
1 開頭,具有相等值得行排位相同,序數隨後跳躍相應的數值。

DENSE_RANK () 
OVER ([PARTITION BY colum] ORDER BY colum)
    計算一個值在一個組中的地位,由 
1 開頭,具有相等值得行排位相同,並且排位是連續的。


5、[轉] Oracle 常用SQL語法和數據對象

數據控制(DML)
=============================================================================================
                一.數據控制語句 (DML) 部分
=============================================================================================
1.INSERT  (往數據表裏插入記錄的語句)

INSERT INTO 表名(字段名1, 字段名2, &#8230;&#8230;) VALUES ( 值1, 值2, &#8230;&#8230;); 
INSERT INTO 表名(字段名1, 字段名2, &#8230;&#8230;)  SELECT 字段名1, 字段名2, &#8230;&#8230; FROM 另外的表名;

字符串類型的字段值必須用單引號括起來, 例如: &#8217;GOOD 
DAY&#8217;
如果字段值裏包含單引號&#8217; 需要進行字符串轉換, 我們把它替換成兩個單引號
''
字符串類型的字段值超過定義的長度會出錯, 最好在插入前進行長度校驗.

日期字段的字段值可以用當前數據庫的系統時間SYSDATE, 精確到秒
或者用字符串轉換成日期型函數TO_DATE(&#8216;
2001-08-01&#8217;,&#8217;YYYY-MM-DD&#8217;)
TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC. 
--日 小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS

INSERT時最大可操作的字符串長度小於等於4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型,
方法借用ORACLE裏自帶的DBMS_LOB程序包.

INSERT時如果要用到從1開始自動增長的序列號, 應該先建立一個序列號
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY 1  START  WITH  1 
 MAXVALUE  
99999  CYCLE  NOCACHE;
其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 
NUMBER(6) , 最大值爲999999
INSERT 語句插入這個字段值爲: 序列號的名稱.NEXTVAL

------------------------------------------------------------------
2.DELETE  (刪除數據表裏記錄的語句)

DELETE FROM表名 WHERE 條件;

注意:刪除記錄並不能釋放ORACLE裏被佔用的數據塊表空間. 它只把那些被刪除的數據塊標成unused.

如果確實要刪除一個大表裏的全部記錄, 可以用 
TRUNCATE 命令, 它可以釋放佔用的數據塊表空間
TRUNCATE TABLE 表名; 
此操作不可回退.

------------------------------------------------------------------
3.UPDATE  (修改數據表裏記錄的語句)

UPDATE表名 
SET 字段名1=值1, 字段名2=值2, &#8230;&#8230; WHERE 條件;

如果修改的值N沒有賦值或定義時, 將把原來的記錄內容清爲NULL, 最好在修改前進行非空校驗; 
值N超過定義的長度會出錯, 最好在插入前進行長度校驗..

------------------------------------------------------------------
注意事項: 
A.    以上SQL語句對錶都加上了行級鎖,
    確認完成後, 必須加上事物處理結束的命令 
COMMIT 才能正式生效, 
    否則改變不一定寫入數據庫裏.    
    如果想撤回這些操作, 可以用命令 
ROLLBACK 復原.
    
B.    在運行INSERT, 
DELETE 和 UPDATE 語句前最好估算一下可能操作的記錄範圍, 
    應該把它限定在較小 (一萬條記錄) 範圍內,. 否則ORACLE處理這個事物用到很大的回退段. 
    程序響應慢甚至失去響應. 如果記錄數上十萬以上這些操作, 可以把這些SQL語句分段分次完成, 
    其間加上COMMIT 確認事物處理.

=============================================================================================
                二.數據定義 (DDL) 部分
=============================================================================================

1.CREATE (創建表, 索引, 視圖, 同義詞, 過程, 函數, 數據庫鏈接等)

ORACLE常用的字段類型有
CHAR            固定長度的字符串
VARCHAR2        可變長度的字符串
NUMBER(M,N)        數字型M是位數總長度, N是小數的長度
DATE            日期類型

創建表時要把較小的不爲空的字段放在前面, 可能爲空的字段放在後面

創建表時可以用中文的字段名, 但最好還是用英文的字段名

創建表時可以給字段加上默認值, 例如 
DEFAULT SYSDATE
這樣每次插入和修改時, 不用程序操作這個字段都能得到動作的時間

創建表時可以給字段加上約束條件
例如 不允許重複 
UNIQUE, 關鍵字 PRIMARY KEY

------------------------------------------------------------------        
2.ALTER    (改變表, 索引, 視圖等)

改變表的名稱
ALTER TABLE 表名1  TO 表名2;

在表的後面增加一個字段
ALTER TABLE表名 ADD 字段名 字段名描述;

修改表裏字段的定義描述
ALTER TABLE表名 MODIFY字段名 字段名描述;

給表裏的字段加上約束條件
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (字段名);

把表放在或取出數據庫的內存區
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;

------------------------------------------------------------------
3.DROP    (刪除表, 索引, 視圖, 同義詞, 過程, 函數, 數據庫鏈接等)

刪除表和它所有的約束條件
DROP TABLE 表名 CASCADE CONSTRAINTS;

------------------------------------------------------------------
4.TRUNCATE (清空表裏的所有記錄, 保留表的結構)

TRUNCATE 表名;

=============================================================================================
            三.查詢語句 (
SELECT) 部分
=============================================================================================

SELECT字段名1, 字段名2, &#8230;&#8230; 
FROM 表名1, [表名2, &#8230;&#8230;] WHERE 條件; 

字段名可以帶入函數
  例如:  
COUNT(*), MIN(字段名),  MAX(字段名),  AVG(字段名), DISTINCT(字段名), 
       TO_CHAR(DATE字段名,
'YYYY-MM-DD HH24:MI:SS')
---------------------------------------------------------------
NVL(EXPR1, EXPR2)函數
解釋:    
IF EXPR1=NULL
        
RETURN EXPR2
ELSE
               
RETURN EXPR1
---------------------------------------------------------------
DECODE(AA﹐V1﹐R1﹐V2﹐R2.)函數
解釋: 
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..&#8230;
ELSE
RETURN NULL
---------------------------------------------------------------
LPAD(char1,n,char2)函數
解釋:
字符char1按制定的位數n顯示,不足的位數用char2字符串替換左邊的空位
---------------------------------------------------------------
字段名之間可以進行算術運算
例如:  (字段名1
*字段名1)/3
---------------------------------------------------------------

查詢語句可以嵌套
例如: 
SELECT &#8230;&#8230; FROM 
(
SELECT &#8230;&#8230; FROM表名1, [表名2, &#8230;&#8230;] WHERE 條件) WHERE 條件2;
---------------------------------------------------------------
兩個查詢語句的結果可以做集合操作
例如: 並集  
UNION    (去掉重複記錄), 
      並集  
UNION ALL(不去掉重複記錄), 
      差集  MINUS,  
      交集  
INTERSECT

----------------------------------------------------------------
分組查詢
SELECT字段名1, 字段名2, &#8230;&#8230; 
FROM 表名1, [表名2, &#8230;&#8230;] GROUP BY字段名1 
[HAVING 條件] ;

兩個以上表之間的連接查詢

SELECT 字段名1, 字段名2, &#8230;&#8230; 
FROM   表名1, [表名2, &#8230;&#8230;] 
WHERE 表名1.字段名 = 表名2. 字段名 
[ AND &#8230;&#8230;] ;

SELECT字段名1, 字段名2, &#8230;&#8230; 
FROM  表名1, [表名2, &#8230;&#8230;] 
WHERE 表名1.字段名 = 表名2. 字段名(+
[ AND &#8230;&#8230;] ;

有(
+)號的字段位置自動補空值
----------------------------------------------------------        
查詢結果集的排序操作, 默認的排序是升序ASC, 降序是DESC

SELECT字段名1, 字段名2, &#8230;&#8230; 
FROM 表名1, [表名2, &#8230;&#8230;] 
ORDER BY字段名1, 字段名2 DESC;
----------------------------------------------------------
字符串模糊比較的方法

INSTR(字段名, &#8216;字符串&#8217;)
>0    
字段名 
LIKE  &#8216;字符串%&#8217;  [&#8216;%字符串%&#8217;]

每個表都有一個隱含的字段ROWID, 它標記着記錄的唯一性. 

=============================================================================================
            四.ORACLE裏常用的數據對象 (
SCHEMA)
=============================================================================================

1.索引 (INDEX)

CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, &#8230;&#8230;] );
ALTER INDEX 索引名 REBUILD;

一個表的索引最好不要超過三個 (特殊的大表除外), 最好用單字段索引, 結合SQL語句的分析執行情況, 
也可以建立多字段的組合索引和基於函數的索引

ORACLE8.1.7字符串可以索引的最大長度爲1578 單字節
ORACLE8.0.6字符串可以索引的最大長度爲758 單字節

ORACLE DOC上說字符串最大可以建索引的長度約是:數據塊的大小(db_block_size)
*40%

----------------------------------------------------------------
2.視圖 (VIEW)

CREATE VIEW 視圖名AS SELECT &#8230;. FROM &#8230;..;
ALTER VIEW視圖名 COMPILE;

視圖僅是一個SQL查詢語句, 它可以把表之間複雜的關係簡潔化.

----------------------------------------------------------------
3.同義詞 (SYNONMY)
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名&#64;數據庫鏈接名;

----------------------------------------------------------------
4.數據庫鏈接 (DATABASE LINK)
CREATE DATABASE LINK數據庫鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING &#8216;數據庫連接字符串&#8217;;
    
數據庫連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裏定義.

數據庫參數global_name
=true時要求數據庫鏈接名稱跟遠端數據庫名稱一樣

數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;

查詢遠端數據庫裏的表
SELECT &#8230;&#8230; FROM 表名&#64;數據庫鏈接名;

=============================================================================================
                五.權限管理 (DCL) 語句
=============================================================================================

1.GRANT    賦於權限
常用的系統權限集合有以下三個:
CONNECT(基本的連接), RESOURCE(程序開發), DBA(數據庫管理)
常用的數據對象權限有以下五個:
ALL     ON 數據對象名,     SELECT ON 數據對象名,     UPDATE ON 數據對象名,
DELETE     ON 數據對象名,  INSERT ON 數據對象名,   ALTER  ON 數據對象名

GRANT CONNECT, RESOURCE TO 用戶名;
GRANT SELECT ON 表名 TO 用戶名;
GRANT SELECTINSERTDELETE ON表名 TO 用戶名1, 用戶名2;

-------------------------------------------------------------------
2.REVOKE 回收權限

REVOKE CONNECT, RESOURCE FROM 用戶名;
REVOKE SELECT ON 表名 FROM 用戶名;
REVOKE SELECTINSERTDELETE ON表名 FROM 用戶名1, 用戶名2;

=============================================================================================
*********************************************************************************************
=============================================================================================


數據定義(DDL)
=============================================================================================
                二.數據定義 (DDL) 部分
=============================================================================================
1.CREATE (創建表, 索引, 視圖, 同義詞, 過程, 函數, 數據庫鏈接等)

ORACLE常用的字段類型有
CHAR            固定長度的字符串
VARCHAR2        可變長度的字符串
NUMBER(M,N)        數字型M是位數總長度, N是小數的長度
DATE            日期類型

創建表時要把較小的不爲空的字段放在前面, 可能爲空的字段放在後面

創建表時可以用中文的字段名, 但最好還是用英文的字段名

創建表時可以給字段加上默認值, 例如 
DEFAULT SYSDATE
這樣每次插入和修改時, 不用程序操作這個字段都能得到動作的時間

創建表時可以給字段加上約束條件
例如 不允許重複 
UNIQUE, 關鍵字 PRIMARY KEY

------------------------------------------------------------------        
2.ALTER    (改變表, 索引, 視圖等)

改變表的名稱
ALTER TABLE 表名1  TO 表名2;

在表的後面增加一個字段
ALTER TABLE表名 ADD 字段名 字段名描述;

修改表裏字段的定義描述
ALTER TABLE表名 MODIFY字段名 字段名描述;

給表裏的字段加上約束條件
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (字段名);

把表放在或取出數據庫的內存區
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;

------------------------------------------------------------------
3.DROP    (刪除表, 索引, 視圖, 同義詞, 過程, 函數, 數據庫鏈接等)

刪除表和它所有的約束條件
DROP TABLE 表名 CASCADE CONSTRAINTS;

------------------------------------------------------------------
4.TRUNCATE (清空表裏的所有記錄, 保留表的結構)

  
TRUNCATE 表名;

=============================================================================================
*********************************************************************************************
=============================================================================================


查詢語句(SELECT)
================================================================================
            三.查詢語句 (
SELECT) 部分
================================================================================

SELECT  字段名1, 字段名2, &#8230;&#8230; 
FROM    表名1, [表名2, &#8230;&#8230;] 
WHERE   條件; 
--------------------------
字段名可以帶入函數
  例如:  
COUNT(*), MIN(字段名),  MAX(字段名),  AVG(字段名), DISTINCT(字段名), 
       TO_CHAR(DATE字段名,
'YYYY-MM-DD HH24:MI:SS')
------------------------------
NVL(EXPR1, EXPR2)函數
解釋:    
IF EXPR1=NULL
                
RETURN EXPR2
ELSE
               
RETURN EXPR1
------------------------------
DECODE(AA﹐V1﹐R1﹐V2﹐R2.)函數
解釋: 
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..&#8230;
ELSE
RETURN NULL
------------------------------
LPAD(char1,n,char2)函數
解釋:
字符char1按制定的位數n顯示,不足的位數用char2字符串替換左邊的空位
------------------------------
字段名之間可以進行算術運算
例如:  (字段名1
*字段名1)/3


===============================================================
查詢語句可以嵌套
---------------------
例如: 
SELECT &#8230;&#8230; FROM 
(
   
SELECT &#8230;&#8230; 
   FROM表名1, 
[表名2, &#8230;&#8230;] 
   
WHERE 條件1

WHERE 條件2;

===============================================================
兩個查詢語句的結果可以做集合操作
--------------------------------
例如: 並集  UNION    (去掉重複記錄), 
      並集  
UNION ALL(不去掉重複記錄), 
      差集  MINUS,  
      交集  
INTERSECT

===============================================================
分組查詢
------------
SELECT   字段名1, 字段名2, &#8230;&#8230; 
FROM     表名1, 表名2, &#8230;&#8230;
GROUP BY 字段名1 
HAVING 條件


===============================================================
兩個以上表之間的連接查詢
-----------------------
SELECT 字段名1, 字段名2, &#8230;&#8230; 
FROM   表名1, [表名2, &#8230;&#8230;] 
WHERE  表名1.字段名 = 表名2. 字段名 
[ AND &#8230;&#8230;] ;

SELECT 字段名1, 字段名2, &#8230;&#8230; 
FROM   表名1, [表名2, &#8230;&#8230;] 
WHERE  表名1.字段名 = 表名2. 字段名(+
[ AND &#8230;&#8230;] ;

有(
+)號的字段位置自動補空值

===============================================================        
查詢結果集的排序操作, 默認的排序是升序ASC, 降序是DESC
----------------------------------------------------
SELECT   字段名1, 字段名2, &#8230;&#8230; 
FROM     表名1, [表名2, &#8230;&#8230;] 
ORDER BY 字段名1, 字段名2 DESC;

===============================================================
字符串模糊比較的方法
----------------------
INSTR(字段名, &#8216;字符串&#8217;)>0    
字段名 
LIKE  &#8216;字符串%&#8217;  [&#8216;%字符串%&#8217;]


----------------------------------------------------------------
每個表都有一個隱含的字段ROWID, 它標記着記錄的唯一性. 

=============================================================================================
*********************************************************************************************
=============================================================================================


ORACLE裏常用的數據對象
=============================================================================================
            四.ORACLE裏常用的數據對象 (
SCHEMA)
=============================================================================================

1.索引 (INDEX)

CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, &#8230;&#8230;] );
ALTER INDEX 索引名 REBUILD;

一個表的索引最好不要超過三個 (特殊的大表除外), 最好用單字段索引, 結合SQL語句的分析執行情況, 
也可以建立多字段的組合索引和基於函數的索引

ORACLE8.1.7字符串可以索引的最大長度爲1578 單字節
ORACLE8.0.6字符串可以索引的最大長度爲758 單字節

ORACLE DOC上說字符串最大可以建索引的長度約是:數據塊的大小(db_block_size)
*40%
---------------------------------------------------------------------------------------

----------------------------------------------------------------
2.視圖 (VIEW)

CREATE VIEW 視圖名AS SELECT &#8230;. FROM &#8230;..;
ALTER VIEW視圖名 COMPILE;

視圖僅是一個SQL查詢語句, 它可以把表之間複雜的關係簡潔化.

----------------------------------------------------------------
3.同義詞 (SYNONMY)
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名&#64;數據庫鏈接名;

----------------------------------------------------------------
4.數據庫鏈接 (DATABASE LINK)
CREATE DATABASE LINK數據庫鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING &#8216;數據庫連接字符串&#8217;;
    
數據庫連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裏定義.

數據庫參數global_name
=true時要求數據庫鏈接名稱跟遠端數據庫名稱一樣

數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;

查詢遠端數據庫裏的表
SELECT &#8230;&#8230; FROM 表名&#64;數據庫鏈接名;

=============================================================================================
*********************************************************************************************
=============================================================================================


權限管理(DCL)
=============================================================================================
                五.權限管理 (DCL) 語句
=============================================================================================

1.GRANT    賦於權限
常用的系統權限集合有以下三個:
CONNECT(基本的連接), RESOURCE(程序開發), DBA(數據庫管理)
常用的數據對象權限有以下五個:
ALL     ON 數據對象名,     SELECT ON 數據對象名,     UPDATE ON 數據對象名,
DELETE     ON 數據對象名,  INSERT ON 數據對象名,   ALTER  ON 數據對象名

GRANT CONNECT, RESOURCE TO 用戶名;
GRANT SELECT ON 表名 TO 用戶名;
GRANT SELECTINSERTDELETE ON表名 TO 用戶名1, 用戶名2;

-------------------------------------------------------------------
2.REVOKE 回收權限

REVOKE CONNECT, RESOURCE FROM 用戶名;
REVOKE SELECT ON 表名 FROM 用戶名;
REVOKE SELECTINSERTDELETE ON表名 FROM 用戶名1, 用戶名2;

=============================================================================================
*********************************************************************************************
=============================================================================================

--------------------------------------------------------------------------------

簡單查詢
=====================================================================
            使用表達式
=====================================================================

Select  ename || '   是一位   ' || job As 僱員細節,
        to_char(hiredate,
'yyyy-mm-dd'As 僱傭時間,
        sal
*1.2
From emp;

=====================================================================
            取消重複行 
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 子句必須是最後一個子句
=====================================================================
=====================================================================


分組查詢語句
============================================================
            分組查詢語句
============================================================
1。組處理函數不能出現在 where 子句中
2。選擇列表中的列、表達式,必須出現在 group by 子句中
3。組處理函數中可以指定 all 和 distinct
============================================================
分組函數
---------------------------------------
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 用於生成橫向統計信息
--------------------------
Select deptno, job, Avg(sal), Max(sal) From emp
Group By rollup(deptno,job)

--------------------------------------------------
cube  用於生產縱向統計信息
------------------------------
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 --- 兩個集合的並集,去掉重複行,按第一列結構排序
--
-----------------------
Select empno, ename, mgr From emp
Where deptno = 30
Union 
Select empno, ename, mgr From emp
Where job = 'MANAGER' 
===========================================================
union all --- 兩個集合並集,不去重複行,不排序
--
-----------------------
Select empno, ename, mgr From emp
Where deptno = 30
Union All
Select empno, ename, mgr From emp
Where job = 'MANAGER' 

===========================================================
Intersect --- 只會顯示同時存在兩個集合中的數據
--
---------------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Intersect
Select empno, ename, mgr From emp
Where job = 'MANAGER' 

===========================================================
minus 
--- 在一個集合存在,在第二個集合不存在的數據,按第一個排序
--
---------------------------------
Select empno, ename, mgr From emp
Where deptno = 30
Minus
Select empno, ename, mgr From emp
Where job = 'MANAGER' 

===========================================================
合併查詢中,只能有一個 
order by 子句。在這個子句中使用列名或
第一個查詢的別名。
--------------------------------------
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子句中使用多行子查詢,必須使用多行運算符,
          (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)

============================================================
相關子查詢
------------------------------
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'
)

============================================================
標量子查詢 
--- 顯示每個部門的最高工資員工信息
--
---------------------
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')
-----------------------
     顯示崗位或者管理員匹配於部門編號爲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 語句分析
============================================================
             基礎查詢分類
============================================================
基本查詢 
--- 所有列、指定列、where子句、order by子句
--
-------------------------------------------------
分組查詢 --- 組處理函數、group by子句、having子句
--
-------------------------------------------------
連接查詢 --- 相等連接、不等連接、自我連接
============================================================

============================================================
合併查詢 
--- UNION,UNION ALL,INTERSECT,MINUS
--
---------------------------------------------------
子查詢   --- 單行、多行、相關、標量、多列、DDL中、DML中
============================================================


============================================================

1order by 子句必須放在最後。

2。組處理函數只能出現在選擇列表、order by子句、having子句中,
   不能出現在where子句和group by子句中。

3。在選擇列表中包含的列、表達式,則一定要出現在group by子句中。

4。where子句中可以使用單行子查詢,可以使用單行運算符。
   ( =,
><>=<=<> )

5。where子句中可以使用多行子查詢,可以使用多行運算符。
   ( 
innot inexistsnot existsallany )

============================================================


SQL 優化法則
===================================================================================
基本的Sql編寫注意事項
---------------------
1。儘量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。 

2。不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代。 

3。Oracle在執行IN子查詢時,首先執行子查詢,將查詢結果放入臨時表再執行主查詢。
   而EXIST則是首先檢查主查詢,然後運行子查詢直到找到第一個匹配項。
   
NOT EXISTS 比 NOT IN 效率稍高。但具體在選擇IN或EXIST操作時,
   要根據主子表數據量大小來具體考慮。 

4。不用&#8220;<>&#8221;或者&#8220;!=&#8221;操作符。對不等於操作符的處理會造成全表掃描,
   可以用&#8220;
<&#8221; or &#8220;>&#8221;代替。 

5。Where子句中出現IS NULL或者IS NOT NULL時,Oracle會停止使用索引而執行全表掃描。
   可以考慮在設計表時,對索引列設置爲NOT 
NULL。這樣就可以用其他操作來取代判斷NULL的操作。 

6。當通配符&#8220;%&#8221;或者&#8220;_&#8221;作爲查詢字符串的第一個字符時,索引不會被使用。 

7。對於有連接的列&#8220;||&#8221;,最後一個連接列索引會無效。儘量避免連接,
   可以分開連接或者使用不作用在列上的函數替代。 

8。如果索引不是基於函數的,那麼當在Where子句中對索引列使用函數時,索引不再起作用。 

9。Where子句中避免在索引列上使用計算,否則將導致索引失效而進行全表掃描。 

10。對數據類型不同的列進行比較時,會使索引失效。 

11。用&#8220;>=&#8221;替代&#8220;>&#8221;。 

12。UNION操作符會對結果進行篩選,消除重複,數據量大的情況下可能會引起磁盤排序。
    如果不需要刪除重複記錄,應該使用UNION 
ALL。 

13。Oracle從下到上處理Where子句中多個查詢條件,所以表連接語句應寫在其他Where條件前,
    可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾。 

14。Oracle從右到左處理From子句中的表名,所以在From子句中包含多個表的情況下,
    將記錄最少的表放在最後。

15Order By語句中的非索引列會降低性能,可以通過添加索引的方式處理。
    嚴格控制在Order By語句中使用表達式。 

16。不同區域出現的相同的Sql語句,要保證查詢字符完全相同,以利用SGA共享池,
    防止相同的Sql語句被多次分析。 

17。當在Sql語句中連接多個表時,使用表的別名,並將之作爲每列的前綴。這樣可以減少解析時間。

======================================================================================
我們可以總結一下可能引起全表掃描的操作: 
------------------------------------------
1。在索引列上使用NOT或者&#8220;<>&#8221;; 

2。對索引列使用函數或者計算; 

3NOT IN操作; 

4。通配符位於查詢字符串的第一個字符; 

5IS NULL或者IS NOT NULL; 

6。多列索引,但它的第一個列並沒有被Where子句引用; 
======================================================================================


Oracle 筆記(四)、SQL 幾個要點 - 黃小二的讀書筆記 - BlogJava  http://www.blogjava.net/kiant/articles/234781.html#1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章