一、 基本函数
1.1 count()
统计数据表中包含的记录行的总数
语法:
SELECT COUNT(*) FROM t1;
SELECT COUNT(字段名) FROM t1;
用法:
- count(*) 统计表中的总行数,无论某列有值或者空值,包含null
- count(1) 对表中第一列的值的行数进行计算,忽略null列
- count(字段) 计算指定列的总行数,忽略null
- count(distinct 字段) 计算指定列不重复数值的总行数,即去重
对统计结果进行排序(聚合后的值是无序的):
select count(num) from t1 group by num order by count(num) desc;
select count(num) as 'test' from t1 group by num order by test desc;
二、判断函数
2.1 case()
case()是一种多分支的函数,可以根据条件列表的值返回多个可能的结果表达式中的一个,分为简单函数与搜索函数,都可以实现相同的功能,但简单函数在功能方面没有搜索函数全面,比如写判断式。
2.1.1 简单函数
CASE <表达式>
WHEN <值1> THEN <操作>
WHEN <值2> THEN <操作>
...
ELSE <操作>
END
将 <表达式> 的值 逐一和 每个 when 跟的 <值> 进行比较
如果跟某个<值>想等,则执行它后面的 <操作> ,如果所有 when 的值都不匹配,则执行 else 的操作
如果 when 的值都不匹配,且没写 else,则会报错
2.1.2 搜索函数
CASE
WHEN <条件1> THEN <命令>
WHEN <条件2> THEN <命令>
...
ELSE commands
END
每个 <条件> 都是独立的,可以用 and 来连接多个查询条件
不同 <条件> 是互不关联且互不影响的
2.1.3 示例
#查询monitor_item_name字段的告警类型并赋值
select
*,case
monitor_item_name
when '容器磁盘使用率告警' then 1
when '中间件' then 2
else 3
end
from
test;
#根据表达式进行判断并赋值
select
*,case
when monitor_item_name = '容器磁盘使用率告警' then 1
when monitor_item_name = '中间件' or monitor_item_name = 'RDS云监控' then 2
else 3
end
from
test;
2.2 if()
IF()函数在条件为TRUE时返回一个值,如果条件为FALSE则返回另一个值
语法:
IF(condition, value_if_true, value_if_false)
- condition:判断条件
- value_if_true:如果condition的结果为TRUE,返回该值
- value_if_false:如果condition的结果为FALSE,返回该值
示例:
if(monitor_item_name = '容器磁盘使用率告警', 1, 0) as 磁盘,
if(alarm_source_cn = '中间件' or alarm_source_cn = 'RDS云监控',1,0) as 中间件
三、字符串函数
3.1 substring_index()
按关键字截取字符串
语法:
substring_index(input,delim,count)
- input:要截取的字符或字段
- delim:分隔符
- count:计数,若为正数,则从左往右数,截取第N个分隔符左边的全部数据;若为负数,则从右往左数,截取第N个分隔符右边的全部数据
例:
test=
substring_index(test,'.',1) => www
substring_index(test,'.',-1) => com
substring_index(substring_index(test,'.',2),'.',1) => nginx
3.2 concat()
字符串拼接函数,可连接多段
mysql> select concat(psa_id,'%') from ops_psas limit 1;
+--------------------+
| concat(psa_id,'%') |
+--------------------+
| 35360% |
+--------------------+
1 row in set (0.00 sec)
mysql> select concat(psa_id,'%','w') from ops_psas limit 1;
+------------------------+
| concat(psa_id,'%','w') |
+------------------------+
| 35360%w |
+------------------------+
1 row in set (0.00 sec)
mysql>
3.3 group_concat()
作用:将函数内的字段拼接起来,默认分隔符为,
语法:
separator:指定分隔符
distinct:去重
order by:排序
GROUP_CONCAT([DISTINCT] column1 [ORDER BY column2 ASC\DESC] [SEPARATOR seq])
示例:
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 2 | jer |
| 1 | tom |
+------+------+
2 rows in set (0.00 sec)
mysql> select group_concat(id,name separator ';') from t1;
+-------------------------------------+
| group_concat(id,name separator ';') |
+-------------------------------------+
| 2jer;1tom |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> select group_concat(distinct id,name order by id separator ';') from t1;
+----------------------------------------------------------+
| group_concat(distinct id,name order by id separator ';') |
+----------------------------------------------------------+
| 1tom;2jer |
+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
3.4 position()
返回字符串中第一次出现的子字符串的位置,如果在原始字符串中找不到子字符串,则此函数返回0,不区分大小写,且当任意一个参数为 NULL
时,函数将返回 NULL
语法: position(substring IN string)
- substring:必需项,要在字符串中搜索的子字符串
- string:必需项,要搜索的原始字符串
实例:
MySQL [sredev]> select position("he" in "Hello");
+---------------------------+
| position("he" in "Hello") |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
MySQL [sredev]> select position("WO" in "Hello world");
+---------------------------------+
| position("WO" in "Hello world") |
+---------------------------------+
| 7 |
+---------------------------------+
1 row in set (0.00 sec)
MySQL [sredev]> select position(1 in "Hello world");
+------------------------------+
| position(1 in "Hello world") |
+------------------------------+
| 0 |
+------------------------------+
1 row in set (0.00 sec)
MySQL [sredev]> select position(null in "Hello world");
+---------------------------------+
| position(null in "Hello world") |
+---------------------------------+
| NULL |
+---------------------------------+
1 row in set (0.00 sec)
MySQL [sredev]>
也可以用在where条件里,类似于like
MySQL [sredev]> select * from alarm_lists where position('rec' in product)!=0 limit 1\G
四、数值函数
4.1 round()
数值保持小数点后几位
mysql> select round(12.343435,2);
+--------------------+
| round(12.343435,2) |
+--------------------+
| 12.34 |
+--------------------+
1 row in set (0.00 sec)
五、类型转换函数
5.1 cast()
将任何类型的值转换为具有指定类型的值,以便在WHERE,JOIN和HAVING子句中进行比
语法:
CAST(expression AS TYPE);
TYPE支持的类型:
- char(字符)
- date(日期)
- time(时间)
- datetime(日期时间)
- decimal(浮点型 float)
- signed(整数 int)
示例:
两数相除,结果类型转为浮点型,decimal(m,n),m表示精度,即小数点左右两边相加的位数;n表示小数位数,即保留多少为小数;m>=n
mysql> select cast(367132728 / 367132745 as decimal(13,12));
+-----------------------------------------------+
| cast(367132728 / 367132745 as decimal(13,12)) |
+-----------------------------------------------+
| 0.999999953000 |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql>
六、比较函数
6.1 greatest(),least()
作用:从给定参数中返回最大值或最小值(max()是纵向比较,而greatest()是横向比较)
语法:
GREATEST(value1, value2, ...);
LEAST(value1,value2,...);
注:
- 如果任何参数为NULL,则两个函数都将立即返回NULL,而不进行任何比较,可用IFNULL函数将NULL视为零来执行数字比较
- 如果在INT或REAL上下文中使用函数,或者所有参数都是整数值或REAL值,那么它们将分别作为INT和REAL来比较
- 如果参数由数字和字符串组成,则函数将它们作为数字进行比较
- 如果至少一个参数是非二进制(字符)字符串,则函数将将参数作为非二进制字符串进行比较
- 在所有其他情况下,函数将参数作为二进制字符串进行比较
示例:
mysql> select greatest(20,6,45,788,32445);
+-----------------------------+
| greatest(20,6,45,788,32445) |
+-----------------------------+
| 32445 |
+-----------------------------+
1 row in set (0.00 sec)
mysql> select greatest(20,6,45,788,32445,ifnull(null,0));
+--------------------------------------------+
| greatest(20,6,45,788,32445,ifnull(null,0)) |
+--------------------------------------------+
| 32445 |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql>