当前位置: 首页 > article >正文

单行函数与聚合函数

函数分类:

数字、字符串、日期和时间、流程控制、加密与解密、获取MySQL信息、聚合

单行与多行(复杂)函数

单行函数:

只对一行进行变换

每行返回一个结果

一、数值函数:

1、基本函数

ABS绝对值

SIGN返回符合

PI圆周率

CEIL  返回大于xx的最小整数

FLOOR 返回小于xx的最大整数

2.三角函数

Sin  cos  tan

进制转换

BIN十转二

HEX十转十六

OCT十转八

CONV(x,y,z)

y为原进制,z为目标进制

字符串函数

1、

ASCII()   只返回字符串中第一个字符的ASCII码值

CHAR_LENGTH()返回占用字节数

LENGTH长度与字符集有关。utf-8中,一个中文字符占用3字节

LPAD可以实现右对齐的效果

RPAD可以实现左对齐

INSERT见举例

SELECT

INSERT('HELLO',2,3,'bbbb')

FROM DUAL;

结果:HbbbbO

REPLACE见举例

SELECT

REPLACE('hello','llo','lll')

FROM DUAL;

TRIM去除首尾空格

举例:

SELECT

TRIM('L' FROM 'LAL')

FROM DUAL;

结果:A

LEFT举例:

SELECT

LEFT('Qum',2)

FROM DUAL;

结果:um

RIGHT同理

REPEAT(STR,X)

STR为需要重复的字符串,X为重复的字数

SPACE(n)返回n个空格

STRCMP(S1,S2)

SUBSTR(STR,X1,X2)从X1位置的字符开始取X个字符

LOCATE(STR,STR1)返回STR1在STR中所占的位置

ELT(X,s1,s2,s3)返回对应x位置的字符串。

FIELD(str,s1,s2,s3)返回对应字符串str在后续字符串中第一次出现的位置

FIND_IN_SET(str,str1)返回字符串str在后续字符串str1中的位置。

NULLIF(x,y)

x与y相等时返回NULL,否则返回x的值。

日期和时间函数:

(1)获取日期、时间

当前的年月日:CURDATE()、CURRENT_DATE()

当前时间:CURTIME

年月日加时间:NOW

UTC_DATE:英国日期

UTC_TIME:英国时间

(2)日期与时间戳的转换

UNIX_TIMESTAMP():以UNIX形式返回当前的时间戳

UNIX_TIMESTAMP(date):以UNIX形式返回指定日期的时间戳

FROM_UNIXTIME(timestamp):输入时间戳返回对应的日期

(3)月份、星期、星期数、天数等函数

YEAR(date) :返回对应年

 MONTH(date):返回对应月

  DAY(date):返回对应日

  HOUR(time)  MINUTE(time)  SECOND(time)以此类推

MONTHNAME(date)返回某月的名字

DAYNAME(date)返回周几的名字

QUARTER(date)返回第几个季度

WEEK(date)返回这一年第几周

DAYOFYEAR(date)返回这一年第几天

对比(计算原则不同):

DAYOFWEEK(date)这一周第几天(周日是1,周一是2)

WEEKDAY(date)返回这一周第几天。但是周一为0,周二为1

日期的操作函数:

使用EXTRACT进行展示

SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW())

FROM DUAL;

时间与秒钟的转换

TIME_TO_SEC时间转换为秒钟

SEC_TO_TIME转换为小时分秒

SELECT TIME_TO_SEC(NOW())

FROM DUAL;

SELECT SEC_TO_TIME('1265347')

FROM DUAL;

计算日期与时间的函数

DATE_ADD(datetime,INTERVAL n type)

n为数字,可以为负数,type为类似YEAR、DAY之类的时间

SELECT DATE_ADD(NOW(),INTERVAL '1_1'YEAR_MONTH )

FORM DUAL;

最终在NOW()的结果至上加上1年一个月。但此时需要对数字部分作为字符串处理。

SUBTIME(time1,time2)返回time2-time1的差值

DATEDIFF(date1,date2)返回两个日期的差值。

FROM_DAYS(n)返回从0000-1-1起n天之后的信息

TO_DAYS(date)返回date到0000-1-1的天数

LAST_DAY(date)返回date所在月份的最后一天的日期

MAKEDATE(year,n)针对给定年份与所在年份中的天数返回一个日期

MAKETIME(hour,minute,second)将给定的小事、分钟与秒合成时间并返回

PERIOD_ADD(time,n)  返回time加上n之后的时间

日期与时间的格式化和解析

格式化:日期--->字符串

解析:字符串--->日期

SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D')

FROM DUAL;

SELECT STR_TO_DATE(2025-January-17th,'%Y-%m-%d')

FROM DUAL;

流程控制函数

IF(VALUE,VALUE1,VALUE2)

VALUE为真则返回VALUE1,否则,返回VALUE2

SELECT last_name,salary,IF(salary>=6000,'high','low') "details"

FROM employees;

IFNULL(VALUE1,VALUE2)

SELECT last_name,salary,commission_pct,IFNULL(commission_pct,0) "details"

