天天看點

Oracle查詢SELECT

本人有一些資料庫基礎,故并不詳細

一、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;
           
Oracle查詢SELECT
--email列條件為空
SELECT * FROM buser WHERE email  IS NULL;
           
Oracle查詢SELECT

六、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查詢SELECT

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';
           
Oracle查詢SELECT

盡量不要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';
           
Oracle查詢SELECT