oracle bbde,循序漸進學Oracle之函數(重點)

單行函數―字符函數

雖然各個數據庫都是支持SQL語句的,但是每一個數據庫也有每一個數據庫自己所支持的操作函數,這些就是單行函數,而如果要想進行數據庫開發的話,除了要會使用SQL之外,就是要多學習函數。

單行函數主要分為以下五類:字符函數、數字函數、日期函數、轉換函數、通用函數;

1-字符函數:

字符函數的功能主要是進行字符串數據的操作,下面給出幾個字符函數:

* UPPER(字符串|列):將輸入的字符串變為大寫返回;

* LOWER(字符串|列):將輸入的字符串變為小寫返回;

* INITCAP(字符串|列):開頭首字母大寫;

* LENGTH(字符串|列):求出字符串的長度;

* REPLACE(字符串|列):進行替換;

*SUBSTR(字符串|列,開始點[結束點]):字符串截取:

Oracle之中有一點比較麻煩,即使要驗證字符串,也必須編寫完整的SQL語句,所以在Oracle數據庫之中為了用戶的查詢方便,故專門提供了一個“dual”的虛擬表。

范例1:觀察轉大寫的函數

SELECT UPPER('hello') FROM dual ;

4dc392abb1d6e3da9bedbde9196241d7.jpe

大寫轉換的用處: 在一般的使用之中,用戶輸入數據的時候去關心數據本身存放的是大寫還是小寫呢?

SELECT * FROM emp WHRER ename='&str';

此時如果輸入的是小寫,則肯定無法查詢出數據,所以這個時候不能要求用戶這么,故這個時候只能由程序自己去適應,加入一個函數:

SELECT * FROM emp WHERE ename=UPPER('&str');

當然以上的“&”(與)操作屬於替代變量的內容,此部分內容不做重點。

4447d0c930293870767d8584af526d1d.jpe

范例2:觀察轉小寫的操作,將所有的雇員姓名按照小寫字母返回;

SELECT LOWER('ename') FROM emp ;

c2828a761bfb32a153a68204bc1f9a7f.jpe

范例3:將每一個雇員姓名的開頭首字母大寫

SELECT INITCAP(ename) FROM emp ;

5190a67255b51bc91d4d83c4a5eacedc.jpe

范例4:查詢每個雇員姓名的長度

SELECT ename,LENGTH(ename) FROM emp ;

1d7928202002e648b4ebaadfeabeb502.jpe

范例5:要求查詢出雇員姓名長度正好是5的信息;

SELECT ename,LENGTH(ename) FROM emp WHERE LENGTH(ename)=5 ;

1d87413c304d21c84fbb177f77d12d92.jpe

范例6:使用字母“_”替換姓名中所有字母“A”的信息;

col REPLACE(ename,'A','_') FORMAT A50 ;SELECT REPLACE(ename,'A','_') FROM emp ;

5c6e226592e8dccb49457e6fdf0c19e9.jpe

字符串截取操作有兩種語法:

|-語法一:SUBSTPR(字符串|列,開始點),表示從開始點一直截以到結尾;

|-語法二:SUBSTPR(字符串|列,開始點,結束點),表示從開始點一直截以到結束點,截取部分內容;

范例7: 語法一:SUBSTPR(字符串|列,開始點),表示從開始點一直截以到結尾;

SELECT ename,SUBSTR(ename,3) FROM emp ; //從第3個字符開始一直到結尾!

c7e2a4caf7f83a4f3e6711847b0dbc75.jpe

范例8:語法二:SUBSTPR(字符串|列,開始點,結束點),表示從開始點一直截以到結束點,截取部分內容;

SELECT ename,SUBSTR(ename,0,3) FROM emp ; //截取前3個字符!SELECT ename,SUBSTR(ename,1,3) FROM emp ; //截取前3個字符!

e175f1479452b3e3d96858202e524161.jpe

49c6129f7240796a06639da3c91f9c78.jpe

范例9:要求截取每個雇員姓名的后三個字母;