FROM employees;

可视作IF省略第二项为真的情况。

CASE WHEN…THEN…WHEN…THEN…ELSE…END

类似于if-else的结构

CASE … WHEN … THEN … WHEN … THEN … END

类似于switch-case结构

 

加密与解密函数

加密:PASSWORD(str)   MySQL8.0不推荐

MD5(str)不可逆

SHA(str)不可逆

ENCODE(加密)/DECODE(解密)  在MySQL8.0中不可用

MySQL信息函数

其他函数

FORMAT(value,n)  n表示value值保留n位小数,n<=0时保留整数

INET_ATON(ipvalue)ip地址转换为数字

INET_NTOA(value)数字ip转换为点分隔的ip地址

BENCHMARK()测试表达式的执行效率

CONVERT()可以实现字符集的转换

聚合函数

聚合函数是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。

对多个数据进行操作,最终只得到一个数据。

一、常见的几个聚合函数:

  • AVG( ):求平均值
  • SUM( ):求总和

适用于数值类型。自动过滤空值,以已有的数据进行计算。

  • MAX( ):求最大值
  • MIN( ):求最小值

适用于数字类型、字符串类型、日期时间类型的字段

以上四种函数均会过滤NULL空值

  • COUNT( ):计算指定的字段在查询结果中查询的个数

如果填入字符串,因为字符串之间的计算没有意义,最终的结果为0.

可以写作COUNT(*) COUNT(1) COUNT(具体字段)三种写法。.

COUNT1)可以视作将表中的每一行数据看作‘1’,所以最后查询结果为表的行数。

因为查询不包含NULL值,所以 COUNT(具体字段)的写法不准确。

易得结论:AVG = SUM/COUNTX

另外补充:当使用MYISAM存储引擎,三种写法效率相同。如果使用InnoDB存储引擎,则COUNT(*)=COUNT(1)>COUNT(具体字段)

 

二、GROUP BY

用于分组。

举例:

结论:SELECT中出现的非组函数的字段,必须声明在GROUP BY中。

反之,GROUP BY 不声明的字段可以不出现在SELECT中。

顺序:GROUP 声明在WHERE之后、ORDER BY 之间。

此时使用 WITH ROLLUP将所有分组视作新的一个分组进行AVG的计算,所以比单独凭借department_id分组多出一行。

WITH ROLLUP ORDER BY 不同时使用,否则报错。

GROUP BY ORDER BY 可以同时使用,没有影响。

 

三、HAVING的使用

HAVING的作用:过滤数据

前提:SQL中使用了GROUP BY,则可以使用HAVING写过滤条件。

补充:不使用GROUP BY也可以使用HAVING对聚合函数条件进行过滤。

例如:

该段代码可以成功执行。

如果过滤条件中出现了 聚合函数 ,则必须使用HAVING 替换WHERE,否则报错。

要求:HAVING应当写在GROUP BY之后。

额外要求:过滤条件中不存在聚合函数的时候,应当优先采用WHERE,因为WHERE的效率要高于HAVING

举例:

对比:

 

四、SQL底层执行原理

1.SELECT 语句的完整结构

 

2SQL99语法:

SELECT …(存在聚合函数)

 

FROM…

(LEFT/RIGHT) JOIN 表名 ON 多表的连接条件

WHERE 不包含聚合函数的过滤条件

GROUP BY …

HAVING 包含聚合函数的过滤条件

 

ORDER BY …(ASC/DESC)

LIMIT…

 

FROM…  -> ON(进行过滤) -> (LEFT/RIGHT) JOIN -> WHERE ->GROUP BY ->HAVING ->SELECT ->DISTINCT ->ORDER BY ->LIMIT


http://www.kler.cn/a/531030.html

相关文章:

  • GWO优化SVM回归预测matlab
  • doris:导入时实现数据转换
  • 【C++篇】哈希表
  • 【Pandas】pandas Series min
  • 音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现
  • C语言 --- 分支
  • Windows 安装Linux子系统
  • Autosar CP RTE规范解读之RTE与VFB以及RTE API关系解析
  • 【机器学习篇】K-Means 算法详解:从理论到实践的全面解析
  • 高阶开发基础——快速入门C++并发编程3
  • 掌握 HTML5 多媒体标签:如何在所有浏览器中顺利嵌入视频与音频
  • va_list va_start va_end的概念和使用案例
  • python:如何播放 .spx 声音文件
  • Mac电脑上最新的好用邮件软件比较
  • Docker环境下Nacos的保姆级安装教程
  • UE PlayerState
  • 【FreeRTOS 教程 八】直达任务通知
  • YOLOV11-1:YoloV11-安装和CLI方式训练模型
  • 使用Express.js和SQLite3构建简单TODO应用的后端API
  • cf div3 998 E(并查集)
  • 几种用户鉴权的方式对比
  • Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
  • 讲清逻辑回归算法,剖析其作为广义线性模型的原因
  • volatile变量需要减少读取次数吗
  • 49【服务器介绍】
  • 常见的 Vue.js 组件库:Element Plus, Vuetify, Quasar