排序&數據處理函數&日期處理函數
* 本博客涉及到的數據爲bjpowernode.sql,數據見文末,SQL文見MySQL入門(9)文末。
* 該數據有三張表,分別是部門表dept(deptno部門編號、dname部門名稱、loc位置)、
員工表emp(empno工號、ename員工姓名、job職位、mgr直屬領導工號、
hiredate入職日期、sal月薪、comm補貼、deptno部門編號)、
薪水等級表salgrade(grade等級、losal區間下限、hisal區間上限)
一、排序&數據處理函數
1、排序數據(order by)
1)單字段排序
select ename,sal fromemp order by sal asc ;(默認升序)
select ename,sal fromemp order by sal desc;
select ename,sal fromemp order by 2;(2表示表裏面第二個字段,儘量不要寫)
2)多字段排序
select ename,sal fromemp order by sal desc,ename asc;
2、數據處理函數/單行處理函數
轉小寫(lower),轉大寫(upper),截取字符串(substr),獲取字符串長度(length),去除前後空白(trim),四捨五入(round),生成隨機數(rand),空值處理函數(ifnull)
select ename from emp;
select lower(ename)as ename from emp;
select upper(ename) as ename from emp;
select substr(ename,1,3) from emp;(substr(字段名,起始位置/開始下標,長度))
第二個字母是a的
select ename from emp where substr(ename,2,1)=‘A’;
select length(ename)from emp;
select ename from emo where ename = ‘ SMITH ’;(沒有結果)
select ename from emo where ename = trim(‘ SMITH ’);
select round(123.456);(默認到整數位)
select round(123.456,1);(保留一位小數)
select round(123.456,-1);(保留到個位)
select rand();
select round(rand()*100);
select ename,commfrom emp;
補助是空的顯示爲零
select ename,ifnull(comm,0) as comm fromemp;
select sal + comm from emp(數據庫內有空值參加的數學運算都爲空)
補助爲空爲100
select sal + ifnull(comm,100) from emp
select ename,(sale+comm)*12 from emp;
select ename,(sale+ifnull(comm,0))*12 as yearsal from emp;
二、日期處理函數
0、先了解一下數據可中的類型
int 整數型
varhar 可變長度字符串
date 日期類型
double 浮點型
……
1、關於MYSQL的日期處理
1.1 每一個數據庫處理日期的時候採用的機制都是不同的,日期處理都有自己的而一套機制。所以在實際的開發中,表中的字段定義爲DATE類型的情況很少。因爲一旦使用日期類型,那麼java程序將不能夠通用。在實際開發中,一般會使用“日期字符串”來表示日期。
1.2 日期是數據庫本身的特色,也是數據庫本身機制中的一個重要內容,所以還是需要掌握。
2、MYSQL數據庫管理系統中對日期的處理提供了兩個重要的函數:
-str_to_date
-date_format
3、str_to_date
3.1該函數的作用:將“日期字符串”轉換成“日期類型”數據。【varchar --> date】
3.2該函數的執行結果DATE類型
3.3該函數的使用格式:
str_to_date(‘日期字符串’,‘日期格式’)、
3.4關於MYSQL中的日期格式:
MYSQL的日期格式:
%Y 年
%m 月
%d 日
%H 時
%i 分
%s 秒
3.5案例: 查詢1980-12-17入職的員工
法一:與數據庫的格式匹配
select * from emp where hiredate=‘1980-12-17’;
MYSQL默認日期規格: %Y-%m-%d,以上的日期字符串‘1980-12-17’正好和默認的日期格式一樣,存在了自動類型轉換,自動將日期字符串轉換成了日期類型,所以以上查詢可以查詢出結果。
select ename,hiredate from emp where hiredate=‘12-17-1980’;
Empty set, 2 warnings(0.00 sec)
‘12-17-1980’日期字符串和mysql默認的日期格式不同
hiredate是date類型,‘12-17-1980’是一個字符串類型,類型不匹配。
所以無法查詢結果,並且有警告【錯誤】發生。
糾正以上SQL語句錯誤:
select ename,hiredate from emp where hiredate= str_to_date(‘12-17-180’,‘%m-%d-%Y’);
select ename,hiredate from emp where hiredate=‘1980-12-17’;默認自己加了str_to_date
3.6案例
創建學生表:【create語句,以後詳細講】
createtable t_student(
id int(10)
name varchar(32)
birth date
);
插入數據:【insert語句,以後詳細講】
insert intot_student(id,name,birth)values(1,‘jack’,‘1980-10-11’);
以上可以執行,因爲‘1980-10-11’雖然是varchar類型,但是由於格式和MYSQL數據可默認的日期格式相同,所以存在自動轉換。
insert intot_student(id,name,birth)values(1,‘jack’,‘10-11-1980’);
ERROR 1292(22009):Incorrect data value:‘10-11-1970’for column 、birth at row 1
以上發生錯誤:
第一:‘10-11-1980’日期字符串的格式和MYSQL的默認字符串不同
第二:‘10-11-1970’是varchar類型,birth字段需要date類型,類型不匹配
糾正以上錯誤:
insert intot_student(id,name,birth)values(2,‘zhangsan’,str_to_date(‘10-11-1970’,‘%m-%d-%Y’));
3.7 str_to_date函數通常使用在插入操作中,字段是date類型,不接受字符串varchar類型,需要先通過該函數將varchar變成date 再插入數據,才能成功。
4、date_format
4.1函數的作用:將日期類型date轉換成具有特定格式日期字符串varchar【date --> varchar】
4.2函數的運算結果:varchar類型【具備特定格式】
4.3函數的語法格式:
date_(‘日期類型數據’,‘日期格式’)format
4.4案例: 查詢員工的入職日期,以‘10-12-1980’(‘%m-%d-%Y’)的格式顯示在窗口中。
selectename.date_format(hiredate,‘%m-%d-%Y’) as hiredate from emp;
selectename,hiredate from emp;
select ename,date_format(hiredate,‘%Y-%m-%d’) as hiredate from emp;
【hiredate自動那個轉換成varchar類型,採用‘%Y-%m-%d’,上述兩語句等價】
4.5案例: 查詢員工的入職日期,以‘10/12/1980’(‘%m/%d/%Y’)的格式顯示在窗口中。
selectename,date_format(hiredate,‘%m/%d/%Y’) as hiredate from emp;
4.6結論:date_format函數主要使用在查詢出操作中,客戶需要日期以特定格式展示的時候需要使用該函數
DEPTNO | DNAME | LOC |
10 | ACCOUNTING | NEW YORK |
20 | RESEARCHING | DALLAS |
30 | SALES | CHICAGO |
40 | OPERATIONS | BOSTON |
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800 | NULL | 20 |
7499 | ALLEN | SALESMAN | 7698 | 1981/2/20 | 1600 | 300 | 30 |
7521 | WARD | SALESMAN | 7698 | 1981/2/22 | 1250 | 500 | 30 |
7566 | JONES | MANAGER | 7839 | 1981/4/2 | 2975 | NULL | 20 |
7654 | MARTIN | SALESMAN | 7698 | 1981/9/28 | 1250 | 1400 | 30 |
7698 | BLAKE | MANAGER | 7839 | 1981/5/1 | 2850 | NULL | 30 |
7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450 | NULL | 10 |
7788 | SCOTT | ANALYST | 7566 | 1987/4/19 | 3000 | NULL | 20 |
7839 | KING | PERSIDENT | NULL | 1981/11/17 | 5000 | NULL | 10 |
7844 | TURNER | SALESMAN | 7698 | 1981/9/8 | 1500 | NULL | 30 |
7876 | ADAMS | CLERK | 7788 | 1987/5/23 | 1100 | NULL | 20 |
7900 | JAMES | CLERK | 7698 | 1981/12/3 | 950 | NULL | 30 |
7902 | FORD | ANALYST | 7566 | 1981/12/3 | 3000 | NULL | 20 |
7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300 | NULL | 10 |
GRADE | LOSAL | HISAL |
1 | 700 | 1200 |
2 | 1201 | 1400 |
3 | 1401 | 2000 |
4 | 2001 | 3000 |
5 | 3001 | 9999 |