當前位置:首頁 » 編程語言 » sql里的單行函數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql里的單行函數

發布時間: 2023-07-09 03:26:18

『壹』 select abs(-5)什麼意思

返回數值的絕對值。
abs(5) 返回 5;
abs(-5)
返回 5;
Oracle sql 提供了用於執行特定操作的專用函數。
這些函數大大增強了 SQL 語言的功能。函數可以接受零個或者多個輸入參數,並返回一個輸出結果。 oracle 資料庫中主要使用兩種類型的函數:單行函數:對每一個函數應用在表的記錄中時,只能輸入一行結果,返回一個結果。聚合函數:聚合函數同時可以對多行數據進行操作,並返回一個結果。比如 SUM(x)

『貳』 資料庫常用函數

1、系統信息函數

系統信息函數用來查詢MySQL資料庫的系統信息。

函數代碼:

SELECT VERSION()

->5.0.67-community-nt

CONNECTION_ID() 返回伺服器的連接數

DATABASE()、SCHEMA 返回當前資料庫名

USER()、SYSTEM_USER()返回當前用戶

2、日期時間函數

MySQL的日期和時間函數主要用於處理日期時間。

函數代碼:

CURDATE(),CURRENT_DATE() curdate() 返回當前日期

SELECT CURDATE()

->2014-12-17

CURTIME(),CURRENT_TIME curtime()
返回當前時間

SELECT CURTIME()
->15:59:02

3、字元串函數

函數代碼:

CHAR_LENGTH(s) char_length()返回字元串s的字元數

SELECT CHAR_LENGTH('你好123') -- 5

CONCAT(s1,s2,...) concat(s1,s2...)

將字元串s1,s2等多個字元串合並為一個字元串

4、加密函數

加密函數是MySQL用來對數據進行加密的函數。

函數代碼:

PASSWORD(str)

該函數可以對字元串str進行加密,一般情況下,PASSWORD(str)用於給用戶的密碼加密。

SELECT PASSWORD('123')

->*

5、數學函數

數學函數主要用於處理數字,包括整型、浮點數等。

函數代碼:

ABS(x) abs(x)返回x的絕對值

SELECT ABS(-1) -- 返回1

CEIL(x),CEILING(x) cell(x),celling(x)

返回大於或等於x的最小整數

SELECT CEIL(1.5) -- 返回2

『叄』 SQL的基本函數

【二】SQL的基本函數

2.1 關系型資料庫SQL命令類別

數據操縱語言:DML: select; insert; delete; update; merge.

數據定義語言:DDL: create; alter; drop; truncate; rename; comment.

事務控制語言:TCL: commit; rollback; savepoint.

數據控制語言:DCL: grant; revoke.

2.2 單行函數與多行函數

單行函數:指一行數據輸入,返回一個值得函數。所以查詢一個表時,對選擇的每一行數據都會返回一個結果。

SQL>select empno,lower(ename) from emp;

多行函數:指多行數據輸入,返回一個值得函數。所以對表的群組進行操作,並且每組返回一個結果。(典型的是聚合函數)

SQL>select sum(sal) from emp;

2.3 單行函數的幾種類型

2.3.1 字元型函數

lower('SQL Course')----->sql course 返回小寫

upper('sql course')----->SQL COURSE 返回大學

initcap('SQL course')-----> Sql Course 每個單字返回首字母大寫

concat('good','string')---->good string 拼接 只能拼接2個字元串

substr('String',1,3)---->Str 從第1位開始截取3位數,

演變:只有兩個參數的

substr('String',3) 正數第三位起始,得到後面所有字元

substr('String',-2) 倒數第二位,起始,得到最後所有字元

instr('t#i#m#r#a#n#','#') --->找第一個#字元在那個絕對位置,得到的數值

Instr參數經常作為substr的第二個參數值

演變:Instr參數可有四個之多

如select instr('aunfukk','u',-1,1) from al; 倒數第一個u是哪個位置,結果返回5

length('String')---->6 長度,得到的是數值

length參數又經常作為substr的第三個參數

