SQL語句的幾個常用函數
1、sql中sum和count的區別 ----sql聚合函數 (1)首先,sum是對一個字段求和,hive中字段的類型一般是string或者是int,如果是int當然沒有問題,如果是string類型但是全部是數字也沒有問題,但是如果string類型中包含一個字母,sum的結果將會是0 例如如下的表:user_id string shop_id string1234 hello1234 1234 那么sum(user_id)的結果就是2468,sum(shop_id)的結果就是0.如果沒有符合的條件的記錄,sum的返回值就是Null,如:sum(case when user_id但是有些時候我們希望sum的結果如果沒有符合的記錄就返回0,可以用coalesce(shop_id, 0)解決這個問題。
(2)count是對數據記錄的條數進行統計,有一條符合的記錄就是1,沒有就是0.2、 case when then end用法示例: -----sql流程控制函數 case value when compare-value then result when compare-value then result …… else result end 例如:select case when 1>0 then 'yes' else 'no' end;+----------------------------------------+ | case when 1>0 then 'yes' else 'no' end |+----------------------------------------+ | yes |+----------------------------------------+3、row_number( ) over用法: -------sql分析函數 row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的). 4、if()函數 ----------sql流程控制函數 (1) if(expr1, expr2, expr3) 如果expr1返回真, 則該表達式返回expr2,否則返回expr3 e.g. mysql> select if(strcmp('test','test'),'no','yes');+--------------------------------------+ | if(strcmp('test','test1'),'no','yes') |+--------------------------------------+ | yes |+--------------------------------------+ 說明:strcmp(expr1, expr2)這個函數在expr1小于expr2時,返回-1,相等時返回0,其余情況返回1.在上面的例子中,strcmp返回-1,所以上例輸出返回yes (2) ifnull(expr1, expr2) 該函數在expr1為NULL時,返回expr2,否則,返回expr1. (3) nullif(expr1, expr2) 如果expr1=expr2,則返回NULL,否則,返回expr15、max()函數 和min()函數 ------sql聚合函數 語法:MIN(e1)、MAX(e1) 參數:e1為一個字符型、日期型或數值類型的表達式。若e1為字符型,則根據ASCII碼來判斷最大值與最小值。
返回:根據e1參數的類型,返回對應類型的數據。作用:MIN(e1)返回e1表達式指定的列中最小值;MAX(e1)返回e1表達式指定的列中最大值;說明:max函數可以使用于numeric、char、varchar、money、smallmoney、或datetime列,但不能用于bit列。
不允許使用聚合函數和子查詢。e.g.查詢TEACHER表中教師的最大年齡。
實例代碼:SELECT MAX (AGE) AS MAXAGE FROM TEACHER 運行結果如下圖所示:圖1TEACHER表中教師的最大年齡 然而,在實際應用中得到這個結果并不是特別有用,因為經常想要獲得的信息是具有最大年齡的教師的教工號、姓名、性別等信息。然而SQL不支持如下的SELECT語句: SELECT TNAME, DNAME, TSEX, MAX (AGE) FROM TEACHER 因為聚合函數處理的是數據組,在本例中,MAX函數將整個TEACHER表看成一組,而TNAME、DNAME和TSEX的數據都沒有進行任何分組,因此SELECT語句沒有邏輯意義。
同樣的道理,下面的代碼也是無效的:SELECT TNAME, DNAME, TSEX,SAL ,AGE FROM TEACHER WHERE AGE=MAX (AGE) 解決這個問題的方法,就是在WHERE子句中使用子查詢來返回最大值,然后再基于這個返回的最大值,查詢相關信息。下例在WHERE子句中使用子查詢返回最大值:查詢TEACHER表中年紀最大的教師的教工號、姓名、性別等信息。
實例代碼:SELECT TNAME, DNAME, TSEX, SAL, AGE FROM TEACHER WHERE AGE=(SELECT MAX (AGE) FROM TEACHER) 運行結果如下圖所示:。
SQL語句如何實現判斷
LZ太懶,都不思考
declare @count int
set @count = (select count(*) from hrm_staff) --獲得第一句查到的行數
if @count > 0 ---第一張表如果沒有記錄整個語句結束,這時候會顯示結果:命令已成功完成。
begin
set @count = (select count(*) from bss_id) --獲得第二句查到的行數
if @count = 0 ---如果第二張表里有數據,整個語句結束,顯示結果:命令已成功完成。
begin
select * from cmn_attend_set --執行第三句
end
end
--只有當第一張表有數據,第二張表沒有數據的時候才執行第三句,所以要根據實際情況寫if
--而不是直接拿來用
sql語句的條件判斷
case where datediff(dd,getdate(),baoziqi)<20 then '停止銷售' else '繼續銷售' end
不好意思,寫錯了case when datediff(dd,getdate(),baoziqi)<20 then '停止銷售' else '繼續銷售' end
把 '近效期'時'拉出來單獨判斷
case when * in ('破碎','包裝破損',,'召回','超過有效期','污染','脫片') then '停止銷售'
when * in ('近效期') and datediff(dd,getdate(),*i)<20 then '停止銷售' when * in ('不合格') then '報損處理' else '繼續銷售' end