文章目錄
- 一、MySQL函數
-
- 1. 資料函數
- 2. 日期函數
- 3. 字元串函數
- 4. 聚合函數
- 二、題目
一、MySQL函數
1. 資料函數
SELECT ABS(-1) -- 傳回絕對值
SELECT CEILING(1.5); -- 向上取整
SELECT FLOOR(1.5) -- 向下取整
SELECT RAND(); -- 随機數,傳回一個0-1之間的随機數
SELECT SIGN(-10) -- (-1)符号函數:負數為-1,正數為1,0為0
2. 日期函數
SELECT CURRENT_DATE(); -- 傳回目前日期
SELECT CURDATE(); -- 傳回目前日期
SELECT CURRENT_TIME(); -- 傳回目前時間
SELECT CURRENT_TIMESTAMP(); -- 傳回目前日期和時間
SELECT LOCALTIME(); -- 傳回目前日期和時間
SELECT NOW(); -- 傳回目前日期和時間
SELECT SYSDATE(); -- 傳回目前日期和時間
3. 字元串函數
SELECT CHAR_LENGTH("RUNOOB") AS LengthOfString; -- 傳回字元串 s 的字元數
SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString; -- 合并多個字元串
SELECT INSERT("google.com", 1, 6, "runnob"); -- 輸出:runoob.com ,字元串 s2 替換 s1 的 x 位置開始長度為 len 的字元串
SELECT LOWER('RUNOOB') -- runoob,字元串轉換為小寫
SELECT REPLACE('abc','a','x') --xbc,将字元串 s2 替代字元串 s 中的字元串 s1
SELECT REVERSE('abc') -- cba,将字元串s的順序反過來
SELECT UPPER("runoob"); -- RUNOOB,将字元串轉換為大寫
SELECT LEFT('runoob',2) -- ru,傳回字元串 s 的前 n 個字元
SELECT RIGHT('runoob',2) -- ob,傳回字元串 s 的後 n 個字元
SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO,從字元串 s 的 start 位置截取長度為 length 的子字元串
4. 聚合函數
- AVG (平均)
- COUNT (計數)
- MAX (最大值)
- MIN (最小值)
- SUM (總合)
AVG 通常為數值字段或表達列作統計,傳回一列的平均值
SELECT AVG(Price) AS AveragePrice FROM Products; -- 傳回 Products 表中Price 字段的平均值:
COUNT 傳回滿足Select條件的記錄總和數,如 select count(*) 【不建議使用 *,效率低】
SELECT COUNT(studentname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;
-- count(字段) 會統計該字段在表中出現的次數,忽略字段為null 的情況。即不統計字段為null 的記錄。
-- count(*) 包括了所有的列,相當于行數,在統計結果的時候,包含字段為null 的記錄;
-- count(1) 用1代表代碼行,在統計結果的時候,包含字段為null 的記錄 。
MAX 可以為數值字段,字元字段或表達式列作統計,傳回最大的值。NULL值不包括在計算中
-- 列出表 Orders 字段 OrderPrice 列最大值,
-- 結果集列不顯示 OrderPrice 顯示 LargestOrderPrice
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
MIN MIN 函數傳回一列中的最小值。NULL 值不包括在計算中
SELECT MIN(column_name) FROM table_name
SUM SUM 函數傳回數值列的總數(總額)
SELECT SUM(column_name) FROM table_name
二、題目
-- 查詢不同課程的平均分,最高分,最低分
-- 前提:根據不同的課程進行分組
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寫在group by前面.
要是放在分組後面的篩選
要使用HAVING..
因為having是從前面篩選的字段再篩選,而where是從資料表中的>字段直接進行的篩選的
*/
附上狂神的連結:https://www.bilibili.com/video/BV1NJ411J79W?p=30