03_單行函數 oracle學習筆記





select ...
from ...
where ....
order by ....






多行函數

SQL> select count(*) from emp;

 COUNT(*)
----------
       14
字符函數        

 1  select Lower('Hello') 轉小寫, upper('hello') 轉大寫, initcap('hello woRld')  首字母大寫
 2*    from dual
SQL> /

轉小  轉大  首字母大寫
----- ----- -----------
hello HELLO Hello World

select  concat('hello', 'world') from dual
 

 
SQL> select  concat (concat('hello', 'world'), 'cccc')  函數嵌套 from dual;

函數嵌套
--------------
helloworldcccc
 

CONCAT('HE
----------
helloworld
SUBSTR(a,b) --- 從a中第b位 去字符串
substr(a, b, c) 從a中第b位, c個字符....


 
SQL> select substr('abcdefg1111', 2) 從第二位取子串,  substr('abcdefg1111', 2, 4) 取4個字符 from dual;

從第二位取 取4
---------- ----
bcdefg1111 bcde




--length字符數 --lengthb字節數
--一箇中文字符,兩個字節



SQL> select length('中國abc') 字符數,   lengthb('中國abc') 字節數 from dual;

   字符數     字節數
---------- ----------
        5          

SQL> \


SQL> select instr('abcdefg', 'efg')  求子串位置 from dual;

求子串位置
----------
        5
        
SQL> select lpad('abcd', 10, '*') lpad,         rpad('abcd', 10, '*') rpad from dual;


LPAD       RPAD
---------- ----------
******abcd abcd******     

--trim 去掉前後指定的字符,字符可以是空格,也可以不是空格 .
SQL> select trim('A' from 'ABCDEFg') from dual;

TRIM('
------
BCDEFg




========數字函數
//2 > 0 表 保留小數點2位
// 0      保留個位
//-1 保留10位
//-1 保留百位 (要看十位 四捨五入)
  1  select round(45.926, 2) AA, round(45.926, 1) BB, round(45.926, 0) CC, round(45.926) DD,
  2* round(45.926, -1) EE, round(45.926, -2) FF from dual
  3  /


        AA         BB         CC         DD         EE         FF
---------- ---------- ---------- ---------- ---------- ----------
     45.93       45.9         46         46         50          0




=========日期
時間的計算.......
oracle數據庫中 date包含 日期和時間
mysql   3中數據類型 date time times.....



select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual ;

SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual ;

TO_CHAR(SYSDATE,'YY
-------------------
2014-10-07 16:34:17

----昨天今天明天
select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;

select to_char(sysdate-1, 'yyyy-mm-dd hh24:mi:ss')  昨天, sysdate 今天, sysdate+1 明天 from dual;

----查詢員工的入職時間,按照 周 月  年 方式顯示.....

select (sysdate-hiredate)/7 周,   (sysdate-hiredate)/30 月,  (sysdate-hiredate)/365 年
from emp;



 1  select (sysdate-hiredate)/7 周,   (sysdate-hiredate)/30 月,  (sysdate-hiredate)/365
 2* from emp
SQL> /

       周         月         年
---------- ---------- ----------
1763.95625 411.589791 33.8292979
1754.67053 409.423125 33.6512157
1754.38482 409.356458 33.6457363
1748.81339 408.056458  33.538887
1723.24196 402.089791  33.048476
1744.67053 407.089791 33.4594349
1739.09911 405.789791 33.3525856
1433.38482 334.456458 27.4895719
1716.09911 400.423125 32.9114897
1726.09911 402.756458 33.1032705
1428.52768 333.323125 27.3964212
1713.81339 399.889791 32.8676541
1713.81339 399.889791 32.8676541
1706.52768 398.189791 32.7279281


---查詢員工的入職時間, 入職月數 ....

select ename, (sysdate-hiredate)/30 估計月,  MONTHS_BETWEEN(sysdate, hiredate) 函數計算月
 from emp
 
 1  select ename, (sysdate-hiredate)/30 估計月,  MONTHS_BETWEEN(sysdate, hiredate) 函數計算月
 2*                              from emp
SQL> /

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
BLAKE      407.089872 401.216005
CLARK      405.789872 399.957941
SCOTT      334.456539  329.63536
KING       400.423205 394.699876
TURNER     402.756539 396.990199
ADAMS      333.323205 328.506328
JAMES      399.889872 394.151489
FORD       399.889872 394.151489
MILLER     398.189872 392.506328

已選擇14行。

select next_day(sysdate, '星期六') from dual 





SQL> select next_day(sysdate, '星期六') from dual ;

NEXT_DAY(SYSDA
--------------
11-10月-14


==========================數據類型轉換==============






  select *
 2  from emp
 3* where hiredate > '01-1月 -81'
日期相關類型轉換
---比這個日期都要大的08-9月 -81 所有員工信息 按照三種方式實現
 
select * from emp
where hiredate > '01-1月 -81'  --隱式類型轉換

select * from emp
where hiredate > to_date('1981-01-01 02:03:04', 'yyyy-mm-dd hh24:mi:ss') --字符串轉成日期...顯示類型轉換



select * from emp
where to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') > '1981-01-01 02:03:04'


 1  select * from emp
 2*    where hiredate > to_date('1981-01-01 02:03:04', 'yyyy-mm-dd hh24:mi:ss')
SQL> /

    EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
     7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
     7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
     7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
     7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
     7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
     7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
     7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
     7839 KING       PRESIDENT            17-11月-81           5000                    10
     7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
     7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
     7900 JAMES      CLERK           7698 03-12月-81            950                    30
     7902 FORD       ANALYST         7566 03-12月-81           3000                    20
     7934 MILLER     CLERK           7782 23-1月 -82           1300                    10
====================
數字和字符串轉換




--查詢員工的薪水:兩位小數 本地貨幣代碼 千位符
Y1,250.00


select empno, ename, to_char(sal, 'L9,999.99')
 from emp;



 1  select empno, ename, to_char(sal, 'L9,999.99')
 2*  from emp
SQL> /

    EMPNO ENAME      TO_CHAR(SAL,'L9,999
---------- ---------- -------------------
     7369 SMITH                 ¥800.00
     7499 ALLEN               ¥1,600.00
     7521 WARD                ¥1,250.00
     7566 JONES               ¥2,975.00
     7654 MARTIN              ¥1,250.00
     7698 BLAKE               ¥2,850.00
     7782 CLARK               ¥2,450.00
     7788 SCOTT               ¥3,000.00
     7839 KING                ¥5,000.00
     7844 TURNER              ¥1,500.00
     7876 ADAMS               ¥1,100.00
     7900 JAMES                 ¥950.00
     7902 FORD                ¥3,000.00
     7934 MILLER              ¥1,300.00

已選擇14行。




把這個字符¥1,250.00,轉成數字.....
select to_number('¥1,250.00', 'L9,999.99') from dual ;
 
 
SQL> select to_number('¥1,250.00', 'L9,999.99') from dual ;

TO_NUMBER('¥1,250.00','L9,999.99')
-----------------------------------
                              1250
通用函數

=======條件表達式 做報表


-給員工漲工資:總裁 1000  經理:800  其他漲500,
前後工資給列出來


  PRESIDENT


MANAGER


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 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END


CASE job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal + 500
END








 select ename, job, sal 漲前工資, 
  (
        CASE job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal + 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行。
 




第二種方法




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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章