不错的SQL
Single-Row Functions
?? 單行函數
?? #Objectives
??? After compleing this lesson,you should be able to?
??? do the following:
???? -Describe variours types of function available
????? in SQL
???? -Use character,number,and date functions in?
????? SELECT?statements
???? -Describe the use of conversion functions
??
?? #SQL Functions?
??? -Two types of SQL Functions
???? ·Single-row functions (one to one)
???? ·Multiple-row functions (multiple to one)
??? -函數與過程的區別
??????? 函數是用來計算一個值或某些值,過程是主要用來完成某個動作.
??? -Single-Row Functions
????? ·Manipulate data items 操作數據項
????? ·Accept arguments and return one value 接受參數返回一個值
????? ·Act on each row returned 命令在每一行返回
????? ·Return one result per row 每行返回一個結果
????? ·May modify the data type 可以修改的數據類型
????? ·Can be nested 可以被嵌套
????? ·Accept arguments which can be a column or an
??????? expression 接受參數可以是一個欄位或一個表達式
??? -Single-Row Functions Types
????? ·Character 字符型
???????? -Case-Manipulation functions 字符大小寫處理的函數
????????? ㈠LOWER 全部小寫
????????? ㈡UPPER 全部大寫
????????? ㈢INITCAP 每個單詞開始的第一個位置大寫
???????????? function???????????? result
???????? lower('SQL Course')??? sql course
???????? upper('SQL Course')??? SQL COURSE
???????? initcap('SQL Course')? Sql Course??
???????? -Character-Manipulation functions 字符處理的函數?
????????? ㈠CONCAT 連接輸入的兩個參數
????????? ㈡SUBSTR 基于第一個參數的值,索引從第二個參數開始
?????????????????? 經過第三個參數長度的字符(索引基數為1)
????????? ㈢LENGTH 返回參數的長度
????????? ㈣INSTR 從參數一中索引,參數二中所對應的值,返回其索引
????????????????? 沒有返回0?????????
????????? ㈤LPAD|RPAD 參數一如果不夠參數二所指定的大小那么
????????????????????? 就左(右)填充參數三所指定的值添滿為止??????????????
????????? ㈥TRIM 從參數二中截取字符參數一返回,一次只能截取一個
???????????????? 字符且只能夠從參數兩端的第一個開始截取
????????? ㈦REPLACE 把參數一中的參數二替換成參數三如果不含參數三
??????????????????? 則把參數一中的參數二全部去掉
??????????????? function?????????????????? result
???????? CONCAT('Hello','world')?????????? Helloworld
???????? SUBSTR('Helloworld',6,5)????????? world
???????? LENGTH('Helloworld')????????????? 10
???????? INSTR('Helloworld','w')?????????? 6
???????? LPAD(SAL,10,'!')????????????????? !!!!!29000
???????? RLPAD(SAL,10,'!')???????????????? 29000!!!!!
???????? TRIM('h'from'helloworld')???????? elloworld
???????? REPLACE('helloworld','l','@')?????
????? ·Number 數字型
???????? -ROUND:Rounds value to specified decimal
?????????????? ROUND(45.926,2)------>45.93
???????? -TRUNC:Truncates?value to specified decimal
?????????????? TRUNC(45.926,2)------>45.92
???????? -MOD:Returns remainder of division
?????????????? MOD(1400,300)? ------>200
???????? 注意:如果ROUND、TRUNC的第二個參數為負是意思就是從
????????????? 小數點往左取如ROUND(45.926,-1)------>50
????? ·Date 日期型
???????? -SYSDATE:? 當前時間
????????????? sysdate---->12-2月 -07???
???????? -MONTHS_BETWEEN: 兩個時間點間的相差的月
????????????? MONTHS_BETWEEN(add_months(sysdate,6),sysdate)----->6
???????? -ADD_MONTHS: 在指定的時間點加入幾個月
????????????? ADD_MONTHS(sysdate,6)-------->12-8月 -07
???????? -NEXT_DAY: 返回指定時間點的下一個時間點
????????????? NEXT_DAY(sysdate,'星期一')------>19-2月 -07
???????? -LAST_DAY: 返回指定時間點的月的最后一天
????????????? LAST_DAY(sysdate)------>28-2月 -07
???????? -ROUND: 四舍五入
????????????? ROUND(last_day(sysdate))----->01-3月 -07
????????????? ROUND(sysdate,'month')---->01-2月 -07
????????????? ROUND(add_months(sysdate,5),'year')---->01-1月 -08
????????????? 當ROUND(sysdate,'year')中月大于6時返回01-1月 -08
???????? -TRUNC: 截取
????????????? TRUNC(last_day(sysdate))----->28-2月 -07
????????????? TRUNC(sysdate,'month')----->01-2月 -07
????????????? TRUNC(add_months(sysdate,5),'year')---->01-1月 -07
????? ·Conversion 轉換型
???????? -Implicit date type conversion 隱式數據類型的轉換
???????????????????? From????????? To
????????????? VERCHAR2 or CHAR???? NUMBER
????????????? VERCHAR2 or CHAR???? DATE
????????????? NUMBER?????????????? VERCHAR2
????????????? DATE???????????????? VERCHAR2
???????? -Explicit date type conversion?
??????????????????? TO_NUMBER?????????? TO_DATE?
??????????? NUMBER←=======→CHARACTER←=======→DATE
??????????????????? TO_CHAR???????????? TO_CHAR???
??????????? TO_CHAR: ...轉換成字符
?????????????? TO_CHAR(sysdate,'YYYY-month-dd')----->2007-2月 -12
?????????????? TO_CHAR(sysdate,'YYYY-month-day')----->2007-2月 -星期一
?????????????? TO_CHAR(293.936,'$999.99')------>$293.94
?????????????? TO_CHAR(293.936,'L999.99')------>RMB293.94
??????????? TO_NUMBER: ...轉換成數字
?????????????? TO_NUMBER('1200')----->1200
??????????? TO_DATE: ...轉換成日期
?????????????? TO_DATE('07-2月 -12')-----07-2月 -12
????? ·General 通用型
????????? -NVL(expr1,expr2):如果expr1,為null則expr2替換expr1
????????????? NVL(ename,'Not Name')
???????????????? -->如果字符型欄位ename為null則顯示字符Not Name
????????????? NVL(sal,0)
???????????????? -->如果數字型欄位sal為null則顯示數字0
????????????? NVL(hiredate,'03-12月-81')
???????????????? -->如果日期型欄位hiredate為null則顯示日期03-12月-81
????????????? 注意:在NVL(hiredate...中如果您輸入的日期格式不于hiredate
?????????????????? 欄位日期格式相匹配會報ORA-01861錯
例:
SQL> select ename,nvl(ename,'Not Name') from emp
? 2? where empno>7899;
ENAME????? NVL(ENAME,
---------- ----------
?????????? Not Name
FORD?????? FORD
MILLER???? MILLER
SQL>????????
????????? -NVL2(expr1,expr2,expr3):如果expr1,為null則expr3替換expr1
????????????????????????????????? 不為null則expr2替換expr1
例:
SQL> select ename,nvl2(ename,'Have Name','Not Name') from emp
? 2? where empno>7899;
ENAME????? NVL2(ENAM
---------- ---------
?????????? Not Name
FORD?????? Have Name
MILLER???? Have Name
SQL>?
????????? -NULLIF(expr1,expr2):如果expr1,expr2相等則顯
???????????????????????????? 示為null,否則顯示expr1
例:
SQL> select ename,job,nullif(length(ename),length(job)) from emp
? 2? where empno<7600;
ENAME????? JOB?????? NULLIF(LENGTH(ENAME),LENGTH(JOB))
---------- --------- ---------------------------------
SMITH????? CLERK
ALLEN????? SALESMAN????????????????????????????????? 5
WARD?????? SALESMAN????????????????????????????????? 4
JONES????? MANAGER?????????????????????????????????? 5
SQL>?
????????? -COALESCE(expr1,expr2......,exprn):從1開始直到n顯示最早
???????????????????????????????????????????? 一個不為null的值
?????????? 注意:在COALESCE()函數里表達式的類型必需相同可以用to_char
?????????????? 等轉換如果類型不同則報ORA-00932錯
例:
SQL>select ename,sal,comm,coalesce(ename,to_char(comm),to_char(sal)) coalesce from emp
? 2? where empno>7888;
ENAME???????????? SAL?????? COMM COALESCE
---------- ---------- ---------- ----------------------------------------
????????????????? 950??????????? 950
FORD???????????? 3000??????????? FORD
MILLER?????????? 1300??????????? MILLER
SQL>
????? -Conditional Expression 條件表達式
??????? ·Provide the use of IF-THEN-ELSE logic within a
????????? SQL statement
??????? ·Use two methods:
?????????? -CACE exptession?
例:
SQL> select empno,ename,job,sal,
? 2? case job when 'CLERK' then 1.1*sal
? 3?????????? when 'SALESMAN' then 1.3*sal
? 4?????????? when 'MANAGER' then 1.4*sal
? 5? else sal end? "++SAL"
? 6? from emp;
???? EMPNO ENAME????? JOB????????????? SAL????? ++SAL
---------- ---------- --------- ---------- ----------
????? 7369 SMITH????? CLERK??????????? 800??????? 880
????? 7499 ALLEN????? SALESMAN??????? 1600?????? 2080
????? 7521 WARD?????? SALESMAN??????? 1250?????? 1625
????? 7566 JONES????? MANAGER???????? 2975?????? 4165
????? 7654 MARTIN???? SALESMAN??????? 1250?????? 1625
????? 7698 BLAKE????? MANAGER???????? 2850?????? 3990
????? 7782 CLARK????? MANAGER???????? 2450?????? 3430
????? 7788 SCOTT????? ANALYST???????? 3000?????? 3000
????? 7839 KING?????? PRESIDENT?????? 5000?????? 5000
????? 7844 TURNER???? SALESMAN??????? 1500?????? 1950
????? 7876 ADAMS????? CLERK?????????? 1100?????? 1210
???? EMPNO ENAME????? JOB????????????? SAL????? ++SAL
---------- ---------- --------- ---------- ----------
????? 7900??????????? CLERK??????????? 950?????? 1045
????? 7902 FORD?????? ANALYST???????? 3000?????? 3000
????? 7934 MILLER???? CLERK?????????? 1300?????? 1430
已選擇14行。
?????????? -DECODE function
例:
SQL> run
? 1? select empno,ename,sal,job,
? 2? decode(job,'CLERK',1.1*sal,
? 3???????????? 'SALESMAN' ,1.15*sal,
? 4???????????? 'MANAGER' ,1.3*sal,
? 5???????? sal)
? 6? "SAL++"
? 7* from emp
???? EMPNO ENAME???????????? SAL JOB??????????? SAL++
---------- ---------- ---------- --------- ----------
????? 7369 SMITH???????????? 800 CLERK??????????? 880
????? 7499 ALLEN??????????? 1600 SALESMAN??????? 1840
????? 7521 WARD???????????? 1250 SALESMAN????? 1437.5
????? 7566 JONES??????????? 2975 MANAGER?????? 3867.5
????? 7654 MARTIN?????????? 1250 SALESMAN????? 1437.5
????? 7698 BLAKE??????????? 2850 MANAGER???????? 3705
????? 7782 CLARK??????????? 2450 MANAGER???????? 3185
????? 7788 SCOTT??????????? 3000 ANALYST???????? 3000
????? 7839 KING???????????? 5000 PRESIDENT?????? 5000
????? 7844 TURNER?????????? 1500 SALESMAN??????? 1725
????? 7876 ADAMS??????????? 1100 CLERK?????????? 1210
???? EMPNO ENAME???????????? SAL JOB??????????? SAL++
---------- ---------- ---------- --------- ----------
????? 7900?????????????????? 950 CLERK?????????? 1045
????? 7902 FORD???????????? 3000 ANALYST???????? 3000
????? 7934 MILLER?????????? 1300 CLERK?????????? 1430
已選擇14行。
?
???????????????????????????????????????????????? summaryIn this lesson ,you should have learned how to:
? ·Perform calculations on data using funtions
? ·Modify individual data items using funtions
? ·Manipulate output for groups of rows using
??? functions
? ·Alter date formats for display using functions
? ·Convert column data types using functions
? ·Use NVL functions
? ·Use IF-THEN-ELSE logic #Sql
總結
- 上一篇: SVM特点
- 下一篇: Endian Bitfiled