MySQL(五)函式、DQL中的分組和過濾
阿新 • • 發佈:2021-08-11
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是從資料表中的>欄位直接進行的篩選的
*/