轉換函數,三種數據類型函數

在EMP表中,查詢工資在2000元以上的姓名以及工作。

SELECT ENAME  姓名,
       SAL 工資,
       ENAME ||' 的工資是: '||SAL  姓名工資
FROM EMP 
WHERE SAL > 2000 ;

隱式轉換

數據庫會自動幫我們對不同的數據進行數據類型轉換,以實現數據的合併,更新,判斷。

ORACEL 數據庫常用的數據類型:

   VARCHAR2()  字符
    NUMBER()   數字
    DATE       日期

ORACLE 中有三個轉換函數:

 to_char() 字符轉換
 to_number() 數字轉換
 to_date()   日期轉換

把日期按YYYY-MM-DD格式輸出

SELECT HIREDATE ,TO_CHAR(HIREDATE,'YYYY-MM-DD')
FROM EMP 

把2019/12/18字符,轉換成日期,並按YYYY/MM/DD格式輸出

SELECT * FROM TEST1;
INSERT INTO TEST1(s_bir)VALUES( to_date('2019/12/18', 'YYYY/MM/DD') );
SELECT '2019/12/18' ,to_date('2019/12/18', 'YYYY/MM/DD') FROM DUAL;

把字符1234轉換成數字1234

SELECT TO_NUMBER('1234') , TO_NUMBER('1234') + 1234  FROM DUAL;

字符函數

   SELECT SYSDATE  FROM DUAL;

把時間類型轉換成字符類型輸出

   SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM DUAL;--把系統時間轉換成字符,按YYYY-MM-DD格式輸出
   SELECT TO_CHAR(SYSDATE,'YYYY'),--系統時間 年份
   		  TO_CHAR(SYSDATE,'MM'),--系統時間 月份
   		  TO_CHAR(SYSDATE,'DD')--系統時間 天
    FROM DUAL;
   SELECT TO_CHAR(SYSDATE,'Q') FROM DUAL;--季度

concat連接函數,與管道符 || 功能類似

   SELECT ascii('a') ,ASCII('A')  ,concat('abc','def') ,'abc'||'def'FROM dual;

字母a,在字符 ‘DEFaBC’ 第一次出現的位置

   SELECT INSTR('DEFaBC','a') FROM DUAL;

小寫轉換函數LOWER,大寫轉換函數UPPER

 SELECT  LOWER('aAbB'), UPPER('aAbB') FROM dual;

模糊查詢 LIKE

 SELECT ename ,LOWER(ename)
   FROM emp 
   WHERE LOWER(ename) LIKE '%a%'

替換函數REPLACE(‘ABCDEF’ ,‘EF’,‘CBA’),用CBA,替換ABCDEF中的EF

 SELECT 'AB C    D  EF   ' ,
         REPLACE('AB C    D  EF   ' ,' ','') ,
         REPLACE('ABCDEF' ,'EF','CBA'),
         --可以多層套REPALCE函數
         REPLACE( REPLACE('AB C    D  EF   ' ,' ','')  ,'EF','CBA' )
   FROM DUAL;

SUBSTR截圖函數

--截取函數SUBSTR
--返回'ABCDE'的字串,從第2位處開始,截取3個字符
SELECT SUBSTR('ABCDE',2,3) FROM DUAL;  
 SELECT ENAME ,SUBSTR(ENAME,1,3) FROM EMP;

數字函數

   SELECT POWER(2,3) FROM DUAL;--2的3次冪 等於8
   --ROUND 四捨五入函數,ROUND(AVG(SAL) ,4) 保留四位小數,
   --TRUNC 截取,TRUNC(AVG(SAL),4) 
   SELECT AVG(SAL) ,ROUND(AVG(SAL) ,4) ,TRUNC(AVG(SAL),4) FROM EMP ;

日期函數

   SELECT SYSDATE, ADD_MONTHS(SYSDATE, 1) FROM DUAL;--加一個月
   SELECT SYSDATE, LAST_DAY(SYSDATE) FROM DUAL;--本月最後一天
   SELECT HIREDATE ,LAST_DAY(HIREDATE) FROM EMP;
-- 按月四捨五入 、截取
--一個月內過了15號,round以後顯示的是下個月的第一天,15號之內顯示的都是本月第一天
--TRUNC 按月取,是本月的第一天
   SELECT SYSDATE ,ROUND(SYSDATE,'MM') ,TRUNC(SYSDATE,'MONTH')  FROM DUAL;   
   
   -- 按年四捨五入 、截取
   --一年內過了6月份,ROUND 顯示的是明年的第一天,6月份之內顯示的都是本邊第一天
--TRUNC 按年取,是本年的第一天
   SELECT SYSDATE ,ROUND(SYSDATE,'YYYY') ,TRUNC(SYSDATE,'YEAR')  FROM DUAL;  
   
   -- 按星期四捨五入 、截取
 --一星期內過了週三,ROUND 顯示的是一週的第一天,一週的前三天顯示的都是本週第一天
--TRUNC 按星期取,是本週的第一天
   SELECT SYSDATE ,ROUND(SYSDATE,'DAY') ,TRUNC(SYSDATE,'DAY')  FROM DUAL;   
    
  -- 按季度四捨五入 、截取

   SELECT SYSDATE ,ROUND(SYSDATE,'Q') ,TRUNC(SYSDATE,'Q')  FROM DUAL;        
   
   SELECT HIREDATE ,ROUND(HIREDATE,'MM'),TRUNC(HIREDATE,'MM') FROM EMP;
--nvl(comm,0) 如果comm 爲null,則顯示 0;
--NVL2(comm,123,456) 如果comm 不爲 null,則顯示 123,若爲 null,則顯示 456
SELECT comm ,nvl(comm,0) ,NVL2(comm,123,456) FROM emp;
   
 --去重函數 DISTINCT  
SELECT deptno FROM dept ;
SELECT DISTINCT deptno FROM emp ; 

-- NOT EXISTS  和 EXISIS
--EMP中不存在的部門
SELECT * 
FROM dept d
WHERE NOT  EXISTS ( SELECT 1 FROM emp WHERE deptno = d.deptno );

--EMP中存在的部門
SELECT * 
FROM dept d
WHERE   EXISTS ( SELECT 1 FROM emp WHERE deptno = d.deptno );

–IN 和 NOT IN

SELECT * 
FROM dept d
WHERE   d.deptno IN  ( SELECT deptno FROM emp );

SELECT * 
FROM dept d
WHERE   d.deptno NOT IN  ( SELECT deptno FROM emp );

--兩個時間之間相差幾個月
SELECT MONTHS_BETWEEN(SYSDATE ,TO_DATE('2019-11-1','YYYY-MM-DD')) FROM DUAL;
--月,年 計算
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE), 
   MONTHS_BETWEEN(SYSDATE,HIREDATE) /12, 
  SYSDATE - 1 前一天,
   (SYSDATE - HIREDATE)/3651
 FROM EMP;
發佈了46 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章