您好,登錄后才能下訂單哦!
單行 SQL 函數有如下幾個分類:
字符函數
數字函數
使用日期
日期函數
函數的使用原來說白了就是在函數使用過程中加入符合定義的參數,然后執行函數就能輸出結果值了。
單行函數和多行函數的區別:
單行函數每行輸出為一個結果
多行函數每組行輸出為一個結果
單行函數:
操作數據對象
接受函數返回一個結果
只對一行進行變換
每行返回一個結果
可以轉換數據類型,計算,格式化
可以嵌套
參數可以是列、值或表達式
function_name [(arg1, arg2,...)]
字符函數:
1、大小寫轉換函數:LOWER、UPPER、INITCAP
這些函數轉換字符串的大小寫:
函數 | 結果 |
LOWER('SQL Course') | 結果全部是小寫 |
UPPER('SQL Course') | 結果全部是大寫 |
INITCAP('SQL Course') | 結果首字符大寫 |
1.1、例如顯示員工Walsh的員工編號,并且名字為小寫:
select lower(last_name),employee_id from employees where last_name='Walsh';
1.2、例如顯示員工Walsh的工資,并且名字為大寫:
select upper(first_name),salary from employees where first_name='Kevin';
1.3、顯示Kevin的last_name 、工資job_id 首字母大寫
select initcap(job_id), last_name,salary from employees where first_name='Kevin';
1.4、從員工表中檢索FIRST_NAME和LAST_NAME值,并且FIRST_NAME包含字符串“li”
select first_name,last_name from employees where lower(first_name) like '%li%';
2、字符處理函數:CONCAT、SUBSTR、LENGTH、INSTR、LPAD | RPAD、TRIM、REPLACE
名字 | 函數 | 結果 |
連接函數 | CONCAT('Hello', 'World') | HelloWorld |
字符截取函數 | SUBSTR('HelloWorld',1,5)截取從1-5個字符 | Hello |
字符串統計長度 | LENGTH('HelloWorld') | 10 |
查找字符位置函數 | INSTR('HelloWorld', 'W') | 6 |
前填充函數 | LPAD(salary,10,'*') | *****24000 |
后填充函數 | RPAD(salary, 10, '*') | 24000***** |
替換函數 | REPLACE ('JACK and JUE','J','BL') | BLACK and BLUE |
字符剪切函數 | TRIM('H' FROM 'HelloWorld') | elloWorld |
2.1、將員工的first_name和last_name拼接在一起顯示,并查找工資大于5000的員工信息
select concat(first_name,last_name) name, employee_id,salary from employees where salary>5000 order by salary desc;
2.1.1、單獨制造一個列信息,顯示為****** infor的顯示員工工資大于10000的信息
select concat('*******','information') infor , job_id ,salary from employees where salary > 10000;
2.1.2、由下圖可知,concat函數只能拼接兩列字符信息,到第三列就開始報錯了
2.2.1、截取員工名字前3個字母,并找到工資大于10000的員工名字
select substr(first_name,1,3) fname, salary from employees where salary >10000;
2.2.2、查看工資大于10000員工的名字長度
select length(last_name),salary from employees where salary >10000;
2.3.1、查找Ellen用戶 l在第幾個位置。
select instr(first_name,'l'),salary from employees where first_name='Ellen';
2.3.2、查找job_id 從第4位截取為REP的。
select instr(first_name,'a'),salary,job_id from employees where substr(job_id,'4') ='REP';
2.4.1、將工資設置為5位長度,不夠的用*號前填充
select first_name,lpad(salary,5,'*') from employees;
2.5.1、查找工資顯示10位,不足的用*號后填充
select first_name,rpad(salary,10,'*') from employees;
2.6.1、將員工名字開頭為B的變成JC開頭。
select replace(first_name,'B','JC'),salary from employees order by first_name;
2.7.1、將員工姓名首字母為A的,去掉A
select trim('A' from first_name),salary from employees order by first_name;
2.8 查看job_id第四位開始是REP的,查看first_name a在第幾位置
select employee_id,concat(first_name,last_name) Name,job_id,length(first_name),instr(first_name,'a') "contains 'a'?"
from employees where substr(job_id,4) = 'REP';
2.9、公司計劃給每名員工印制含有員工姓名的紀念品,為保持整體美觀程度,現在要求員工的全名在
16個字符內。當員工的FIRST_NAME和LAST_NAME的合并長度超過15個字符時,顯示員工學名,。員
工的名稱由FIRST_NAME的首字母和LAST_NAME的前14個字符組成。
【解題思路】首先確定where條件限制FIRST_NAME和LAST_NAME的合并長度超過15的員工進行過
濾,然后在SELECT 子句后面使用字符函數進行處理。
select first_name,last_name,substr(first_name,1,1)||' '||substr(last_name,1,14) format_name from employees where length(first_name)+length(last_name) >15;
數值函數
函數 | 示例 | 結果 |
ROUND:四舍五入到到指定的十進制值 | ROUND(45.926, 2) | 45.93 |
TRUNC:將數字截尾取整 | TRUNC(45.926, 2) | 45.92 |
MOD:返回余數 | MOD(1600, 300) | 100 |
這里使用DUAL來測試,這是一個‘偽表’,可以用來測試函數和表達式
1、測試round函數三種方式
select round(45.9234,2),round(45.923,0),round(45.923,-1) from dual;
select round(45.9259,2),round(45.623,0),round(45.923,-1) from dual;
通過上面兩個語句測試可知:
第一個為在小數點右側截取2位,如果第三位是5就四舍五入
第二個為標準小數點右側第一位進行四舍五入
第三個為小數點左側進行四舍五入,不夠進變成0,比如round(43.923,-1),結果變成40
2、測試trunc函數三種方式
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923,-1) FROM DUAL;
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(39.923,-1) FROM DUAL;
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(39.923,-2) FROM DUAL;
命令分別為指定截取位數2位,默認截取小數點位右側刪除掉,刪除掉小數點左側第一位變成0
當為-3的時候就表示截取3位,直接變成0
3、測試mod函數查詢銷售部門的工資與5000取余數
select last_name,salary,mod(salary,5000) from employees where job_id='SA_REP';
日期函數
Oracle內部使用數字存儲日期: 世紀,年,月,日,小時,分鐘,秒
默認的日期顯示格式為DD-MON-RR
– 可以只指定年的后兩位,允許存儲21世紀日期在21世紀中
– 同樣,允許存儲20世紀的日期在21世紀中
RR 日期格式
當前年 | 指定日期 | RR格式 | YY格式 |
1995 | 27-OCT-95 | 1995 | 1995 |
1995 | 27-OCT-17 | 2017 | 1917 |
2001 | 27-OCT-17 | 2017 | 2017 |
2001 | 27-OCT-95 | 1995 | 2095 |
使用 SYSDATE 函數
SYSDATE 函數返回:
日期
時間
select sysdate from dual;
日期的算術運算
在日期上加上或減去一個數字結果仍為日期。
兩個日期相減返回日期之間相差的天數。
可以用小時數除以24,可以加小時到日期上。
1、查詢90部門的員工都入職多少個星期了
select last_name,(sysdate-hire_date)/7 as weeks from employees where department_id=90;
2、查詢30部門的員工都入職多少個月了
select first_name,(sysdate-hire_date)/30 month from employees where department_id=30;
日期操作函數
函數 | 含義 | 結果 |
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') | 兩個日期相差的月數 | 19.6774194 |
ADD_MONTHS ('06-MAR-17',1) | 向指定日期中加上若干月數 | 06-APR-17 |
NEXT_DAY ('01-SEP-95','FRIDAY') | 指定日期的下一個日期 | 08-SEP-95 |
LAST_DAY ('01-SEP-95') | 本月的最后一天 | 30-SEP-95 |
假設當前為 | ||
ROUND (SYSDATE,'MONTH') | 日期四舍五入 | 01-MAR-17 |
ROUND (SYSDATE ,'YEAR') | 日期四舍五入 | 01-JAN-17 |
TRUNC (SYSDATE ,'MONTH') | 日期截斷 | 01-MAR-17 |
TRUNC (SYSDATE ,'YEAR') | 日期截斷 | 01-JAN-17 |
感覺上面這幾個不太對,現在還沒明白,回頭再說
1、查詢截至01-JAN-2012已入職100月的員工信息包含EMPLOYEES,LAST_NAME和HIRE_DATE字段
select last_name,hire_date,months_between('01-JAN-2012',hire_date) day from employees where months_between('01-JAN-2012',hire_date) >100;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。