1、關(guān)于查詢結(jié)果去重
mysql> select distinct job from emp ;//distinct關(guān)鍵字
mysql> select ename,distinct job from emp;
以上的sql語句時錯誤的谈山。
記锥砩尽:distinct只能出現(xiàn)在所有字段的最前面。distinct后面有幾個字段奏路,就將后面的若干字段看成一個整體來進行去重畴椰。
案例:統(tǒng)計崗位的數(shù)量?
2鸽粉、關(guān)于分組語句與分組函數(shù)
分組函數(shù)包括:
count/avg/sum/max/min
分組語句group by
mysql>select max(sal),job from emp group by job;
注意:分組函數(shù)一般都會和group by聯(lián)合使用斜脂,這也是為什么它被稱為分組函數(shù)的原因。并且當任何一個分組函數(shù)都是在group by語句執(zhí)行結(jié)束之后才會執(zhí)行的触机。當一條sql語句沒有g(shù)roup by的話帚戳,整張表的數(shù)據(jù)會自成一組玷或。
注意:當查詢語句使用了分組語句group by時,select語句后面只能跟與分組有關(guān)的字段和分組函數(shù)片任!
如:select ename,job,max(sal) from emp group by job;
以上語句是錯誤的偏友!ename字段既沒有參與分組,又不是查詢函數(shù)对供,所以該條查詢命令出來結(jié)果將毫無意義(因為mysql語言比Oracle松散位他,所以才能出現(xiàn)結(jié)果,如果放在Oracle中運行將直接報錯)
多次分組
按照字段進行多個分組产场,如查詢每個部門每個崗位的工資總和:
3鹅髓、having與where語句
案例:找出每個部門的最高薪資,要求顯示薪資大于2900的數(shù)據(jù)京景。
第一種:where語句
第二種:having語句
注意:由于在查詢語句中窿冯,語句的執(zhí)行順序where>group by>having,所以先執(zhí)行where可以先過濾掉一部分無用的數(shù)據(jù)醋粟,再進行分組靡菇,而having語句需要對分組后的數(shù)據(jù)進行過濾重归。
所以在這種情況中where語句更有效率米愿。
案例:找出每個部門的平均薪資,要求顯示薪資大于2000的數(shù)據(jù)鼻吮。
注意:此時只能使用having語句育苟,因為此時計算平均值時需要計算全部數(shù)據(jù),不能將其他去掉椎木,所以最后過濾平均薪資小于2000的數(shù)據(jù)
4违柏、計算日期差
TimeStampDiff(間隔類型, 前一個日期, 后一個日期)
timestampdiff(YEAR, hiredate, now())
間隔類型:
SECOND 秒,
MINUTE 分鐘香椎,
HOUR 小時漱竖,
DAY 天,
WEEK 星期
MONTH 月畜伐,
QUARTER 季度馍惹,
YEAR 年
5、含有NULL的運算與空處理函數(shù)
select ename,(sal+comm)*12 as yearsal form emp;
注意:所有數(shù)據(jù)庫都是這樣規(guī)定玛界,只要有NULL參與運算的運算結(jié)果一定是NULL万矾。
ifnull()空處理函數(shù)
ifnull(可能為NULL的數(shù)據(jù),被當作什么處理)
屬于單行處理函數(shù)慎框。
其中sum函數(shù)在進行運算時會自動過濾NULL