oracle—decode、nvl、rownum、like、all、any使用
阿新 • • 發佈:2020-11-05
一、decode()——多值判斷
語法:decode(表示式,比較值1,結果值1,比較值1,結果值1,...,預設值)
SQL> select employee_name,decode(sign(instr(employee_position,'工程師')),1,'技術部','行政部') partment from employees; EMPLOYEE_NAME PARTMENT ------------- -------- 江小白 行政部 行政部 大鱷 技術部 昂嗚 技術部 李四 技術部 張三 行政部 過戶 技術部 問題 技術部 語句 技術部 陳武 技術部 六六 技術部View Code11 rows selected
二、nvl()——空值判斷
語法:nvl(表示式,新值/表示式)
SQL> select employee_name,employee_position,nvl(employee_position,'行政部') new from employees; EMPLOYEE_NAME EMPLOYEE_POSITION NEW ------------- ----------------- ---------- 江小白 行政部 大鱷 工程師 工程師 昂嗚 高階工程師 高階工程師 李四 高階工程師 高階工程師 張三 開發經理 開發經理 過戶 工程師 工程師 問題 工程師 工程師 語句 測試工程師 測試工程師 陳武 測試工程師 測試工程師 六六 測試工程師 測試工程師View Code10 rows selected
三、rownum()——結果集行號
1.增加rownum一列
SQL> select employee_id,employee_name,rownum new from employees; EMPLOYEE_ID EMPLOYEE_NAME NEW ----------- ------------- ---------- 10 江小白 1 4 大鱷 2 3 昂嗚 3View Code2 李四 4 1 張三 5 5 過戶 6 6 問題 7 7 語句 8 8 陳武 9 9 六六 10 10 rows selected
2.rownum與orderby
需求:按照id排序並取出前3位。
SQL> select employee_id,employee_name,rownum new from employees where rownum <=3 order by employee_id; EMPLOYEE_ID EMPLOYEE_NAME NEW ----------- ------------- ---------- 10 江小白 1 3 昂嗚 3 4 大鱷 2 SQL> select employee_id,employee_name,rownum new from(select * from employees order by employee_id) where rownum<=3 ; EMPLOYEE_ID EMPLOYEE_NAME NEW ----------- ------------- ---------- 1 張三 1 10 江小白 2 2 李四 3 SQL> select employee_id,employee_name,rownum new from(select * from employees order by cast(employee_id as number)) where rownum<=3 ; EMPLOYEE_ID EMPLOYEE_NAME NEW ----------- ------------- ---------- 1 張三 1 2 李四 2 3 昂嗚 3View Code
備註:where的過濾條件優先於orderby條件;id的型別為varchar,所以排序是10排在2前面,利用cast將字元轉換為數值型後,排序正常。
3.rownum與“=”
能獲取到rownum=1的資料,獲取不到rownum=4的資料。
SQL> select * from employees where rownum=1; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 10 江小白 SQL> select * from employees where rownum=4; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- --------------View Code
4.rownum與“>”
rownum>1時沒有資料,rownum>0時查詢全部資料。
SQL> select * from employees where rownum>1; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- SQL> select * from employees where rownum>0; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 10 江小白 4 大鱷 工程師 26 巴南 1988-07-01 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 1 張三 開發經理 37 巴南 1987-11-01 5 過戶 工程師 26 渝中 1985-08-01 6 問題 工程師 25 渝中 1980-02-09 7 語句 測試工程師 24 九龍坡 2010-05-03 8 陳武 測試工程師 25 江北 2004-01-23 9 六六 測試工程師 32 南岸 1994-12-21 10 rows selectedView Code
四、like——模糊匹配
1."%"——匹配
需求:查詢以“工程師”結尾的資料
SQL> select * from employees where employee_position like '%工程師'; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 4 大鱷 工程師 26 巴南 1988-07-01 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 5 過戶 工程師 26 渝中 1985-08-01 6 問題 工程師 25 渝中 1980-02-09 7 語句 測試工程師 24 九龍坡 2010-05-03 8 陳武 測試工程師 25 江北 2004-01-23 9 六六 測試工程師 32 南岸 1994-12-21 8 rows selectedView Code
2."_"——匹配一個字元
需求:查詢以“XX工程師”的資料
SQL> select * from employees where employee_position like '__工程師'; EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 7 語句 測試工程師 24 九龍坡 2010-05-03 8 陳武 測試工程師 25 江北 2004-01-23 9 六六 測試工程師 32 南岸 1994-12-21View Code
3.元義字元
需求:判斷以%號結尾
SQL> select 1 result from dual where '10%' like '%%'; RESULT ---------- 1 SQL> select 1 result from dual where '10' like '%%'; RESULT ---------- 1 SQL> select 1 result from dual where '10' like '%\%' escape '\'; RESULT ---------- SQL> select 1 result from dual where '10%' like '%\%' escape '\'; RESULT ---------- 1View Code
五、all、some、any——集合判斷
需求:查詢大於所有工程師年齡的員工資訊。
SQL> select * from employees where employee_age>all(select employee_age from employees where employee_position='工程師'); EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 9 六六 測試工程師 32 南岸 1994-12-21 1 張三 開發經理 37 巴南 1987-11-01 SQL> select * from employees where employee_age> (select max(employee_age) from employees where employee_position='工程師'); EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 1 張三 開發經理 37 巴南 1987-11-01 9 六六 測試工程師 32 南岸 1994-12-21View Code
需求:查詢大於任意一位工程師年齡的員工資訊。
SQL> select * from employees where employee_age>any(select employee_age from employees where employee_position='工程師'); EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 1 張三 開發經理 37 巴南 1987-11-01 2 李四 高階工程師 32 渝北 1994-09-01 9 六六 測試工程師 32 南岸 1994-12-21 3 昂嗚 高階工程師 27 渝北 1998-06-01 5 過戶 工程師 26 渝中 1985-08-01 4 大鱷 工程師 26 巴南 1988-07-01 6 rows selected SQL> select * from employees where employee_age> (select min(employee_age) from employees where employee_position='工程師'); EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD EMPLOYEE_BIRTH ----------- ------------- ----------------- ------------ -------------------- -------------- 4 大鱷 工程師 26 巴南 1988-07-01 3 昂嗚 高階工程師 27 渝北 1998-06-01 2 李四 高階工程師 32 渝北 1994-09-01 1 張三 開發經理 37 巴南 1987-11-01 5 過戶 工程師 26 渝中 1985-08-01 9 六六 測試工程師 32 南岸 1994-12-21 6 rows selectedView Code
整理於《oracle入門很簡單》一書