* 正常思路:通過長度-2確定開始點

SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;

* 新思路:設置負數,表示從后指定截取位置

SELECT ename,SUBSTR(ename,-3) FROM emp ;

30d0005c8747e990001c4b3aa9099b84.jpe

19bfbde5c36f8b2cd2d2312099a7aeba.jpe

面試題:

1、請問SUBSTR()函數截取的時候下標是從0,還是從1開始?

* 在Oracle數據庫之中,SUBSTR()函數從0或1開始都是一樣的;(見范例8)

* SUBSTR()函數也可以設置為負數,表示由后指定截取開始點;(見范例9)

2-數字函數

數字函數一共有3個:

* ROUND(數字|列[,保留小數的位數]):四舍五入的操作;

* TRUNC(數字|列[,保留小數的位數]):舍棄指定位置的內容;

* MOD(數字1,數字2):取模,取余數;

范例10:驗證ROUND()函數

SELECT ROUND(903.5) FROM dual ;

24c35137ead3921529fb70ce1ec61397.jpe

SELECT ROUND(903.5),ROUND(-903.53567) FROM dual ;SELECT ROUND(903.5),ROUND(-903.53567),ROUND(903.53567,-1) FROM dual ;SELECT ROUND(903.5),ROUND(-903.53567),ROUND(903.53567,-1),ROUND(903.53567,2) FROM dual ;//保留2位

140470dcf7b6af7d669267a6bcf6dc24.jpe

范例11:驗證TRUNC()函數

SELECT TRUNC(903.5),TRUNC(-903.53567),TRUNC(903.53567,-1),TRUNC(903.53567,2) FROM dual ;

185b02f501665d12b22f4800b9a3e78b.jpe

范例12:驗證MOD()函數

SELECT MOD(10,3) FROM dual ;

0a984a4ff5b12a8cb4eea4a0280d5291.jpe

以上的三個主要的數學函數,在學習Java中也會有相匹的內容!

2-日期函數

如果現在要想進行日期的操作,則首先有一個必須要解決的問題,就是如何取得當前的日期, 這個當前日期可使用“SYSDATE”取得,代碼如下:

SELECT SYSDATE FROM dual ;

9389e99f9bee80f91840a3db0017acd3.jpe

范例13:除了以上的當前日期之外,在日期中也可以進行若干計算:

* 日期 + 數字 = 日期,表示若干天之后的日期;

SELECT SYSDATE+3,SYSDATE+300 FROM dual ;

* 日期 - 數字 = 日期,表示若干天前的日期;

SELECT SYSDATE-3,SYSDATE-300 FROM dual ;

* 日期 �C 日期 = 數字,表示的是兩個日期的天數,但是肯定是大日期 �C 小日期;

范例14:求出每個雇員到今天為止的雇佣天數;

SELECT ename,hiredate,SYSDATE-hiredate FROM emp ;

d19a48bf60ae1669ed13df06aa369e9c.jpe

5e573fd1e51876a3b01d1973578cac2c.jpe

注:而且很多編程語言之中,也都會提出一種概念,日期可以通過數字表示出來!

除了以上三個公式之外,也提供了以下四個操作函數:

* LAST_DAY(日期):求出指定日期的最后一天;

范例15:求出本月的最后一天日期

SELECT LAST_DAY(SYSDATE) FROM dual ;

* NEXT_DAY(日期,星期數):求出下一個指定星期X的日期;

范例16:求出下一個周一

SELECT NEXT_DAY(SYSDATE,'星期一') FROM dual ;

* ADD_MONTHS(日期,數字):求出若干月之后的日期;

范例17:求出4個月后是何時

SELECT ADD_MONTHS(SYSDATE,4) FROM dual ;

* MONTHS_BETWEEN(日期1,日期2):求出兩個日期之間所經歷的月份;

范例18:求出每個雇員到今天為止的雇佣月份;

SELECT ename,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp ;SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp ;

37106728052bb38fc5080b8f7f4359e6.jpe

