[資料庫] 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語句如下:
(2)如何判斷時間範圍,如在2016-08-17到2016-08-20之間的資料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
通常會使用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點 )