lpad('first',10,'#39;)左填充

rpad(676768,10,'*')右填充

replace('JACK and JUE','J','BL')---->BLACK and BLUE

trim('m' from 'mmtimranm')---->timran 兩頭截,這里的『m』是截取集,僅能有一個字元

trim( ' timran ')---->timran 作用是兩頭去空字元

處理字元串時,利用字元型函數的嵌套組合是非常有效的:

create table customers(cust_name varchar2(20));

insert into customers values('Lex De Hann');

insert into customers values('Renske Ladwig');

insert into customers values('Jose Manuel Urman');

insert into customers values('Joson Malin');

select * from customers;

CUST_NAME

--------------------

Lex De Hann

Renske Ladwig

Jose Manuel Urman

Joson Malin

一共四條記錄,客戶有兩個名的,也有三個名的,現在想列出僅有三個名的客戶,且第一個名字用*號略去

答案之一:

SELECT LPAD(SUBSTR(cust_name,INSTR(cust_name,' ')),LENGTH(cust_name),'*') "CUST NAME"

FROM customers

WHERE INSTR(cust_name,' ',1,2)>0;

CUST NAME

------------------------------------------------------------------------------------------------------------------------

*** De Hann

**** Manuel Urman

分析:

先用INSTR(cust_name,' ')找出第一個空格的位置,

然後,SUBSTR(cust_name,INSTR(cust_name,' '))從第一個空格開始往後截取字元串到末尾,結果是第一個空格以後所有的字元,

最後,LPAD(SUBSTR(cust_name,INSTR(cust_name,' ')),LENGTH(cust_name),'*')用LPAD左填充到cust_name原來的長度,不足的部分用*填充,也就是將第一個空格前的位置,用*填充。

where後過濾是否有三個名字,INSTR(cust_name, ' ',1,2)從第一個位置,從左往右,查找第二次出現的空格,如果返回非0值,則說明有第二個空格,則有第三個名字。

2.3.2 數值型函數

round 對指定的值做四捨五入,round(p,s) s為正數時,表示小數點後要保留的位數,s也可以為負數,但意義不大。

round:按指定精度對十進制數四捨五入,如:round(45.923, 1),結果,45.9

round(45.923, 0),結果,46

round(45.923, -1),結果,50

trunc 對指定的值取整 trunc(p,s)

trunc:按指定精度截斷十進制數,如:trunc(45.923, 1),結果,45.9

trunc(45.923),結果,45

trunc(45.923, -1),結果, 40

mod 返回除法後的余數

SQL> select mod(100,12) from al;

2.3.3 日期型函數

因為日期在oracle里是以數字形式存儲的,所以可對它進行加減運算,計算是以天為單位。

預設格式:DD-MON-RR.

可以表示日期范圍:(公元前)4712 至(公元)9999

時間格式

SQL> select to_date('2003-11-04 00:00:00' ,'YYYY-MM-DD HH24:MI:SS') FROM al;

SQL> select sysdate+2 from al; 當前時間+2day

SQL> select sysdate+2/24 from al; 當前時間+2hour

SQL> select sysdate+2/1440 from al; 當前時間+2分鍾

SQL> select (sysdate-hiredate)/7 week from emp; 兩個date類型差,結果是以天為整數位的實數。

①MONTHS_BETWEEN 計算兩個日期之間的月數

SQL>select months_between('1994-04-01','1992-04-01') mm from al;

查找emp表中參加工作時間>30年的員工

SQL>select * from emp where months_between(sysdate,hiredate)/12>32;

很容易認為單行函數返回的數據類型與函數類型一致,對於數值函數類型而言的確如此,但字元和日期函數可以返回任何數據類型的值。比如instr函數是字元型的,months_between函數是日期型的,但它們返回的都是數值。

②ADD_MONTHS 給日期增加月份

SQL>select hiredate,add_months(hiredate,4) from emp;

③LAST_DAY 日期當前月份的最後一天

SQL>select hiredate,last_day(hiredate) from emp;

④NEXT_DAY NEXT_DAY的第2個參數可以是數字1-7,分別表示周日--周六(考點)

比如要取下一個星期六,則應該是:

SQL>select next_day(sysdate,7) FROM DUAL;

⑤ROUND(p,s),TRUNC(p,s)在日期中的應用,如何舍入要看具體情況,s是MONTH按30天計,應該是15舍16入,s是YEAR則按6舍7入計算。

SQL>SELECT empno, hiredate,round(hiredate,'MONTH') AS round,trunc(hiredate,'MONTH') AS trunc FROM emp;

SQL>SELECT empno, hiredate, round(hiredate,'YEAR') AS round,trunc(hiredate,'YEAR') AS trunc FROM emp;

2.3.4 幾個有用的函數和表達式

1)DECODE函數和CASE表達式:

實現sql語句中的條件判斷語句,具有類似高級語言中的if-then語句的功能。

decode函數源自oracle, case表達式源自sql標准,實現功能類似,decode語法更簡單些。

decode函數用法:

SQL> SELECT job, sal,

decode(job, 'ANALYST', SAL*1.1, 'CLERK', SAL*1.15,'MANAGER', SAL*1.20, SAL) SALARY FROM emp

decode函數的另幾種常見用法:

SQL>select ename,job,decode(job,'MANAGER','中層幹部') leader from emp;

SQL> select ename,job,comm,decode (comm,null,'nonsale','sale') saleman from emp;

註:單一列處理,共四個參數:含義是:comm 如果為null就取'nonsale,否則取'sale'

SQL> select sal,sign(sal-1500) from emp;

SQL> select ename,decode (sign(sal-1500), 1, 'NORMAL','LOW') as "LEV" from emp;

註:sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1,含義是:工資大於1500,返回1,真取'NORMAL',假取'LOW'

CASE表達式第一種用法:

SQL> SELECT job, sal,

case job when 'ANALYST' then SAL*1.10