afef69fb3d4b18f9ef023cfe4aace92b.jpe

在所有的開發之中,如果是日期的操作,建議使用以上函數,因為這些函數可以避免閏年的問題。

4-轉換函數(核心)

現在已經接觸到了Oracle數據庫之中的三種數據:數字(NUMBER)、字符串(VACHAR2)、日期(DATE),轉換函數的主要功能是完成這幾種數據間的相互轉換的操作,一共有三種轉換函數:

* TO_CHAR(字符串|列,格式字符串):將日期或者是數字變為字符串顯示;

* TO_DATE(字符串,格式字符串):將字符串變為DATE數據顯示;

* TO_NUMBER(字符串):將字符串變為數字顯示;

1、TO_CHAR()函數

在之前查詢過當前的系統日期時間:

SELECT SYSDATE FROM dual ;

這個時候是按照“日-月-年”的格式顯示,很明顯此格式不符合於正常的思路,正常是“年-月-日”,

范例19:TO_CHAR()函數,但是使用此函數的話需要一些格式字符串:年(yyyy),月(mm),日(dd)

SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd'),TO_CHAR(SYSDATE,'yyyy') year,TO_CHAR(SYSDATE,'mm') month,TO_CHAR(SYSDATE,'dd') day FROM dual ;

f3c5ca220fa39564f7ca4c857402e9fe.jpe

范例20:但是這個時候的顯示數據之中可以發現會存在前導0,如果要想消除這個0的話,可以加入一個“fm”。

SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd') FROM dual ;

25e9ebe8da2f0c7718f9383ae71014a5.jpe

范例21:正常人都加0,故這個標記知道就行了,可是在Oracle之中,DATE里面是包含了時間的,但是之前的代碼沒有顯示出時間,要想顯示時間,則需要增加標記:

SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd hh:mi:ss')day FROM dual ; //12時制SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd hh24:mi:ss') day FROM dual ;

45607d2a46f8ef05e41dd7b14e657db3.jpe

范例22:一定要注意:使用TO_CHAR()函數之后,所有的內容都是字符串,不再是之前的DATE型數據,TO_CHAR()函數也可以用數字的格式化上,此時每一個“9”表示一位數字的概念,而不是數字9概念。

SELECT TO_CHAR(11157191115719,'999,999,999,999,999') FROM dual ;SELECT TO_CHAR(11157191115719,'L999,999,999,999,999') FROM dual ;

其中的字母“L”,表示的是“Locale”的含義,即:當前的所在語言環境下的貨幣符號。

aeafb8e4b9e0f343fd8578121caf035b.jpe

2、TO_DATE()函數

范例23:此函數的主要功能是將一個字符串變為DATE型數據。

col TO_DATE('1988-8-8','yyyy-mm-dd') format a50 ;SELECT TO_DATE('1988-8-8','yyyy-mm-dd') FROM dual ;

fbc03226d57454a8888d22c686ad23e7.jpe

一般此函數在更新數據時,使用比較多!

3、TO_NUMBER()函數:基本不用!

范例24:TO_NUMBER()函數一看就知道是將字符串變為數字的:

SELECT TO_NUMBER('1') + TO_NUMBER('2') + TO_NUMBER('3') FROM dual ;

84a747d8382847449e17cb70a67000f8.jpe

范例25:但是在Oracle之中是很智能的,故以上功能不使用TO_NUMBER()函數也可以完成。

SELECT '1' + '2' + '3' FROM dual ;

f5044dd23e78555e71179dff07c23818.jpe

重點:

* TO_NUMBER()函數,基本已經不考慮了;

* TO_CHAR()函數,是重點;

* TO_DATE()函數,是次重點。

5-通用函數(核心)

通用函數主要有兩個:NVL()、DECODE(),這兩個函數算是 Oracle自己的特色函數了;

1、NVL()函數,處理null

范例26::要求查詢出每個雇員的全部年薪

SQL> SELECT ename,sal,comm,(sal+comm)*12 年薪 FROM emp ;

