本人有一些資料庫基礎,故并不詳細
一、SELECT 基礎文法
SELECT { [ aliias. ] column | expression | [ alias. ] * [ ,... ] }
FROM [ schema. ] table [alias]
WHERE 查詢條件;
二、用DISTINCT去除重複值
預設情況下,SELECT 語句或傳回符合條件的所有行值,實際是哪個這是因為在SELECT語句後面有一個預設的關鍵字ALL,用來表示傳回是以的資料行,包含具有重複的行。
DISTINCT 或ALL以及UNIQUE必須緊随在SELECT 語句後面。
使用DISTINCT的限制:
1、在使用了DISTINCT的選擇清單中取回的總資料的大小受限于資料塊大小的限制,是一個資料塊大小減去一些開銷之後的代銷,也就是說要注意DISTINCT後面的選擇清單的大小,不過在實際的 工作中一般很少會超越這個限制。
2、如果選擇清單中包含了大對象類型,比如LOB列,那麼不能使用DISTINCT關鍵字。
三、表達式查詢
算數運算符
運算符 | 說明 |
---|---|
+ | 加法操作 |
- | 減法操作 |
– | – |
* | 乘法操作 |
– | – |
/ | 除法操作 |
SQL比較運算符
運算符 | 運算符描述 |
---|---|
< | 小于 |
– | – |
<= | 小于等于 |
– | – |
> | 大于 |
– | – |
>= | 大于等于 |
– | – |
= | 等于 |
– | – |
<> 或 != | 不等于 |
定義表達式注意原則:
1、字元串和日期類型的值要放在單引号中。
2、日期的預設格式是DD-MON_RR,可以同更改NLS_DATE_FORMAT來更改日期的現實格式。
3、雖然SQL語言本身不區分大小寫。但是位于單引号中的比較值是區分大小寫的。
四、BETWEEN、IN、LIKE範圍查詢
1、使用BETWEEN進行範圍查詢
expr1 [ NOT ] BETWEEN expr2 AND expr3
五、處理NULL值
如果一個列的列屬性設定為允許NULL值,那麼在使用WHERE條件查詢列值為NULL值得列時,需要使用IS NULL 或 IS NOT NULL來測試控制。NULL時為止、未指定的或難以獲得的值,如果使用等于或者不等于進行比較,結果總是傳回FALSE或未知,疑問NULL列不能等于或不等于任何值。如果使用 “=” 或者 “!=”,将會傳回UNKNOWN,UNKNOWN大多數情況下也是FALSE,是以無法取出任何記錄。
--email列條件不為空
SELECT * FROM buser WHERE email IS NOT NULL;

