一:DISTINCThtml
在使用mysql時,有時須要查詢出某個字段不重複的記錄,雖然mysql提供有distinct這個關鍵字來過濾掉多餘的重複記錄只保留一條,但每每只用它來返回不重複記錄的條數,而不是用它來返回不重記錄的全部值。其緣由是distinct只能返回它的目標字段,而沒法返回其它字段,這個問題讓我困擾了好久,用distinct不能解決的話,我只有用二重循環查詢來解決,而這樣對於一個數據量很是大的站來講,無疑是會直接影響到效率的。因此我花了不少時間來研究這個問題,網上也查不到解決方案,但最終仍是解決了。下面來看一個例子,看看我解決的心路歷程!mysql
1.數據庫表(tms_sgoods)sql
表結構大概這個樣子,這只是一個簡單的例子,實際狀況會複雜不少。數據庫
好比我想用一條語句查詢到SORDER_NO不重複的全部數據,那就必須使用distinct去掉多餘的重複記錄。函數
SELECT DISTINCT SORDER_NO FROM tms_sgoods3d
獲得的結果是:htm
好像達到了效果,但是,我想要獲得的是id值呢?改一下查詢語句吧:blog
SELECT DISTINCT SORDER_NO,SGOODS_ID FROM tms_sgoods排序
結果是:字符串
distinct怎麼沒有起做用?做用是起了,不過它同時做用了兩個字段,也就是必須得SGOODS_ID與SORDER_NO都相同時纔會被排除。。。
咱們再改改查詢語句:
SELECT SGOODS_ID,DISTINCT SORDER_NO FROM tms_sgoods
很遺憾,除了錯誤信息你什麼也得不到,distinct必須放在開頭。難到不能把distinct放到where條件裏?能,照樣報錯。。。。。。。
很麻煩吧?確實,費盡心思都沒有解決這個問題。沒辦法,繼續找人問。試了半天,仍是不行,最後在mysql手冊裏找到一個用法,用group_concat(distinct SORDER_NO)配合group by SORDER_NO實現了我所須要的功能,興奮,天佑我也。
SELECT SGOODS_ID,GROUP_CONCAT(DISTINCT SORDER_NO) FROM tms_sgoods GROUP BY SORDER_NO
結果是:
注意:group_concat函數是4.1支持的。終於搞定了,不過這樣一來,若是是給客戶部署的怎麼辦?所以只能要求客戶也升級了。
忽然一想,既然可使用group_concat函數,那其它函數能行嗎?趕忙用count函數一試,成功,我。。。。。。。想哭啊,費了這麼多工夫。。。。。。。。原來就這麼簡單……
SELECT *,COUNT(DISTINCT SORDER_NO) FROM tms_sgoods GROUP BY SORDER_NO
結果是:
最後一項是多餘的,不用管就好了,目的達到。
更鬱悶的是:忽然發現有更簡單的解決方法:
SELECT *FROM tms_sgoods GROUP BY SORDER_NO
結果是:
看來對mysql的瞭解仍是太膚淺了,不怕被笑話,發出來讓你們別犯一樣的錯誤。
二:GROUP BY
表結構和數據以下:
1.列出每一個部門最高薪水
SELECT DEPT,MAX(SALARY) AS MAXSALARY FROM tms_sgoods GROUP BY DEPT
結果以下:
2.查詢每一個部門的總薪水數
SELECT DEPT,SUM(SALARY) AS TOTAL FROM tms_sgoods GROUP BY DEPT
結果以下:
3.查詢公司2016年入職的各個部門每一個級別裏的最高薪水
SELECT DEPT,EDLEVEL,MAX(SALARY) AS MAXSALARY FROM tms_sgoods
WHERE HIREDATE >='2016-07-08'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
結果以下:
三:CONCAT()函數
CONCAT()函數用於將多個字符串鏈接成一個字符串。
使用數據表info做爲示例,其中 select id,name from info limit 1;返回的結果是:
1.語法及使用特色
CONCAT(str1,str2,...)
返回結果爲鏈接參數產生的字符串。若是任何一個參數爲NULL,則返回值爲NULL。能夠有一個或多個參數。
2.使用示例:select concat(id,',',name)as con from info limit 1;返回結果爲:
select concat('My',NULL,'QL');返回結果爲
3.如何指定參數之間的分隔符
使用函數CONCAT_WS()。使用語法爲:CONCAT_WS(separator,str1,str2,...)
CONCAT_WS()表明CONCAT With Separator,是CONCAT()的特殊形式。第一個參數是其餘參數的分隔符。分隔符的位置放在要鏈接的兩個字符串之間。分隔符能夠是一個字符串,也能夠是其餘參數。若是分隔符是NULL,則結果爲NULL。函數會忽略任何分隔符參數後的NULL值。可是CONCAT_WS()不會忽略任何空字符串。
如select CONCAT_WS('_',id,name) as con_ws from info limit 1;返回結果爲:
select CONCAT_WS(',','first name',NULL,'last name');返回結果爲:
四:GROUP_CONCAT()函數
這個函數能將相同的行組合起來,即所謂的行轉列。完整語法以下:
group_concat([DISTINCT]要鏈接的字段[order by ASC/DESC排序字段][Separator'分隔符'])