a90367d9219811206c50814cffc0a114.jpe

范例27:由上可知,有雇員的年薪變為null了,而造成這種問題的關鍵是在於comm字段上為null,那么要想解決這個問題,就必須做一種處理:將null變為0,而這個就是NVL()函數作用。

SELECT ename,sal,comm,(sal+comm)*12,NVL(comm,0) FROM emp ;

4a5654eb700f3d85665db287e1b3889e.jpe

范例28:看來,年薪還有為0的,下面再來看看!

SQL> SELECT ename,sal,comm,(sal+NVL(comm,0))*12 ?êD? FROM emp ;

6c032f0c83a8be61708e5eca2b6ff278.jpe

2、DECODE()函數:多數值判斷

DECODE()函數非常類似於程序中的if…else語句,唯一不同的是DECODE()函數判斷的是數值,而不是邏輯條件了。

例如:要求顯示全部雇員的職位,但是這些職位要求替換成中文顯示:

* CLERK:辦事員;

* SALESMAN:銷售;

* MANAGER:經理;

* ANALYST:分析員;

* PRESIDENT:總裁;

這種判斷肯定是逐行判斷,故此時必須采用DECODE()函數,而此函數語法如下:

DECODE(數值|列,判斷1,顯示值1,判斷2,顯示值2,判斷3,顯示值3,...)

范例29:實現顯示的操作功能

SELECT empno,ename,job,DECODE(job,'CLERK','辦事員','SALESMAN','銷售員','MANAGER','經理','ANALYST','分析員','PRESIDENT','總裁') 職務 FROM emp ;

8171eddd57a67b717961c2fa4446c080.jpe

DECODE()函數是整個Oracle之中最具有特點的函數,必須掌握!!!

總結篇:

1、SQL語句的基本格式,此處給出的只是最基本的語法:SELECT、FROM、WHERE、ORDER BY的關系;

2、記下SCOTT用戶中的所有的數據表的信息,包括列的名稱,作用及類型;

3、Oracle中的幾個單行函數,一定要記下來,所有函數都要求使用。

OpenSSL是一种开源加密库,支持多种加密算法,其中包括SM2算法。SM2是中国制定的一种非对称加密算法,适用于数字证书、数字签名等领域。在OpenSSL中,SM2的实现主要包括以下部分: 1. EC_KEY结构体:用于表示椭圆曲线密钥对,包括公钥和私钥。SM2算法中使用的是椭圆曲线secp256k1。 2. EVP_PKEY结构体:用于表示EVP(Enveloped Data Processing)算法的密钥对。EVP算法是OpenSSL中的高层抽象接口,用于支持多种加密算法,包括SM2。 3. SM2签名和验签:使用EVP_DigestSign函数进行签名操作,使用EVP_DigestVerify函数进行验签操作。 4. SM2加密和解密:使用EVP_SealInit函数初始化加密上下文,使用EVP_SealUpdate函数加密数据,最后使用EVP_SealFinal函数结束加密操作。解密操作类似,使用EVP_OpenInit函数初始化解密上下文,使用EVP_OpenUpdate函数解密数据,最后使用EVP_OpenFinal函数结束解密操作。 关于SM2算法的16进制表示,具体表示方式根据不同的数据类型而有所不同。如果是表示SM2密钥对中的公钥和私钥,可以使用十六进制字符串表示。例如: 私钥: 4d1cc6b7d778d8ddc4f32fd3a4f98e437bfad7c92d8f6e9b34d4c6f06d540cea 公钥: 04e126a4846f32b0ab79a7ebfe06f5f3bdeffcf79c71a8cb8c947b163b9f8b6f8c7726519c0055367ae139d22ebf3db9c9c83e08a8e7d5e74a3b3c4fc9bbde77e 如果是表示SM2签名和验签的结果,可以使用DER编码或ASN.1编码。如果是表示SM2加密和解密的结果,则可以使用十六进制字符串表示加密后的密文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值