5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
1? 多行函數(理解:有多個輸入,但只輸出1個結果)
???????? SQL>select count(*) from emp;
???????? COUNT(*)
???????? -------------
???????? ? ????14
B 字符函數Lower ?????????????????????????? ????????
select Lower('Hello') 轉小寫,
upper('hello') 轉大寫,
initcap('hello woRld')? 首字母大寫
from dual;
??? 結果:
?????????????????? 轉小? 轉大? 首字母大寫
?????????????????? ---------- -----------
?????????????????? helloHELLO Hello World
????????
??? C字符函數 concat:
select? concat('hello','world') from dual
???
concat函數嵌套:
??? select concat (concat('hello', 'world'),'cccc')? 函數嵌套 from dual;
???????? ???? 函數嵌套
???????? ???????? --------------
???????? ???????? helloworldcccc
????????
??? D字符函數 substr()
SUBSTR(a,b) --- 從a中第b位去字符串
substr(a, b, c) 從a中第b位, c個字符....
?
select substr('abcdefg1111', 2) 從第二位取子串,?
substr('abcdefg1111', 2, 4) 取4個字符
from dual;
?????????????????? ? 從第二位取 取4
?????????????????? ? ----------------- ------
?????????????????? ? bcdefg1111 ?bcde
?
E ?length字符數?? lengthb字節數
注意:一個中文字符,兩個字節
select length('中國abc') 字符數,??
lengthb('中國abc') 字節數
from dual;
??? 運行結果:
?????????????????? 字符數???? 字節數
?????????????????? ----------??? ?----------
?????????????????? ??? ?????????5????????? ????????????????????????????????????
F instr(),lpad(),rpad(),trim()函數
select instr('abcdefg', 'efg')?求子串位置 from dual;
??????????????????????????? 求子串位置
??????????????????????????? ----------------
??????????????????????????? ???????? 5
???????? selectlpad('abcd', 10, '*') lpad, rpad('abcd', 10, '*') rpad from dual;
??????????????????????????? LPAD????? ??????RPAD
??????????????????????????? ----------???????----------
??????????????????????????? ******abcd?abcd****** ?? ?????
???????????????????????????
--trim 去掉前后指定的字符,字符可以是空格,也可以不是空格 .
???????? selecttrim('A' from 'ABCDEFg') from dual;
???????? ??????? TRIM('
??????????????????????????? ------
??????????????????????????? BCDEFg
?
2? 數字函數
| 第二個參數 | 含義 |
| 2> 0 | 保留2位 |
| = 0 | 保留到個位 |
| -1 | 保留到10位 |
| -2 | 保留到百位(要看十位 四舍五入) |
?
? selectround(45.926, 2) AA,
round(45.926, 1) BB,
round(45.926, 0) CC,
round(45.926) DD,
???????round(45.926, -1) EE,
round(45.926, -2) FF
from dual;
? 結果:
???????AA???????? BB???????? CC???????? DD???????? EE???????? FF
----------??? ?----------?????----------??? ?---------- ????---------- ???----------
??? ???45.93??????45.9???????? 46???????? 46???????? 50????????? 0
?
3? 日期函數
時間的計算.......
???????? oracle數據庫中 date包含 日期和時間
???????? mysql? ????????????????????? 3中數據類型 date 、time 、times.
???????? A? ?selectto_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual ;
?????????????????? TO_CHAR(SYSDATE,'YY
?????????????????? -------------------
?????????????????? 2014-10-0716:34:17
??????????????????????????????????????????????????????????????????????????
???????? B?? ----昨天今天明天
???????? select?sysdate-1 昨天,
sysdate 今天,
sysdate+1 明天
from dual;
???????? selectto_char(sysdate-1, 'yyyy-mm-dd hh24:mi:ss')?昨天,
sysdate 今天,
sysdate+1 明天
from dual;
????????
???????? C? ----查詢員工的入職時間,按照 周 月? 年 方式顯示.....
???????? select(sysdate-hiredate)/7 周,?
?(sysdate-hiredate)/30 月,
?(sysdate-hiredate)/365 年
?????????????????? ?from emp;
????????
select (sysdate-hiredate)/7 周,??
(sysdate-hiredate)/30 月,?
(sysdate-hiredate)/365
?????????????????? ? from emp;
?????????????????? ?
周??????? ??月???????? 年
?????????????????? ? ----------???---------- ???----------
?????????????????? ? 1763.95625 411.589791 33.8292979
?????????????????? ? 1754.67053 409.423125 33.6512157
?????????????????? ? 1754.38482 409.356458 33.6457363
????????????????????????????????????????????????????????????????
???????? ?D? 查詢員工的入職時間, 入職月數
?????????????????? selectename,
(sysdate-hiredate)/30 估計月,?
MONTHS_BETWEEN(sysdate, hiredate) 函數計算月
??????????????????????????? ? from emp
??????????????????????????? ?
???????? ??? select ename,
(sysdate-hiredate)/30 估計月,?
MONTHS_BETWEEN(sysdate, hiredate) 函數計算月
??????????????????????????? ? from emp;
ENAME????????? 估計月 函數計算月
??????????????????????????? ? ----------????????? ----------? ?----------
??????????????????????????? ? SMITH?????411.589872 405.699876
??????????????????????????? ? ALLEN?????409.423205 403.603102
??????????????????????????? ? WARD??????409.356539 403.538586
??????????????????????????? ? JONES?????408.056539 402.183747
??????????????????????????? ? MARTIN????402.089872 396.345037
?????????????????? selectnext_day(sysdate, '星期六') from dual ;
?????????????????? NEXT_DAY(SYSDA
?????????????????? --------------
?????????????????? 11-10月-14
?
4 數據類型轉換
? ?????select * from emp where hiredate >'01-1月 -81'
A? 日期相關類型轉換
???????? 比這個日期都要大的08-9月 -81 所有員工信息 按照三種方式實現
??? (1):隱式類型轉換
???????? select*
from emp
???????? ????? where hiredate > '01-1月 -81';
???(2):字符串轉成日期..顯示類型轉換
???????? select*
from emp
???????? ????? where hiredate > to_date('1981-01-0102:03:04', 'yyyy-mm-dd hh24:mi:ss');
???(3):日期轉換成為日期類型的字符串:
???????? select*
from emp
???????? ????? where to_char(hiredate, 'yyyy-mm-ddhh24:mi:ss') > '1981-01-01 02:03:04'
????????
5? 數字和字符串轉換
A? --查詢員工的薪水:兩位小數 本地貨幣代碼 千位符
Y1,250.00
select empno, ename, to_char(sal, 'L9,999.99')
?????????????????? fromemp
???????? 結果:
EMPNO ENAME?????TO_CHAR(SAL,'L9,999
??????????????????????????? ?---------- ---------- -------------------
??????????????????????????? 7369SMITH???????????????? ¥800.00
??????????????????????????? 7499ALLEN?????????????? ¥1,600.00
??????????????????????????? 7521WARD??????????????? ¥1,250.00
??????????????????????????? 7566JONES?????????????? ¥2,975.00
??????????????????????????? 7654MARTIN????????????? ¥1,250.00
??????????????????????????? 7698BLAKE?????????????? ¥2,850.00
??????????????????????????? 7782CLARK?????????????? ¥2,450.00
???????????????????????????
B? 把這個字符¥1,250.00,轉成數字.....
???????? ?select to_number('¥1,250.00','L9,999.99') from dual ;
???????? ?TO_NUMBER('¥1,250.00','L9,999.99')
???????? ?-----------------------------------
???????????????????????????????????? ????? 1250
6 通用函數
A? 給員工漲工資:總裁 1000? 經理:800? 其他漲500,
?===============================================
分析:前后工資給列出來
if (job == 'PRESIDENT')
???????? ??? SAL+1000
else if (job == 'MANAGER')??????
???????? ??? SAL+800
else?
???????? ??? SAL+500
???================================================
???????? 使用的知識點:
CASE expr WHEN comparison_expr1 THEN return_expr1
?????????[WHEN comparison_expr2 THENreturn_expr2
?????????WHEN comparison_exprn THEN return_exprn
?????????ELSE else_expr]
END
===============================================
??? 轉化:
CASE job when 'PRESIDENT' then sal+1000
?????????????????? when'MANAGER' then sal+800
??????????????????????????? elsesal + 500
END
??? =============================================
select ename, job, sal 漲前工資,
??????? ? (
???? ????????? CASE job when 'PRESIDENT' then sal+1000
???????? ??? ???????????????????????????????????? when'MANAGER' then sal+800
???????? ??? ???????????????????????????????????? elsesal + 500
??????????????????????????? END
??????? ? )
??????? ?漲后工資
???? from emp
????-----------------------------------------------------------------------------------------------------
???? 結果:
???????????????????????????????????? ENAME????? JOB???????? 漲前工資?? 漲后工資
???????????????????????????????????? ------------------- ---------- ----------
???????????????????????????????????? SMITH????? CLERK??????????? 800?????? 1300
???????????????????????????????????? ALLEN????? SALESMAN??????? 1600?????? 2100
???????????????????????????????????? WARD?????? SALESMAN??????? 1250?????? 1750
???????????????????????????????????? JONES????? MANAGER???????? 2975?????? 3775
???????????????????????????????????? MARTIN???? SALESMAN??????? 1250?????? 1750
???????????????????????????????????? BLAKE????? MANAGER???????? 2850?????? 3650
???????????????????????????????????? CLARK????? MANAGER???????? 2450?????? 3250
???????????????????????????????????? SCOTT????? ANALYST???????? 3000?????? 3500
???????????????????????????????????? KING?????? PRESIDENT?????? 5000?????? 6000
???????????????????????????????????? TURNER???? SALESMAN??????? 1500?????? 2000
???????????????????????????????????? ADAMS????? CLERK?????????? 1100?????? 1600
???????????????????????????????????? JAMES????? CLERK??????????? 950?????? 1450
???????????????????????????????????? FORD?????? ANALYST???????? 3000?????? 3500
???????????????????????????????????? MILLER???? CLERK?????????? 1300?????? 1800
????????????????????????????????????
???????????????????????????????????? 已選擇14行。
?
B?? 第二種方法
? ===================================================
??? 語法:
DECODE(col|expression, search1, result1
??????????????????????????? ???[, search2, result2,...,]
??????????????????????????? ???[, default])
==================================================
轉化:
decode(job, 'PRESIDENT', sal+10000, 'MANAGER', sal+800, sal+500)
===================================================
select ename, job, sal 漲前工資,
??? ???????? (
??? ???????????????? decode(job, 'PRESIDENT', sal+10000,'MANAGER', sal+800, sal+500)
??????? ???)
??????? ??? 漲后工資
????? from emp;
總結
以上是生活随笔為你收集整理的5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美团借钱可以提前还款吗
- 下一篇: 6.组函数(avg(),sum(),ma