一、函式學習
1、ROW_NUMBER() OVER()函式
語法格式:row_number() over(partition by 分組列 order by 排序列 desc)
注意;在使用 row_number() over()函式時候,over()里頭的分組以及排序的執行晚于 where 、group by、 order by 的執行,
①表資料
1 create table TEST_ROW_NUMBER_OVER( 2 id varchar(10) not null, 3 name varchar(10) null, 4 age varchar(10) null, 5 salary int null 6 ); 7 select * from TEST_ROW_NUMBER_OVER t; 8 9 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a',10,8000); 10 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a2',11,6500); 11 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b',12,13000); 12 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b2',13,4500); 13 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c',14,3000); 14 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c2',15,20000); 15 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,'d',16,30000); 16 insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,1800);View Code

②進行一次排序,無分組
格式:row_number() over(order by 欄位 desc)
select id,name,age,salary,row_number() over(order by salary desc) rn from TEST_ROW_NUMBER_OVER

③根據id分組排序
格式 row_number()over(partition by 欄位1 order by 欄位2 desc) 根據欄位1進行分組,再根據欄位2進行組內排序
select id,`name`,age,salary,row_number()over(partition by id order by salary desc) rn from TEST_ROW_NUMBER_OVER t;

④練習題
有這么一張表student,存在多個相同資料的項,因此請洗掉no、name、score都不相同的項,

第一步使用開窗函式篩選出以no、name、score為分組的項
select id,`no`,`name`,score,row_number()over(partition by `no`,`name`,score)as num from student

第二部通過join連接表進行洗掉多余相同的項
delete s from student s join (select id,`no`,`name`,score,row_number()over(partition by `no`,`name`,score)as num from student) a
on s.id = a.id where num != 1
執行完delete后在查詢整個student表

2、DATE_ADD()、DATE_SUB函式
DATE_ADD(date,INTERVAL expr unit) 加
DATE_SUB(date,INTERVAL expr unit) 減
說明;其中 date表示時間欄位或者時間型別 interval是固定標志,expr 表示數量,可以為正負,表示加減,unit表示日期型別 可以是yy,ww,dd等分別表示,年,周,天等, unit 引數可以是下列值: MICROSECOND 微秒;[計量] 一百萬分之一秒 SECOND 秒 MINUTE 分 HOUR 小時 DAY 天 WEEK 周 MONTH 月 QUARTER 三個月 YEAR 年 SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH
具體示例如下:
-- 得到當前時間增加1個小時的結果 select date_add(now(),interval 1 hour) -- 得到當前時間增加1天的結果 select date_add(now(),interval 1 day) -- 得到當前時間減少72個小時的結果 select date_add(now(),interval -72 hour) -- 還有一些更加高級的用法,比如增加一天一小時一分一秒 -- 但是如果你不太喜歡這種用法,你仍然可以使用等同于該數值的second來進行加減 date_add(now(),interval '1 1:1:1' day_second)
3、時間函式NOW()和SYSDATE()
NOW()取的是陳述句開始執行的時間,SYSDATE()取的是動態的實時時間,
因為NOW()取自mysql的一個變數”TIMESTAMP”,而這個變數在陳述句開始執行的時候就設定好了,因此在整個陳述句執行程序中都不會變化,
執行下面這個例子就明白了:
SELECT NOW(),SYSDATE(),SLEEP(3),NOW(),SYSDATE()
先查詢了NOW()和SYSDATE(),然后sleep了3秒,再查詢NOW()和SYSDATE(),結果如下:

NOW()還有3個同義詞,效果跟NOW()一樣,而且都有2種形式寫法:
LOCALTIME或LOCALTIME() ---> localtime LOCALTIMESTAMP
LOCALTIMESTAMP() ---> localtimestamp CURRENT_TIMESTAMP
CURRENT_TIMESTAMP() --->current_timestamp
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544917.html
標籤:Java
下一篇:面向物件進階第二天
