1. 程式人生 > 其它 >MySQL(五)函式、DQL中的分組和過濾

MySQL(五)函式、DQL中的分組和過濾

MySQL函式

1、常用函式

資料函式

 SELECT ABS(-8);  /*絕對值*/
 SELECT CEILING(9.4); /*向上取整*/
 SELECT FLOOR(9.4);   /*向下取整*/
 SELECT RAND();  /*隨機數,返回一個0-1之間的隨機數*/
 SELECT SIGN(0); /*符號函式: 負數返回-1,正數返回1,0返回0*/

字串函式

 SELECT CHAR_LENGTH('狂神說堅持就能成功'); /*返回字串包含的字元數*/
 SELECT CONCAT('我','愛','程式');  /*合併字串,引數可以有多個*/
 SELECT INSERT('我愛程式設計helloworld',1,2,'超級熱愛');  /*替換字串,從某個位置開始替換某個長度*/
 SELECT LOWER('KuangShen'); /*小寫*/
 SELECT UPPER('KuangShen'); /*大寫*/
 SELECT LEFT('hello,world',5);   /*從左邊擷取*/
 SELECT RIGHT('hello,world',5);  /*從右邊擷取*/
 SELECT REPLACE('狂神說堅持就能成功','堅持','努力');  /*替換字串*/
 SELECT SUBSTR('狂神說堅持就能成功',4,6); /*擷取字串,開始和長度*/
 SELECT REVERSE('狂神說堅持就能成功'); /*反轉
 
 -- 查詢姓周的同學,改成鄒
 SELECT REPLACE(studentname,'周','鄒') AS 新名字
 FROM student WHERE studentname LIKE '周%';

日期和時間函式

 SELECT CURRENT_DATE();   /*獲取當前日期*/
 SELECT CURDATE();   /*獲取當前日期*/
 SELECT NOW();   /*獲取當前日期和時間*/
 SELECT LOCALTIME();   /*獲取當前日期和時間*/
 SELECT SYSDATE();   /*獲取當前日期和時間*/
 
 -- 獲取年月日,時分秒
 SELECT YEAR(NOW());
 SELECT MONTH(NOW());
 SELECT DAY(NOW());
 SELECT HOUR(NOW());
 SELECT MINUTE(NOW());
 SELECT SECOND(NOW());

系統資訊函式

 SELECT VERSION();  /*版本*/
 SELECT USER();     /*使用者*/

2、聚合函式(常用)

 -- 聚合函式
 /*COUNT:非空的*/
 SELECT COUNT(studentname) FROM student;
 SELECT COUNT(*) FROM student;
 SELECT COUNT(1) FROM student;  /*推薦*/
 
 -- 從含義上講,count(1) 與 count(*) 都表示對全部資料行的查詢。
 -- count(欄位) 會統計該欄位在表中出現的次數,忽略欄位為null 的情況。即不統計欄位為null 的記錄。
 -- count(*) 包括了所有的列,相當於行數,在統計結果的時候,包含欄位為null 的記錄;
 -- count(1) 用1代表程式碼行,在統計結果的時候,包含欄位為null 的記錄 。
 /*
 很多人認為count(1)執行的效率會比count(*)高,原因是count(*)會存在全表掃描,而count(1)可以針對一個欄位進行查詢。其實不然,count(1)和count(*)都會對全表進行掃描,統計所有記錄的條數,包括那些為null的記錄,因此,它們的效率可以說是相差無幾。而count(欄位)則與前兩者不同,它會統計該欄位不為null的記錄條數。
 
 下面它們之間的一些對比:
 
 1)在表沒有主鍵時,count(1)比count(*)快
 2)有主鍵時,主鍵作為計算條件,count(主鍵)效率最高;
 3)若表格只有一個欄位,則count(*)效率較高。
 */
 
 SELECT SUM(StudentResult) AS 總和 FROM result;
 SELECT AVG(StudentResult) AS 平均分 FROM result;
 SELECT MAX(StudentResult) AS 最高分 FROM result;
 SELECT MIN(StudentResult) AS 最低分 FROM result;

題目(涉及分組和過濾)

 -- 查詢不同課程的平均分,最高分,最低分
 -- 前提:根據不同的課程進行分組
 
 SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
 FROM result AS r
 INNER JOIN `subject` AS s
 ON r.subjectno = s.subjectno
 GROUP BY r.subjectno
 HAVING 平均分>80;
 
 /*
 where 中不能使用聚合函式
 where寫在group by前面.
 要是放在分組後面的篩選
 要使用HAVING..
 因為having是從前面篩選的欄位再篩選,而where是從資料表中的>欄位直接進行的篩選的
 */