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的區別?
-
truncate刪除後,如果再插入,標識列從1開始 delete刪除後,如果再插入,標識列從斷點開始
-
delete可以添加篩選條件 truncate不可以添加篩選條件
-
truncate效率較高
-
truncate沒有返回值 delete可以返回受影響的行數
-
truncate不可以回滾 delete可以回滾
10> Mysql有哪些整型? 它們之間有什麼區別?
類型 | tinyint | smallint | mediumint | int/integer | bigint |
字節數 | 1 | 2 | 3 | 4 | 8 |
特點:
- ①都可以設置無符號和有符號,默認有符號,通過unsigned設置無符號
- ②如果超出了範圍,會報out or range異常,插入臨界值
- ③長度可以不指定,默認會有一個長度代表顯示的最大寬度,如果不夠則左邊用0填充,但需要搭配zerofill,並且默認變爲無符號整型