1. 程式人生 > >ORACLE---Unit02: Oracle字符串操作 、 Oracle數值操作 、 Oracle日期操作 、 空值操作

ORACLE---Unit02: Oracle字符串操作 、 Oracle數值操作 、 Oracle日期操作 、 空值操作

其它 sca 需要 一個 rtrim unit con ava 空字符

---DQL:數據查詢語句
---SELECT語句中必須包含至少兩個字句,分別是SELECT字句與FROM字句。
---SELECT子句用來指定要查詢的字段,
---FROM子句用來定制數據來源的表。 --SELECT語句用來查詢表中數據,一條SQL語句是由多個子句組成,
--一個子句有一個關鍵字加一系列內容組成。
--SELECT語句中必須含有的是兩個子句,
--SELECT子句和FROM子句
--SELECT子句用於指定要查詢的內容(字段,函數,表達式),
--FROM子句用來指定數據來源的表。 ---SELECT中除了可以指定報表中具體字段外,還可以指定一個函數或表達式。 ---*星代表所有字段
SELECT * FROM emp_RR; SELECT empno,ename,job,sal FROM emp_RR;
-->查看每個員工的年薪
SELECT ename,sal,sal*12 FROM emp_RR; ---SELECT語句中添加WHERE字句,可以僅查詢出滿足條件的記錄。
--->只看四個字段,只看部門號為20的。
SELECT ename,job,sal,deptno FROM emp_RR WHERE deptno=20;
--->工資大於2500
SELECT ename,job,sal,deptno FROM emp_RR WHERE sal>2500; -->變成一列,java中的加號。連接號
SELECT CONCAT(ename,sal) FROM emp_RR; ---字符串函數
---CONCAT和"||"
---1.CONCAT(char1,char2)
---返回兩個字符串連接後的結果,兩個參數char1、char2是要連接的兩個字符串。
---等價操作:連接操作符"||"
---如果char1和char2任何一個為NULL,相當於連接了一個空格
SELECT CONCAT(ename,sal)FROM emp_RR;
SELECT CONCAT(CONCAT(ename,‘:‘),sal)FROM emp_RR;
---多個字串連接,用||更直觀
SELECT ename||‘:‘||sal FROM emp_RR; --->SMITH的工資是800所在部門號為20
SELECT ename||‘:‘||sal||‘:‘||deptno FROM emp_RR WHERE ename=‘SMITH‘ AND deptno=20; --->LENGTH函數:字符串長度(個數)
---對CHAR來說,沒有意義,因為CHAR是定長。
---2.LENGTH(char)
---用於返回字符串的長度
---如果字符類型是VARCHAR2,返回字符的實際長度
---如果字符類型是CHAR,長度還要包括後補的空格 ---獲取指定字符串的長度
--->查看每個員工名字的字符個數?
SELECT ename,LENGTH(ename) FROM emp_RR;
--->名字為4個字母的員工?
SELECT ename FROM emp_RR WHERE LENGTH(ename)=4; ---3.LOWER,UPPER,INITCAP
---將字符串轉換為全小寫,全大寫,首字母大寫
---dual:偽表
---當查詢的數據與任何表沒有關系時,可以查詢偽表,這樣只會查詢出一條記錄。 SELECT UPPER(‘helloworld‘)FROM emp_RR;
--->出現14條數據,從自己表內查。
---dual:偽表,當查詢的內容不是任何表中數據時,可以用偽表代替。
---在INITCAP中,支持顯示空格。
SELECT
UPPER(‘helloworld‘),
LOWER(‘HELLOWORLD‘),
INITCAP(‘HELLO WORLD‘)
FROM dual;
---屏蔽大小寫應用:
---如果是要轉換大小寫,在字母前加UPPER()或LOWER().
SELECT ename,sal,deptno FROM emp_RR WHERE UPPER(ename)=UPPER(‘scott‘); ---4.TRIM,LTRIM,RTRIM
---去除兩邊的空白,空白是空格的一種,數據庫中更強勁點,你想去啥就去啥。
--->去除字符串兩側的指定字符內容
SELECT TRIM(‘e‘ FROM ‘eeeeeliteeeee‘)FROM dual;
--->lit SELECT
LTRIM(‘estestestestliteeeeeee‘,‘est‘)
FROM dual;
--->liteeeeeee SELECT
RTRIM(‘estesetsetsetsliteeeeeeeeeee‘,‘e‘)
FROM dual;
--->estesetsetsetslit SELECT
LTRIM(‘esfffrfsfefliteseseses‘,‘efs‘)
FROM dual;
--->rfsfefliteseseses
---只要字符串中有其中之一,左邊的字符都被幹掉。 ---5.LPAD(char1,n,char2),RPAD
---補位函數,將char1顯示n位,若char1不足n位時,左(右)補充若幹個char2字符已達到位數。
SELECT ename,sal,LPAD(sal,15,‘$‘)FROM emp_RR;
---LPAD、RPAD補位函數(左右補$符號)寫3的話,超出部分會被刪除。
SELECT ename,sal,RPAD(sal,3,‘ ‘)FROM emp_RR; ---6.SUBSTR(char,m[,n])
---方括號裏面的內容是可有可無的
---截取char字符串,從m處開始,連續截取n個字符。
---需要註意:數據庫中下標都是從1開始的!!!
---n若不指定或指定的數字超過可以截取的實際字符長度時,都是截取到當前字符串末尾。n是長度。
---若m為負數,則是從倒數位置開始截取。末尾數字不能為負數.
SELECT SUBSTR(‘thinking in FROM dual;
--->in
SELECT SUBSTR(‘thinking in FROM dual;
--->in
--->n=-2是null ---7.INSTR(char1,char2[,n[,m]])
---查看char2在char1中的位置,n和m不指定默認都是1
---n表示從第幾個字符開始查找
---m表示查看第幾次出現
SELECT INSTR(‘thinking in FROM dual;
--->3
SELECT INSTR(‘thinking in FROM dual;
--->3,還是3
SELECT INSTR(‘thinking in FROM dual;
--->6
SELECT INSTR(‘thinking in FROM dual;
--->10
SELECT INSTR(‘thinking in FROM dual;
--->0
--->java中沒有返回-1,oracle中返回0.
---需要註意:數據庫中下標都是從1開始的!!!0表示沒有了。
---數值類型:
---1.NUMBER(P)表示整數
---完整語法:NUMBER(Precision,scale)
--如果沒有設置scale,則默認取值0,即NUMBER(p)表示整數
--P表示數字的總位數,取值為1-38
---用來在表中存放如編碼、年齡、次數等用整數記錄的數據
CREATE TABLE student_RR(
id NUMBER(4),
name CHAR(20)
);
DESC student_RR ---2.NUMBER(P,S)表示浮點數
---NUMBER(precision,scale)
--precision:NUMBER可以存儲的最大數字長度(不包括左右兩邊的0)
--scale:在小數點右邊的最大數字長度(包括左側0)
--指定了s但是沒有指定p,則p默認為38,如:
--列明number(*,s)
--經常用來做表中存放金額、成績等有小數位的數據
CREATE TABLE student_RR(
id NUMBER(4),
name CHAR(20),
score NUMBER(5,2)
);
DESC student_RR
---NUMBER的變種數據類型:內部實現是NUMBER,可以將其理解為NUMBER的別名,目的是多種數據庫及編程語言兼容
--numeric(p,s):完全映射至NUMBER(p,s)
--decimal(p,s)或DEC(p,s):完全映射至NUMBER(p,s)
--integer或int:完全映射至NUMBER(38)類型
--smallint:完全映射至NUMBER(38)類型
--float(b):映射至NUMBER類型
--double precision:映射至NUMBER類型
--real:映射至NUMBER類型
---數字函數
--1.ROUND(n[,m])
--保留n小數點後m位。
--m不寫默認為0,即:保留到整數位
--m若為負數,則是保留10位以上的數字

--ROUND(m,n):四舍五入(武則天:5則天以為)
--保留m到小數點後n位
--n為0或不指定這是保留到整數
--n為負數這是保留到小數點前的位數
SELECT ROUND(45.678,2)FROM DUAL;
--->45.68
SELECT ROUND(45.678,0)FROM DUAL;
--->46
SELECT ROUND(45.678,-1)FROM DUAL;
--->50
---負數-1就是看個位,進10位
SELECT ROUND(45.678,-2)FROM DUAL;
--->0
SELECT ROUND(55.678,-2)FROM DUAL;
--->100 ---2.TRUNC(n[,m])
---截取數字
---參數意義與ROUND一致
---不進行四舍五入,直接截取數字
SELECT TRUNC(45.678,2)FROM dual;
--->45.67
SELECT TRUNC(45.678,0)FROM dual;
--->45
SELECT TRUNC(45.678,-1)FROM dual;
--->40
SELECT TRUNC(45.678,-2)FROM dual;
--->0
SELECT TRUNC(55.678,-2)FROM DUAL;
--->0 ---3.MOD
---求余數,相當於
---m除以n求余數,n若為0則直接返回m ---MOD(m,n):返回m除以n後的余數
---n為0則直接返回m
---薪水值按1000取余數
SELECT ename,sal,MOD(sal,1000)FROM emp_RR; ---4.CEIL和FLOOR:向上取整,向下取整
---硬是翻譯過來是:天花板和地板
---n就是個整數值
SELECT CEIL(45.678)FROM DUAL;
--->46
SELECT FLOOR(45.678)FROM DUAL;
--->45 ---日期類型相關函數: ---日期相關關鍵字:
---1.SYSDATE:返回一個表示當前系統時間的DATE的值
---2.SYSTIMESTAMP:返回當前時間的時間戳類型值
SELECT SYSDATE FROM dual;
--->22-8月 -17
SELECT SYSTIMESTAMP FROM dual;
--->22-8月 -17 03.42.51.562000000 下午 +08:00
--INSERT INTO emp(ename,hiredate) VALUES (‘jack‘,SYSDATE); ---日期轉換函數
---1:TO_DATE()
---將給定字符串按照給定的日期格式解析為一個DATE值
---日期格式字符串中不是字母或符號的其他字符都需要使用雙引號括起來。
---單引號:表示字符串
SELECT TO_DATE(‘1990-09-13 21:55:21‘,‘YYYY-MM-DD HH24:MI:SS‘)FROM dual;
--->13-9月 -90
SELECT TO_DATE(‘1990年09月13日 21時55分21秒‘,
‘YYYY"年"MM"月"DD"日" HH24"時"MI"分"SS"秒"‘)FROM dual;
--->13-9月 -90 ---註意:RR與YY是有區別的,RR與YY都是用兩位數字表示年,但是
---當使用TO_DATE函數將兩位數字解析為實際日期時,RR會自行判定實際,而YY不會。
SELECT TO_DATE(‘99-09-13‘,‘YY-MM-DD‘)FROM dual;
--->13-9月 -99
SELECT TO_CHAR(TO_DATE(‘99-10-18‘,‘YY-MM-DD‘),‘YYYY-MM-DD‘)FROM dual;
--->2099-10-18 --->見圖sys和user世紀對比圖:
SELECT TO_CHAR(TO_DATE(‘49-10-21‘,‘RR-MM-DD‘),‘YYYY-MM-DD‘)FROM dual;
--->2049-10-21
SELECT TO_CHAR(TO_DATE(‘61-10-21‘,‘RR-MM-DD‘),‘YYYY-MM-DD‘)FROM dual;
--->1961-10-21 ---2.TO_CHAR函數
---將其它類型的數據轉換為字符類型
SELECT TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘)FROM dual;
--->2017-08-22 16:07:35 ---日期可以進行計算
---1.對一個日期加減一個數字,等同於計算加減天數
---2.兩個日期相減,差為相差的天數
---日期之間比大小,越晚的越大。 ---查看100天以後是哪天?
SELECT SYSDATE+100 FROM dual;
--->30-11月-17 ---查看每個員工入職到今天為止共多少天?
SELECT ename,SYSDATE-HIREDATE FROM emp_RR;
--->一萬三多天,大部分是八幾年入職的。
---日期常用函數:
---1.LAST_DAY(date)
---返回給定日期所在月的月底日期
---LAST_DAY(date):返回日期date所在月的最後一天
---在按照自然月計算某些業務邏輯,或者安排月末周期性活動時很有用處 ---查看當前日期月底?
SELECT LAST_DAY(‘20-2月-09‘)FROM DUAL;
--->28-2月 -09 ---查看當月月底?
SELECT LAST_DAY(SYSDATE)FROM dual;
--->31-8月 -17 SELECT ename,LAST_DAY(hiredate)FROM emp_RR;
--->每位員工入職當月月底時間。 ---2.ADD_MONTHS(date,i)
---對指定日期加上指定月,若i為負數則是減去
---ADD_MONTHS(date,i):返回日期date加上i個月後的日期值
--參數i可以是任何數字,大部分時候取正值整數
--如果i是小數,將會被截取整數後再參與運算
--如果i是負數,則獲得的是減去i個月後的日期值
--計算職員入職20周年紀念日
SELECT ename,ADD_MONTHS(hiredate,20*12)as "20周年" FROM emp_RR; ---查看每個員工的轉正日期?
SELECT ename,ADD_MONTHS(hiredate,3)FROM emp_RR;
---3.MONTHS_BETWEEN(date1,date2)
---計算兩個日期之間相差多少個月,計算方式使用date1-date2得到的。
--查看每個員工入職到今天為止共多少個月?
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate)FROM emp_RR; ---4.NEXT_DAY(date,i)
---返回給定日期第二天開始算一周之內指定周幾對應的日期
---NEXT_DAY(date,i)
---返回給定日期第二天開始一周內的周幾的日期。i表示周幾:
---1為周日。2為周一,以此類推。
SELECT NEXT_DAY(SYSDATE,6)FROM dual;
--->25-8月 -17 --NEXT_DAY(date,char):返回date日期數據的下一個周幾,周幾是由參數char來決定的
--在中文環境下,直接使用“星期三”這種形式,英文環境下,需要使用“wednesday”
--這種英文的周幾。為避免麻煩,可以直接用數字1-7表示周日-周六
--NEXT_DAY不是明天!
--查詢下個周三是幾號
SELECT NEXT_DAY(SYSDATE,4)as "NEXT_WEDN" FROM DUAL;
--->23-8月 -17 ??????????????????????????????????????????????????????????????????????
---查詢下個周三是幾號?
---昨天輸出執行是今天的日期???今天輸出執行是下周三的日期。(此部分還需要在研究研究)
--->30-8月 -17
SELECT NEXT_DAY(SYSDATE,4)as NEXT_WEDN FROM dual;
--->23-8月 -17
--->30-8月 -17
SELECT NEXT_DAY(SYSDATE,5)as NEXT_WEDN FROM dual;
--->24-8月 -17 ---NEXT_DAY 查詢下個n是幾號?
---按照國外的周概念查詢,按照中國的就要加一。
SELECT NEXT_DAY(TO_DATE(‘2017-03-01‘,‘YYYY-MM-DD‘),7)FROM dual; ---5.LEAST和GREATEST
---最小值與最大值,凡是可以比較大小的數據類型都可以使用這兩個函數
---對於日期當中,最大值即最晚的日期,最小值即最早的日期 ---GREATEST(expr1[,expr2[,expr3]]...)
---LEAST(expr1[,expr2[,expr3]]...)
---也被稱作比較函數,可以有多個參數值,返回結果是參數列表中最大或最小的值
---參數類型必須一致
---在比較值錢,在參數列表中第二個以後的參數會被隱含的轉換為第一個參數的數據類型,
---所以如果可以轉換,則繼續比較,如果不能轉換將會報錯
SELECT LEAST(SYSDATE,‘10-10月-08‘)FROM DUAL;
---> 10-10月-08 SELECT LEAST(SYSDATE,TO_DATE(‘2008-08-08‘,‘YYYY-MM-DD‘))FROM dual;
--->08-8月 -08
SELECT GREATEST(SYSDATE,TO_DATE(‘2008-08-08‘,‘YYYY-MM-DD‘))FROM dual;
--->23-8月 -17 ---6.EXTRACT
---提取一個日期中指定時間分量的值
SELECT EXTRACT(YEAR FROM SYSDATE)FROM dual;
--->2017 ---查看1980年入職的員工?
SELECT ename,sal,hiredate FROM emp_RR WHERE EXTRACT(YEAR FROM hiredate)=1980;
--->SMITH 800 17-12月-80 ---EXTRACT(date FROM datetime):從參數datetime中提取參數date指定的數據,比如提取年、月、日
SELECT EXTRACT(YEAR FROM SYSDATE)CURRENT_YEAR FROM dual;
--->2017
SELECT EXTRACT(HOUR FROM TIMESTAMP‘2008-10-10 10:10:10‘)FROM dual;
--->10
---NULL(空即是NULL,NULL即是空)
---數據庫裏的重要概念:NULL,即空值
---有時表中的某些字段值,數據未知或暫時不存在,取值NULL
---任何數據類型均可取值NULL ---空和空字符串
---空---客觀上不存在;空字符串---客觀存在看不見。
---(有一個字符串了,看不見。這就好比空氣和真空,空字符串就好比空氣,它客觀是存在的,只不過你看不見,
--- NULL就是客觀上根本不存在。計算機裏NULL客觀不存在,NULL在內存裏根本沒有,而字符串是以二進制存在的。) ---在Java中null和空字符串的區別?
---null:客觀不存在,在內存裏面沒有。(真空)
---空字符串:客觀在內存裏面是有編碼的,只不過顯示出來時,看不見。(屬於客觀存在)(空氣)
---好比空氣和真空的概念,空氣客觀存在,只是你看不見。null是真空,客觀不存在。 ---空值操作:
---插入空值
CREATE TABLE student_R(id NUMBER(4),name CHAR(20),gender CHAR(1));
--->table STUDENT_R 已創建。
INSERT INTO student_R VALUES(1000,‘李莫愁‘,‘F‘);
--->1 行已插入。
INSERT INTO student_R VALUES(1001,‘林平之‘,NULL);
--->1 行已插入。(顯式插入NULL值)
INSERT INTO student_R(id,name)VALUES(1002,‘張無忌‘);
--->1 行已插入。(隱式插入NULL值)
SELECT * FROM student_R; ---2:更新NULL值
UPDATE student_R SET gender=NULL WHERE id=1000;
--->1 行已更新。
SELECT * FROM student_R;
ROLLBACK;
--->回退完成。 ---作為條件判斷NULL值:
---判斷藥使用IS NULL和IS NOT NULL 不能使用"="判斷NULL.
DELETE FROM student_R WHERE gender=NULL;
SELECT *FROM student_R;
--->0 行已刪除。
---NULL不是值,只能說是一種狀態。從邏輯上講,=null等於空,嚴格意義上是不對的。(數據庫中比Java中要嚴謹)
---在數據庫中,在判斷一個字段的值是不是null時,不能寫=nuul,因為沒有任何值是=null的。
---註意:寫is null
DELETE FROM student_R WHERE gender IS NULL;
--->2 行已刪除。
DELETE FROM student_R WHERE gender IS NOT NULL;
--->1 行已刪除。 ---NULL的運算
---NULL與字符串連接等於什麽也沒幹。
---NULL與數字運算,結果還是NULL
SELECT ename||NULL FROM emp_RR; ---JAVA中與字符串相連?
---Java中與字符串拼接,就真的拼了個null
---package oracle; --public class Demo {
-- public static void main(String[]args){
-- String str=null;
-- System.out.println("str:"+str);
-- }
--} --->str:null ---和數字運算,結果還是null。
---查看每個員工的收入(工資加績效)
SELECT ename,sal,comm,sal+comm FROM emp_RR; ---空值函數
---1.NVL(a1,a2)
---當a1為NULL時,函數返回a2,否則返回a1自身,所有函數作用是將NULL值替換為指定值。
SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_RR;
---計算員工月收入
SELECT ename,sal,comm,sal+NVL(comm,0)as "salary"FROM emp_RR; ---查看每個員工的績效,有績效的則顯示為“有績效”為NULL的則顯示為“沒有績效”。
---2.NVL2(a1,a2,a3)
---當a1不為NULL時,函數返回a2;當a1為NULL時,函數返回a3
SELECT ename,comm,NVL2(comm,‘有績效‘,‘沒有績效‘)FROM emp_RR; ---NVL2可以實現NVL的功能,但是NVL不能全實現NVL2的功能。
SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_RR;
SELECT ename,sal,comm,sal+NVL2(comm,comm,0) FROM emp_RR;
SELECT ename,sal,comm,NVL2(comm,sal+comm,sal) FROM emp_RR; ---NVL2(expr1,expr2,expr3):和NVL函數功能類似,都是將NULL轉變為實際值
---NVL2用來判斷expr1是否為NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3.
SELECT ename,sal,comm,nvl2(comm,sal+comm,sal)as"salary"FROM emp_RR; *******************************************************************************************

ORACLE---Unit02: Oracle字符串操作 、 Oracle數值操作 、 Oracle日期操作 、 空值操作