when 'CLERK' then SAL*1.15

when 'MANAGER' then SAL*1.20

else sal end SALARY

FROM emp

CASE表達式第二種用法:

SQL> SELECT job, sal, case

when job='ANALYST' then SAL*1.1

when job='CLERK' then SAL*1.15

when job='MANAGER' then SAL*1.20

else sal end SALARY

FROM emp

以上三種寫法結果都是一樣的

CASE第二種語法比第一種語法增加了搜索功能。形式上第一種when後跟定值,而第二種還可以使用表達式和比較符。

看一個例子

SQL> SELECT ename,sal,case

when sal>=3000 then '高級'

when sal>=2000 then '中級'

else '低級' end 級別

FROM emp

再看一個例子:使用了復雜的表達式

SQL> SELECT AVG(CASE

WHEN sal BETWEEN 500 AND 1000 AND JOB='CLERK'

THEN sal ELSE null END) "CLERK_SAL"

from emp;

比較;

SQL> select avg(sal) from emp where job='CLERK';

2)DISTINCT(去重)限定詞的用法:

distinct貌似多行函數,嚴格來說它不是函數而是select子句中的一個選項。

SQL> select distinct job from emp; 消除錶行重復值。

SQL> select distinct job,deptno from emp; 重復值是後面的欄位組合起來考慮的

SQL> select distinct * from emp; 消除重復記錄

3)sys_context 獲取環境上下文的函數(多用於應用環境)

scott遠程登錄

SQL>select SYS_CONTEXT('USERENV','IP_ADDRESS') from al;

--------------------------------------------------------------------------------

192.168.0.136

SQL> select sys_context('userenv','sid') from al;

SYS_CONTEXT('USERENV','SID')

--------------------------------------------------------------------------------

129

SQL> select sys_context('userenv','terminal') from al;

SYS_CONTEXT('USERENV','TERMINAL')

--------------------------------------------------------------------------------

TIMRAN-222C75E5

the end !!!

@jackman 共築美好!

『肆』 資料庫中轉換數據類型的幾種方法

oracle有三種最基本的數據類型,即字元型、數值型、日期型。 (注意需要起別名的地方要起別名)

oracle提供的單行函數中,針對不同的數據類型,提供大量實用的函數,同時提供一系列數據類型轉換函數,如下:

sql.append(" select CURVE_NAME,S_YEAR_LIMIT,AVERAGE_VALUE,to_char(d_date,'yyyy-MM-dd') d_date from t_treasury_yield_curve t where d_date = to_date ('"+d_date+"','yyyy-MM-dd')");

24 小時的形式顯示出來要用 HH24select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from al;

select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from al;to_date() function。

1、日期格式參數 含義說明

D 一周中的星期幾。

DAY 天的名字,使用空格填充到 9 個字元。DD 月中的第幾天,DDD 年中的第幾天。

DY 天的簡寫名,IW ISO 標準的年中的第幾周,IYYY ISO 標準的四位年份。YYYY 四位年份,

YYY,YY,Y 年份的最後三位,兩位,一位。

select sysdate,sysdate - interval '7' month from al。

當前時間減去 7 年的時間。

select sysdate,sysdate - interval '7' year from al。

時間間隔乘以一個數字。

select sysdate,sysdate - 8 *interval '2' hour from al

2、日期到字元操作

select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from al,select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from al,select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from al。

select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from al。

3、字元到日期操作

select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from al。

具體用法和上面的 to_char 差不多。

4、TO_NUMBER

使用TO_NUMBER函數將字元轉換為數字

TO_NUMBER(char[, '格式'])

數字格式格式:

9 代表一個數字 。

0 強制顯示0 。

$ 放置一個$符 。

L 放置一個浮動本地貨幣符 。

. 顯示小數點 。

, 顯示千位指示符。

(4)sql里的單行函數擴展閱讀:

在使用數據類型轉換之前,同樣的 SQL 在有的伺服器不報錯,主要是資料庫的版本不同,當然該過配置的不算。

常見的兩種類型轉換錯誤如下:

ERROR: operator does not exist: integer = character varying。

ERROR: operator does not exist: character varying = integer。

字元串轉數字,數字轉字元串。這一點支持的不如 MySQL 好,當然 PostgreSQL 在新版本中也對這個問題做了改進!

第一種轉換方式:使用 CAST 函數。

SELECT * FROM xttblog WHERE id = CAST(888 AS VARCHAR);

SELECT * FROM xttblog WHERE id = CAST('888' AS integer)。

第二種轉換方式:使用「::」操作欄位。

格式,欄位 :: 要轉換為的數據類型。

SELECT * FROM xttblog WHERE id = 888 :: VARCHAR;

SELECT * FROM xttblog WHERE id = '888' :: integer。

數據類型轉換,雖然看起來很痛苦,但是如果用戶的類型用的不對,查詢效率會下降。所以,在設計的時候,欄位的類型,一定要設計的合理,尤其是在關聯表的時候。