一、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