本筆記中包含了單行函數和多表查詢的內容。
一、單行函數
特點:操作數據對象,接受參數返回一個結果,只對一行進行變換,每行返回一個結果
可以轉換數據類型,可以嵌套參數,可以是一列或一個值
主要分爲五個類比:字符函數、數字函數、日期函數、轉換函數、通用函數
1)字符函數
—大小寫控制函數
UPPER(字符串 | 列):將輸入的字符串變爲大寫返回;
LOWER(字符串 | 列):將輸入的字符串變爲小寫返回;INITCAP(字符串 | 列):開頭首字母大寫;
eg:Select column_1, column_name
From table_1
Where Lower(column_name) = 'test_name';
—字符控制函
LENGTH(字符串 | 列):求出字符串的長度;
REPLACE(字符串 | 列):進行替換;
SUBSTR(字符串 | 列,開始點 [,結束點]):字符串截取;
當使用SUBSTR時,一般有兩種語法:
語法一:SUBSTR(字符串 | 列,開始點),表示從開始點一直截取到結尾,當設置開始點爲負數時,表示從後開始;
語法二:SUBSTR(字符串 | 列,開始點,結束點),表示從開始點截取到結束點,截取部分內容;2)數字函數
ROUND(數字 | 列 [,保留小數的位數]):四捨五入的操作;
eg: ROUND(45.926, 2) -> 45.93, ROUND(45.926, 0) -> 46, ROUND(45.926, -1) -> 50
TRUNC(數字 | 列 [,保留小數的位數]):捨棄指定位置的內容;
eg: TRUNC(45.926, 2) -> 45.92, TRUNC(45.926) -> 45, TRUNC(45.926, -1) -> 40
MOD(數字 1,數字2):取模,取餘數;
eg: MOD(10,3) -> 1
3)日期函數
MONTHS_BETWEEN(日期1,日期2):求出兩個日期之間所經歷的月份;
NEXT_DAY(日期,星期數):求出下一個指定星期X的日期;
4)轉換函數
TO_CHAR(字符串 | 列,格式字符串):將日期或者是數字變爲字符串顯示;
eg:……where to_char(xxx_date,'yyy-mm-dd') = '1997-06-15'
Select to_char(column_1,'L999,999.00') column_1 From ……
TO_DATE(字符串,格式字符串):將字符串變爲DATE數據顯示;
eg: Select to_date(xxx_str,'yyyy-mm-dd') From ……
Select to
TO_NUMBER(字符串):將字符串變爲數字顯示——基本上不用了
5)通用函數
通用函數主要有兩個:NVL()、DECODE(),這兩個函數算是Oracle自己的特色函數了;
NVL(),將空值轉換成一個已知的值,可以使用的數據類型有日期、字符、數字。函數的一般形式:
NVL(commission_pct,0)
NVL(date_x,'01-JAN-97')
NVL(id_x,'No Job Yet')
NVL2 (expr1, expr2, expr3) : expr1不爲NULL,返回expr2;爲NULL,返回expr3。
DECODE(數值 | 列 ,判斷值1,顯示值1,判斷值2,顯示值2,判斷值3,顯示值3,…)
DECODE()函數非常類似於程序中的if…else…語句,唯一不同的是DECODE()函數判斷的是數值,而不是邏輯條件。
eg:Select column_1 Decode(column_2, expr1, value1, expr2, value2 ……) From ……
二、多表查詢
查詢的基本語法是:
Select [Distinct] * | 字段[別名] [,字段 [別名], ……]
From 表名 [別名],[表名[別名],……]
[Where 條件[s]]
[Order By 排序字段 [ASC|DESC] [, 排序字段 [ASC|DESC], ……]]
在進行多表查詢的時候,若1)省略連接條件, 2)連接條件無效, 3)所有表中的所有行互相連接,將會產生笛卡爾積,
爲了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
1)等值連接——查詢的表之間存在相等的關係
eg:Select tab1.column_1, tab1.column_2,……, tab2.conlmn_1, tab2.column_2, ……
From table_1 tab1, table_2 tab2
Where tab1.column_x = tab2.column_y AND ……
2)非等值連接——查詢的表之間存在某種不相等的特定聯繫
eg:Select tab1.column_1, tab1.column_2,……, tab2.conlmn_1, tab2.column_2, ……
From table_1 tab1, table_2 tab2
Where tab1.column_z Between tab1.column_x And tab2.column_y AND ……3)自連接——在查詢的時候,使用該表自身與自身進行對比
eg:Select tab1.column_1, tab1.column_2,……, tab2.conlmn_1, tab2.column_2, ……
From table_1 tab1, table_1 tab2
Where tab1.column_x = tab2.column_y AND ……
4)內連接——合併具有同一列的兩個以上的表的行, 結果集中只包含一個表與另一個表匹配的行
5)外連接——除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,即稱爲左(或右) 外連接。
左、右連接指的是查詢判斷條件的參考方向
沒有匹配的行時, 結果表中相應的列爲空(NULL). 外連接的 WHERE 子句條件類似於內部連接,
但連接條件中沒有匹配行的表的列後面要加外連接運算符, 即用圓括號括起來的加號(+).
(+)=:放在了等號的左邊,表示的是右連接; =(+):放在了等號的右邊,表示的是左連接;
注意:這種符號是Oracle數據庫自己所獨有的,其他數據庫不能使用。
6)SQL:1999語法
標準格式:Select tab1.column_1, ……, tab2.column_1
From table1 tab1
[Cross Join table2 tab2] | [Natural Jion ] |
[Jion table2 tab2 Using(column_x)] |
[Left | Right | Full Outer Join table2 tab2 On (tab1.column_x = tab2.column_y)]
交叉連接(Cross Jion):用於產生笛卡爾積
自然連接(Natural Jion):自動找到匹配的關聯字段,消除笛卡爾積
Jion……Using:用戶指定一個消除笛卡爾積的關聯字段
Join……On:用戶自己指定一個消除笛卡爾積的關聯條件
改變連接方向:
左(外)連接:Left Outer Join …… On
右(外)連接:Right Outer Join …… On
全(外)連接:Full Outer Join …… On ---> 將兩張表中沒有的數據都顯示