數(shù)據(jù)庫數(shù)據(jù):

CONCAT和CONCAT_WS:
#把信息用CONCAT連接
SELECT CONCAT (id, ',', username, ',', PASSWORD) AS info FROM my_test;
#使用CONCAT_WS,分割符連接,第一個不會加上,最后一個也不會加上!
SELECT CONCAT_WS(',', id,username,PASSWORD) AS info FROM my_test;

GROUP_CONCAT 和GROUP BY:
#group by 性別,名字和id會顯示不全,并且不能用select *
SELECT sex, id, username FROM my_test GROUP BY sex;
#GROUP_CONCAT解決上面的,按照性別分組后,想要選出這個性別下面的所有名字,可以采用這種方式:select要有sex 然后group by也是sex
#如果不用group by 只有n顯示男的! 一般都是結合使用
#注意:GROUP_CONCAT里面可以寫distinct order by 這些,還可以決定使用哪種分隔符:username separator ';'
SELECT sex, GROUP_CONCAT(id) AS ids, GROUP_CONCAT(DISTINCT username) AS NAMES FROM my_test GROUP BY sex;


GROUP BY 結合聚合函數(shù):
- group by 從英文里理解就是分組。必須有聚合函數(shù)來配合才能使用,使用時至少需要一個分組標志字段
要不然沒有意義!除非分組的那個列對應數(shù)據(jù)剛好只有一個! - 當使用group by子句時則select中關于表的原始屬性名只能是被"by"的屬性,如上例中的SNO。若想輸出其他屬性列,則應在select子句后加上相應的聚合函數(shù)(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其實這也很容易理解,當參照SNO被分組后,每一個SNO的具體實例與其他任意一個屬性都變成一對一或一對多的關系,只有通過聚合函數(shù)將每組其他想要的屬性的多個實例算成一個值,即SNO與其形成一對一的關系后才能列出。而且一旦SQL語句中使用了group by子句后聚合函數(shù)都變成分別對每組起作用
順序:先執(zhí)行group by分組后再執(zhí)行聚合函數(shù)進行對應的計算
#統(tǒng)計博客種類數(shù)量
SELECT username,COUNT(username) AS 數(shù)量 FROM my_test GROUP BY username
#統(tǒng)計日期歸檔數(shù)量
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
#計算小王所有成績的的平均分
SELECT username,AVG(score) AS 平均分 FROM my_test GROUP BY username



having和where的用法區(qū)別
where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),where條件中不能包含聚組函數(shù),使用where條件過濾出特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經常包含聚組函數(shù),使用having 條件過濾出特定的組,也可以使用多個分組標準進行分組。
- having只能用在group by之后,對分組后的結果進行篩選(即使用having的前提條件是分組)。
- where肯定在group by 之前。
- where后的條件表達式里不允許使用聚合函數(shù),而having可以。
比如上面的數(shù)據(jù):
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
如果要篩選出日期歸檔后 數(shù)量大于1的數(shù)據(jù):在group by后面加上HAVING COUNT(create_time)>1,
一般來說這個having 后面的條件對應的就是前面選出來的字段基礎上加上條件
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m') HAVING COUNT(create_time)>1
當一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候,執(zhí)行順序和編寫順序是:
查詢選修了3門以上課程,且所有課程成績都高于60分的學生學號及課程數(shù)
select sno , count(cno),sum(grade) sum_grade
from sc
where grade > 60
group by sno having count(cno) > 3
order by sum_grade desc
1.執(zhí)行where xx對全表數(shù)據(jù)做篩選,返回第1個結果集。
2.針對第1個結果集使用group by分組,返回第2個結果集。
3.針對第2個結果集中的每1組數(shù)據(jù)執(zhí)行select xx,有幾組就執(zhí)行幾次,返回第3個結果集。
4.針對第3個結集執(zhí)行having xx進行篩選,返回第4個結果集。
5.針對第4個結果集排序order by。
一條SQL語句個子句的先后作用過程:
from→where→group by→select(含聚合函數(shù))→order by
時間分組格式化函數(shù)
按年月日分組:
- DATE_FORMAT(create_time,'%Y%m') 也可以加上%Y年%m月
- DATE_FORMAT(create_time,'%Y%m%d')