Mysql常見卻易錯的問題總結(一)

 

1> IFNULL語法

IFNULL只針對查詢出來的結果集進行處理, 並不會改變本身的數據

eg:

  • SELECT departmentid FROM employees WHERE IFNULL(departmentid,1); //結果無改變

  • SELECT IFNULL(departmentid,0) FROM employees; //departmentid爲null則顯示的值爲0


2> COUNT(expr)函數

COUNT(expr)函數只會對expr不爲null的數據進行統計

eg:

  • SELECT department_id FROM employees; // 顯示數據107條

  • SELECT COUNT(department_id) num FROM employees; //顯示數據106條


3> ORDER BY語法

ORDER BY不僅能處理表的字段, 還能處理別名.

注意: ORDER BY 僅能處於SELECT語句的末尾

eg:

  • SELECT departmentid id FROM employees ORDER BY departmentid;

  • SELECT department_id id FROM employees ORDER BY id;


4> 分組函數的處理數據類型

可以對數值型數據使用AVG 和 SUM 函數;

可以對任意數據類型的數據使用 MIN 和 MAX 函數;

COUNT(*) 返回表中記錄總數適用於任意數據類型。

  • max 最大值
  • min 最小值
  • sum 和
  • avg 平均值
  • count 計算個數

特點

  • ①語法

  • select max(字段) from 表名;

  • ②支持的類型 sum和avg一般用於處理數值型 max、min、count可以處理任何數據類型

  • ③以上分組函數都忽略null

  • ④都可以搭配distinct使用,實現去重的統計 select sum(distinct 字段) from 表;

  • ⑤count函數 count(字段):統計該字段非空值的個數 count(*):統計結果集的行數

  • ⑥ 和分組函數一同查詢的字段,要求是group by後出現的字段


5>非法使用聚合函數

不能在 WHERE 子句中使用聚合函數。

可以在 HAVING 子句中使用聚合函數。

eg:

  • SELECT departmentid, AVG(salary) FROM employees WHERE AVG(salary) > 80 GROUP BY departmentid; //錯誤寫法

  • SELECT departmentid, AVG(salary) FROM employees GROUP BY departmentid HAVING AVG(salary) > 80; //正確寫法 

原因:

sql語句的執行順序爲

 from子句 --> where 子句 --> group by 子句 --> having 子句 --> order by 子句 --> limit子句 --> select 子句

因爲聚合函數是對查詢出來的結果集運算的,當在where子句使用聚合函數時,此時根據group by 分割結果集的子句還沒有執行,此時只有from 後的結果集。

所以無法在where子句中使用聚合函數。


6> SUM()和AVG()執行時是否計算null值呢?

答案是: 不計算。分組函數基本上都是不計算null值的, 我們知道求平均數是先求出所有數字的和再除以數字的數量, 而MySQL的AVG()函數會自動過濾掉null。那麼問題來了,假如我們想要那些爲null的也計入有效結果怎麼辦呢?很簡單!使用IFNULL函數!

eg:

  • SELECT avg(salary), SUM(IFNULL(salary,0))/COUNT(*) FROM employees;

結果:


7> Mysql有兩種存儲引擎MYISAM和INNODB, 它們之間誰效率更高呢?爲什麼?

1、MyISAM:默認表類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法。不是事務安全的,而且不支持外鍵,如果執行大量的select,insert MyISAM比較適合。同樣因爲MYISAM自帶計數器, 在執行COUNT(*)時效率較高.

2、InnoDB:支持事務安全的引擎,支持外鍵、行鎖、事務是他的最大特點。如果有大量的update和insert,建議使用InnoDB,特別是針對多個併發和QPS較高的情況。

詳細比較推薦這篇博客: https://blog.csdn.net/s78365126/article/details/84584066


8> Mysql如何實現級聯刪除?

一、刪除單表的記錄

語法:delete from 表名 【where 篩選條件】【limit 條目數】

二、級聯刪除

語法: delete 別名1,別名2 from 表1 別名 inner|left|right join 表2 別名 on 連接條件 【where 篩選條件】


9> truncate與delete的區別?

  1. truncate刪除後,如果再插入,標識列從1開始 delete刪除後,如果再插入,標識列從斷點開始

  2. delete可以添加篩選條件 truncate不可以添加篩選條件

  3. truncate效率較高

  4. truncate沒有返回值 delete可以返回受影響的行數

  5. truncate不可以回滾 delete可以回滾


10> Mysql有哪些整型? 它們之間有什麼區別?

類型 tinyint smallint mediumint int/integer bigint
字節數 1 2 3 4 8

特點:

  • ①都可以設置無符號和有符號,默認有符號,通過unsigned設置無符號
  • ②如果超出了範圍,會報out or range異常,插入臨界值
  • ③長度可以不指定,默認會有一個長度代表顯示的最大寬度,如果不夠則左邊用0填充,但需要搭配zerofill,並且默認變爲無符號整型

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章