函数
函数,在Java中我们叫方法,MySQL 函数会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。
MySQL 包含了大量并且丰富的函数,我们可以对 MySQL 常用函数进行简单的分类,大概包括数值型函数、字符串型函数、日期时间函数、聚合函数等。
MySQL 数值型函数
作 用 | 函数名称 |
求绝对值 | ABS |
求二次方根 | SQRT |
求余数 | MOD |
两个函数功能相同,都是返回不小于参数的最小整数,即向上取整 | CEIL 和 CEILING |
向下取整,返回值转化为一个BIGINT | FLOOR |
生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列 | RAND |
对所传参数进行四舍五入 | ROUND |
两个函数的功能相同,都是所传参数的次方的结果值 | POW 和 POWER |
求正弦值 | SIN |
求反正弦值,与函数 SIN 互为反函数 | ASIN |
求余弦值 | COS |
求反余弦值,与函数 COS 互为反函数 | ACOS |
求正切值 | TAN |
求反正切值,与函数 TAN 互为反函数 | ATAN |
求余切值 | COT |
MySQL 字符串函数
函数名称 | 作 用 |
LENGTH | 计算字符串长度函数,返回字符串的字节长度 |
CONCAT | 合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个 |
CONCAT_WS | CONCAT的变种,可以将多个字符串按照统一格式进行拼接 |
INSERT | 替换字符串函数下标从1开始,INSERT(idcard,2,2,'**') : 将身份证号第二个开始连续两个替换成 |
LOWER | 将字符串中的字母转换为小写 |
UPPER | 将字符串中的字母转换为大写 |
LEFT | 从左侧字截取符串,返回字符串左边的若干个字符 |
RIGHT | 从右侧字截取符串,返回字符串右边的若干个字符 |
TRIM | 删除字符串左右两侧的空格 |
REPLACE | 将指定的字符串替换成新的字符串 |
SUBSTRING | 截取字符串,返回从指定位置开始的指定长度的字符换 |
REVERSE | 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串 |
MySQL 日期和时间函数
函数名称 | 作 用 |
CURDATE 和 CURRENT_DATE | 两个函数作用相同,返回当前系统的日期,只包含年、月、日SELECT CURDATE() 、SELECT CURRENT_DATE() |
CURTIME 和 CURRENT_TIME | 两个函数作用相同,返回当前系统的时间值 |
NOW 和 SYSDATE | 两个函数作用相同,返回当前系统的日期和时间值 |
UNIX_TIMESTAMP | 获取时间戳,也可以将指定的日期转成时间戳 |
FROM_UNIXTIME | 将时间戳转成日期UNIX_TIMESTAMP()、UNIX_TIMESTAMP('2022-05-30') |
MONTH | 获取指定日期中的月份 |
MONTHNAME | 获取指定日期中的月份英文名称 |
DAYNAME | 获取指定曰期对应的星期几的英文名称 |
DAYOFWEEK | 获取指定日期对应的一周的索引位置值,周日是1,周一是2...... |
WEEK | 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53 |
DAYOFYEAR | 获取指定曰期是一年中的第几天,返回值范围是1~366 |
DAYOFMONTH | 获取指定日期是一个月中是第几天,返回值范围是1~31 |
YEAR | 获取年份,返回值范围是 1970〜2069 |
TIME_TO_SEC | 将时间参数转换为秒数TIME_TO_SEC('2022-05-19 15:14:08') |
SEC_TO_TIME | 将秒数转换为时间,与TIME_TO_SEC 互为反函数 |
DATE_ADD 和 ADDDATE | 两个函数功能相同,都是向日期添加指定的时间间隔 DATE_ADD('2022-05-19 15:14:08',INTERVAL 1 DAY) |
DATE_SUB 和 SUBDATE | 两个函数功能相同,都是向日期减去指定的时间间隔DATE_SUB('2022-05-19 15:14:08',INTERVAL 1 DAY) |
ADDTIME | 时间加法运算,在原始时间上添加指定的时间ADDTIME('2022-05-19 15:14:08','10:00:00') |
SUBTIME | 时间减法运算,在原始时间上减去指定的时间SUBTIME('2022-05-19 15:14:08','10:00:00') |
DATEDIFF | 获取两个日期之间间隔,返回参数 1 减去参数 2 的值 |
DATE_FORMAT | 格式化指定的日期,根据参数返回指定格式的值,这个转换格式与Java不同 如 %Y-%m-%d %H:%i:%s |
WEEKDAY | 获取指定日期在一周内的对应的工作日索引周一是0,周二是1....... |
MySQL 聚合函数
函数名称 | 作用 |
MAX | 查询指定列的最大值 |
MIN | 查询指定列的最小值 |
COUNT | 统计查询结果的行数 |
SUM | 求和,返回指定列的总和 |
AVG | 求平均值,返回指定列数据的平均值 |
MySQL 流程控制函数
函数名称 | 作用 |
IF(v,v1,v2) | 判断v值,如果符合返回v1,不符合返回v2,流程控制 |
IFNULL(v1,v2) | 判断是否为空,v1不为空返回自己,为空返回v2 |
CASE WHEN... THEN WHEN...THEN ... ELSE ... END | 搜索语句,类似于Java中的if .... else if .... else |
CASE ... WHEN ... THEN WHEN...THEN ... ELSE ..END | 搜索语句,类似于Java中的Switch case |
SQL练习
第一题:请你从exam_record数据表中计算所有用户完成SQL类别高难度试卷得分的截断平均值(去掉一个最大值和一个最小值后的平均值)examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)
1. SELECT 2. tag, 3. difficulty, 4. round(( sum( score ) - max( score ) - min( score )) / ( count( score ) - 2 ), 1 ) AS clip_avg_score 5. FROM 6. exam_record 7. LEFT JOIN examination_info ON exam_record.exam_id = examination_info.exam_id 8. WHERE 9. tag = "SQL" 10. AND difficulty = "hard"
第二题:展示出第一张表所有数据,90分以上为优,80-90良,60-80中 小于60为不及格。
1. SELECT id,uid, CASE WHEN score >90 THEN '优' 2. WHEN score >80 AND score< 90 THEN '良' 3. WHEN score >60 AND score< 80 THEN '中' 4. WHEN score< 60 THEN '不及格' 5. ELSE '未知' END 6. FROM exam_record
第三题:求出每个用户每个科目的平均值,并将科目放到表头(行转列)
1. SELECT 2. er.id, 3. er.uid, 4. er.exam_id, 5. avg( CASE ei.tag WHEN 'SQL' THEN er.score END ) AS 'sql', 6. avg( CASE ei.tag WHEN '算法' THEN er.score END ) AS '算法' 7. FROM 8. exam_record er 9. JOIN examination_info ei USING ( exam_id ) 10. GROUP BY 11.er.uid