1. 程式人生 > >[資料庫] MySQL基礎知識之日期判斷及新增排序序號

[資料庫] MySQL基礎知識之日期判斷及新增排序序號

這篇文章主要記錄MySQL中遇到的幾個基礎問題,希望文章對你有所幫助!包括:
        1.日期型別的判斷
        2.decode函式的替代方法
        3.查詢語句中新增一個排序的序號
        4.子函式查詢select a.*


1.日期型別判斷

日期型別主要是:DATE(顯示格式:YYYY-MM-DD)
                           DATETTIME(顯示格式:YYYY-MM-DD HH:MM:SS)
假設存在學生表Student,如下圖所示:




(1)如何判斷日期的年月日
判斷日:date_format(birthday,'%Y-%m-%d')='2016-08-23'
判斷月:date_format(birthday,'%Y-%m')='2016-08'


判斷年:date_format(birthday,'%Y')='2016'
對應的SQL語句如下:

select * from student where date_format(birthday,'%Y-%m-%d')='2016-08-23';
王二	111111	1	2016-08-23 21:05:46.000000	94	85

select * from student where date_format(birthday,'%Y-%m')='2016-08';
王二	111111	1	2016-08-23 21:05:46.000000	94	85
楊三	123456	3	2016-08-17 21:06:28.000000	89	75
劉五	000000	4	2016-08-18 21:07:02.000000	61	92

select * from student where date_format(birthday,'%Y')='2016';
王二	111111	1	2016-08-23 21:05:46.000000	94	85
李四	123456	2	2016-07-23 21:06:15.000000	76	87
楊三	123456	3	2016-08-17 21:06:28.000000	89	75
劉五	000000	4	2016-08-18 21:07:02.000000	61	92
(2)如何判斷時間範圍,如在2016-08-17到2016-08-20之間的資料
通常會使用between and來進行比較

select * from student where date_format(birthday,'%Y-%m-%d') 
between '2016-08-17' and '2016-08-20';
如下圖所示:

(3)獲取日期的年月日,使用YEAR()、month()、day()函式

select username, stuid, YEAR(birthday), month(birthday), day(birthday) from student;
輸出如下圖所示:

2.decode取代函式

在Oracle中存在decode(b,0,0,a/b)函式,用於防止分母為0,如果b為0返回0,否則返回a/b。但是MySQL中沒有該函式,需要通過CASE WHEN進行替換。
替代程式碼:case b when 0 then 0 else a/b end
具體含義:當b為0時返回0,否則返回a/b並結束
假設存在一個黃六,英語成績為0,需要統計"數學/英語"的結果:  

select username, stuid, math, english, math/english from student;
此時黃六輸出NULL空值,如下圖所示:
而使用了case判斷後:
select username, stuid, math, english, 
case english when 0 then 0 else math/english end as cf from student;
輸出如下圖所示,同時可以輸出自定義的值,如'分母為0'等。


3.新增排序序號

通常MySQL排序使用order by(從小到大),然後增加desc是從大到小排序。

select username, stuid, math, english from student order by math;
select username, stuid, math, english from student order by math desc;
輸出如下圖所示:
   但是如果需要增加一個序號,自定義的排名呢?
假設前段顯示需要序號,通常是通過Java設定一個Num來加1顯示,但是資料庫如何實現呢?
通過:select @rownum:[email protected]+1 as num, name from table, 
          (select @rownum:=0) temp; 

輸出如下圖所示,注意這是自定義一列,而不是表中某個欄位屬性。
select @rownum:[email protected]+1 as num, username, stuid, math, english 
from student,(select @rownum:=0) B order by math;


另一種方法:
set @i:= 0; select @i:= @i + 1 as `order`, a.* from a order by col desc;

同時,你可能會遇到一個問題,如下面的SQL語句:

select @rownum:[email protected]+1 as num, A.UnitDepName, sum(CostSum), A.UnitArea, 
    (case A.UnitArea when 0 then 0 else sum(CostSum)/(A.UnitArea) end) as avCostSum 
from all_unitdepinfo A, gc_nhfxxdwzxfhzmon T, (select @rownum:=0) B 
where (A.UnitCode=T.UnitCode and A.UnitDepCode=T.UnitDepCode) and (A.UnitCode='GC001') 
group by A.UnitDepCode order by sum(CostSum)/sum(A.UnitArea) desc;
它的功能是統計各個學院能耗,並且排名、新增相應的序號,但輸出的結果如下:
存在的問題是自定義序號應該是從1到n,而它序列弄錯了。怎麼解決呢?
採用子查詢進行修改,即:
select @rownum:[email protected]+1 as num, D.* from  (....) D,(select @rownum:=0) B;

select @rownum:[email protected]+1 as num, D.* from 
	(select A.UnitDepName, sum(CostSum), sum(A.UnitArea), 
	(case A.UnitArea when 0 then 0 else sum(CostSum)/sum(A.UnitArea) end) as avCostSum 
	from all_unitdepinfo A, gc_nhfxxdwzxfhzmon T 
	where (A.UnitCode=T.UnitCode and A.UnitDepCode=T.UnitDepCode) and (A.UnitCode='GC001') 
	group by A.UnitDepCode order by sum(CostSum)/sum(A.UnitArea) desc) D,
(select @rownum:=0) B;
輸出結果如下圖所示,即可:
注意:只有當你在實際操作資料庫過程中遇到了該問題,才知道這篇文章的好處!

4.子函式select a.*查詢

如果需要連線兩個查詢,並通過子查詢實現,如果每個值能一一對應上,建議使用select a.*

SELECT a.*, b.*   
FROM   
(SELECT SUM(DOMESTIC_TRAIN) + SUM(OVERSEA_TRAIN_TOTAL) AS zj,   
    SUM(DEGREE_PHD) AS qzgdbsx,   
    SUM(DOMESTIC_TRAIN) AS jnjxrcs,   
    SUM(OVERSEA_TRAIN_TOTAL) AS jwjxrcs   
 FROM TRAIN_INTERFLOW   
 where YEAR_START=to_char(sysdate,'yyyy')-2  
) a,   
(SELECT SUM(PARTICIPANT_NUMBER) AS cyjglxkrcs   
 FROM EDU_REVOLUTION   
 where YEAR_START=to_char(sysdate,'yyyy')-2  
) b;  
通常用於統計總數,不同總數進行總和,返回一條資料的情況。
其中表對應各學院的資訊,但希望你能學習這種SQL語句的格式。
輸出如下圖所示:

字串拼接輸出用法如下,輸出"1-8"時間段:
concat(TimeStart,'-',TimeEnd)

最後希望文章對你有所幫組,主要是記錄實際遇到的幾個問題,如果文章中存在不足之處,還請海涵~資料庫SQL語句確實只有當你真正遇到相關問題時,才會覺得相關解決方法有用。
同時後面的文章會講解如何使用Navicat for MySQL講解設定主鍵、外來鍵、遞增序列等。
(By:Eastmount 2016-08-23 深夜3點   
 )