--email列條件為空
SELECT * FROM buser WHERE email IS NULL;
六、AND、OR、NOT邏輯運算符
AND和OR可以讓使用者連接配接多個比較表達式,實作對于複雜條件的運算。
1、AND運算符,有稱與運算符,如果AND左右倆側的表達式結果都為TRUE ,那麼結果就位TRUE。
2、OR運算符,又稱或運算符,如果OR左右倆側的表達式隻要有一個結果為TRUE,那麼倆個結果就位TRUE。
3、NOT運算符,又稱取反運算符,NOT通常是單目運算符,即NOT右側才能包含表達式,是對結果取反,如果表達式結果為TRUE,那麼NOT的結果就為FALSE;否則如果表達式的結果為FALSE,那麼NOT的結果就為TRUE。
七、使用ORDER BY 排序
在WHERE子句的後面可以緊跟ORDER BY 子句來實作對查詢結果的排序,ASC指定升序排序,這是預設的順序;DESC用于指定降序的排序順序。ORDER BY子句必須為SELECT最後一個子句。
八、ROWNUM僞列
僞列是指實體上并不存在的列,隻是在查詢是,ORACLE 才構造僞列的數值,位列是由Oracle自動構造的,一般情況下無法對其進行修改。ROWNUM是根據查詢結果集來動态産生的,它産生在ORDER BY 排序結果集之前,是以如果在結果集中應用了排序,就有可能導緻僞劣排序的混亂。在應用了WHERE條件是,如果條件不比對,會被丢棄并且會被重置,這也就是說,如果ROWNUM 的值不滿足,那麼下一行的值将會重用ROENUM。
九、ROWID僞列
ROWID僞列用來傳回行的位址,它包含了用來定位一個行所需要的資訊。ROWID通常用來定位記錄,比如索引就使用ROWID來定位目标行位置,并且ROWID預設情況下是按字元遞增進行排列的。
ROWID的18個字元按照功能進行組織,七組成結構參見表
資料對象編号 | 檔案編号 | 塊編号 | 行編号 |
---|---|---|---|
OOOOOO | FFF | BBBBBB | RRR |
1、資料對象編号,表示行所在的資料庫段的編号。
2、資料檔案編号,與表空間相關的資料檔案編号指定所在行所在的資料檔案。
3、資料塊編号,指定包含行資料的資料塊,資料塊編号是相對于資料檔案而不是表空間的,是以倆個行可能具有相同的資料塊編号,但是4、它們位于不同的資料檔案中。
5、行号,指定塊中的行号。
Oracle提供了一個可以輕松得到具體的ROWID包含的資訊,這個包就是DBMS_ROWID,是以要擷取具體的編号資訊,可以使用如下查詢。
--查詢ROWID資訊
SELECT DBMS_ROWID.rowid_object (ROWID) object_id, -- 對象編号
DBMS_ROWID.rowid_relative_fno (ROWID) file_id, -- 資料檔案編号
DBMS_ROWID.rowid_block_number (ROWID) block_id, -- 資料檔案編号
DBMS_ROWID.rowid_row_number (ROWID) num -- 資料檔案編号
FROM buser--(查詢的表名)
WHERE ROWNUM < 5;
或者使用dual表和ROWID查詢
SELECT DBMS_ROWID.rowid_object ('AAAR/UAAFAAAAClAAB') object_id, -- 對象編号
DBMS_ROWID.rowid_relative_fno ('AAAR/UAAFAAAAClAAB') file_id, -- 資料檔案編号
DBMS_ROWID.rowid_block_number ('AAAR/UAAFAAAAClAAB') block_id, -- 資料檔案編号
DBMS_ROWID.rowid_row_number ('AAAR/UAAFAAAAClAAB') num -- 資料檔案編号
FROM dual
ROWID表示行的唯一辨別符,它用來建構索引結構,每一個索引建都包含一個ROWID值沒用來指定索引的行,使用ROWID是通路表行最快的方法,二千可以用來觀察資料的實體組成方式。對于每一行記錄,即便所有的字段值都相同,ROWID也不可能相同,因為ROWID總是唯一的。
十、CASE表達式
在SQL語言中,可以通過倆種方式模拟IF-THEN-ELSE邏輯,分别是CASE表達式和DECODE函數。
在SQL語言中,XASE 語句按其難易程度可以分為如下倆類:
1、簡單CASE語句,在CASE語句中指定輸入表達式,通過WHEN子句中的多個條件值與之進行比較 ,簡單CASE語句是基于值之間的比較。
2、搜尋CASE語句,CASE語句中不指定比較值,通過WHEN子句中使用表達式計算結果值,隻要條件為TRUE就去其結果。
文法如下:
CASE expr --指定要比對的表達式,該表達式必須傳回值
WHEN comparison_expr1 THEN return_expr1 --WHEN子句分局表達式傳回的值進行判斷
[WHEN comparison_expr2 THEN return_expr年
WHEN comparison_exprn THEN return_exprn
...
ELSE else_expr] --上述所有條件都不成立則執行ELSE子句
END
簡單CASE語句要求在CASE關鍵字後面指定一個表達式,這個表達式可以是列名或者是傳回結果的表達式,在WHEN子句中提供一系列的值,與expr中的結果值進行比較,WHEN子句的個數可以有65534個,如果包含ELSE最大可達65535個。WHEN子句中表達式的結果類型必須要與CASE中的輸入表達式的類型想比對并且所有的THEN關鍵字後的結果值得類型必須相同。
例:
SELECT name, birth,
CASE birth
WHEN '1991' THEN BIRTH+1
WHEN '1992' THEN BIRTH+2
ELSE BIRTH-1
END nameASD
FROM buser
WHERE MOBILE = '13499990001';
Oracle提供了複雜的CASE。
CASE WHEN comparison_expr THEN return_expr1
[WHEN comparison_expr2 THEN return_expr1
WHEN comparison_exprn THEN return_exprn
...
ELSE else_expr]
END
例:
SELECT account,name, birth,
CASE
WHEN account = 'zhangsan' THEN birth-5
WHEN account = 'wangwu' THEN birth+2
ELSE birth-1
END nameASD
FROM buser
WHERE MOBILE = '13499990001';
盡量不要WHEN和THEN後面的變量一樣,否則可能會有問題,什麼原因還沒有弄明白,歡迎大家指點。下面的例子細心的人就會發現有問題。
SELECT account,name, birth,
CASE
WHEN birth > '1900' THEN birth-5
WHEN birth <= '1900' THEN birth+2
ELSE birth-1
END nameASD
FROM buser
WHERE MOBILE = '13499990001';