1. 程式人生 > 資料庫 >MySQL-常見小疑惑

MySQL-常見小疑惑

1. DISTINCT 多列去重

  1.1 select DISTINCT a,b 實際含義是?

    正確:排除 (a列重複且b列重複)的記錄 

    錯誤:排除 a b兩列 值合併後 重複的記錄。

    舉例1:

    去重前,10個記錄

    

    按照distinct a,b 去重,原來10個記錄,現在查到了8個。

    

  1.2 展示多列,但是隻選擇只去重一列的實現方法:使用group by 

    select a, b from tablename group by a;

  舉例1:

  原紀錄中重複的 王15 和王17,因為group by sname ,排除掉了,展示的時候,結果只選中和展示1個王15和1個王17

  

  結論:無論是distinct還是group by,在單列去重的時候,都是隻保留多個重複記錄中的的一個記錄,但是其他列可能資料實際上可能一樣也可能不一樣  

 

  1.3 DISTINCT關鍵字位置必須放在SQL語句的select之後,第一個列名之前

  1.4 與count()函式結合用例:

    select count(distinct name) from A;(待確認mysql是否支援語句),

    select count(s.sname) from(select distinct sname from test_student) s(相對上例比較複雜,待確認mysql是否支援語句)     

 2.

ORDER BY 多列排序

  2.1 select * from tableA order by columnA [asc],columnB [asc]; //預設升序,先按照A列排序後,在A列排序的基礎上按照B列排序。

    存疑:當A列存在/不存在相同項,B列排序會影響原有順序嗎?

    舉例1:A(sage)列存在相同列

    

    舉例2:A列(score)不存在相同項舉例

    

   結論:

    1.多列排序應用場景:在A列排序後,多個記錄中A列值相同,且B列存在可進一步排序的值。若A列所有記錄都是唯一的則沒有必要使用多列排序。

    2.ORDER BY 排列時,不寫明ASC DESC的時候,預設是ASC。

3. GROUP BY 

  3.1 group by 函式結合count()函式,可以統計各個分組的記錄數

  

  3.2 group by 函式結合sum(a)函式,可以分別統計各個分組的a列數值之和

   

4. HAVING 和 WHERE 區別

  1. 使用位置不一樣: where 是在GROUP BY前 ,HAVING 是在 GROUP BY後 ORDER BY前

  2. 作用物件不一樣:對 記錄 進條件過濾, 對 分組 進行條件過濾 

  3. 與聚合函式一起使用:where不能和聚合函式一起使用,如...where sum(age)>50..是錯誤的,having一般結合聚合函式使用,如...having count(id)>10...

 

5. on 和 WHERE 區別

  1. 生效階段不同:on是在生成中間表(臨時表)時生效,where是在生成臨時表後,對臨時表進行再次過濾。—重要,可以結合如下 例一,例二 理解

  2. 對於inner join ,on 和 where 的結果是一樣的,但是對於外連結(left/right/full),是不一樣的。

  例一:

   建表tb1,tb2如下:

   

  執行1:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a LEFT JOIN tb2 b ON a.AID=b.BID;

  執行2:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a LEFT JOIN tb2 b ON a.AID=b.BID AND b.BNAME='2';

  執行3:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a LEFT JOIN tb2 b ON a.AID=b.BID WHERE b.BNAME='2';

  執行4:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a INNER JOIN tb2 b ON a.AID=b.BID AND b.BNAME='2';

  執行5:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a INNER JOIN tb2 b WHERE a.AID=b.BID AND b.BNAME='2';

  執行6:SELECT a.AID,a.ANAME ,b.BID,b.BNAME FROM tb1 a INNER JOIN tb2 b ON a.AID=b.BID WHERE b.BNAME='2';

  結果1:                              結果2:                              結果3:

      

   結果4:                              結果5:                              執行6:

      

  例二:

  假設建兩張表如下:

6. inner join 和 left join 區別

  參考《MySQL-實體對映關係和連線查詢》隨筆