在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)/365 年1
FROM EMP;