SQL函数

1.通用函数

1.Group by函数

作用:分组函数,根据一个或多个列对结果集进行分组,GROUP BY语句可与集合函数(COUNT,MAX,MIN,SUM,AVG)一起使用。having是分组后进行条件筛选,类似select where 结构

语法: group by 字段1,字段2 having 条件

例子:

(1)按单字段分组

#查询每个部门的员工数量
SELECT department_id,COUNT(1) 
FROM employees 
GROUP BY department_id ;

(2)按多字段分组

#查询每个部门,每个职务的平均工资
SELECT AVG(salary),department_id,job_id 
FROM employees 
GROUP BY department_id,job_id;

(3)按函数分组

#按名字长度分组,并筛选出数量大于5的名字长度
SELECT COUNT(1) c,LENGTH(last_name) len_name 
FROM employees 
GROUP BY len_name 
HAVING c>5;

注意:

1.查询内容中的字段,必须要出现在分组列表中,也就是select的字段必须出现在group by后面,集合函数里的字段就不需要了。

2.多个列分组情况下,分别以每个字段的不同组合分组。

例子: item=数学 sex=1 和 item=数学 sex=2 就会分到不同组中,以此达到计算和目的,会依次按照顺序分,先把第一个字段相同的划分为一组,再这些相同的字段中,再查找第二个字段相同的划分为一组。

2.concat函数

作用:是将括号中的字符串连接起来,但是有一定的规则就是:在连接字符串的时候,只要其中一个是NULL,那么将返回NULL!

语法:concat(字符串1,字符串2,…)

例子:SELECT * FROM USER name like concat(’%’, #{name}, ‘%’)

3.sum函数

作用:用于计算某一字段中所有行的数值之和

语法:sum(字段)

例子:select sum(user_id) from user

PS:

该字段数据得是数值,最好是数字类型的;字符串类型也可以,但在sqlserver得用cast(字段 as int)转换,Oracle和mysql就无需转换;

sum 求和时会对 null 进行过滤,不计算;

如果在没有返回行中使用 sum() 函数,sum 函数的返回值为 null,不是 0

4.count函数

作用:统计查询结果中的行数

语法:count(字段名)

例子:select count(user_id) from user

PS:

count 会忽略掉 NULL 的结果,所以 count(字段名) 这样使用的话,如果字段中包含为null的结果,将导致查询结果不准确。所以如果要查询结果行数可以使用count(1)和count(*)

count(1)和count(*)的区别:count(1)比count(*)效率更高

5.max函数

作用:统计一列中的最大值。NULL 值不包括在计算中

语法:max(字段)

例子:select max(user_id) from user

PS:

max函数可用于字符型数据,对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推;

max函数也可用于日期时间类型的数据,其大小排列就是日期时间的早晚,越早认为其值越小;

max函数忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则函数将返回NULL值;

6.min函数

作用:统计一列中的最小值。NULL 值不包括在计算中

语法:min(字段)

例子:select min(user_id) from user

PS:

min函数可用于字符型数据,对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推;

min函数也可用于日期时间类型的数据,其大小排列就是日期时间的早晚,越早认为其值越小;

min函数忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则函数将返回NULL值;

7.avg函数

作用:统计数值列的平均值。NULL 值不包括在计算中

语法:avg(字段)

例子:select avg(user_id) from user

2.oracle函数

1.to_char函数

作用:是将日期转换成字符串

语法:to_char(字段名, ’字符串格式’)

例子:SELECT * FROM USER where to_char(create_time,‘yyyy-MM-dd HH24:mi:ss’) like ‘%20%’

2.to_date函数

作用:是将字符串转换为数据库中的日期类型

语法:to_date(字符串,’字符串格式’)

例子:SELECT * FROM USER where create_time = to_date(‘2020-08-08’,‘yyyy-MM-dd’)

3.to_number函数

作用:是将字符串以fmt格式转换为数字

语法:to_number(字符串,‘格式’)。如不加格式,可直接转换为数字,前提是必须是数字字符串。

函数中有很多预定义的固定格式:

格式值含义
9代表一个数字
0强迫0显示
$显示美元符号
L强制显示一个当地的货币符号
.显示一个小数点
,显示一个千位分隔符号

例子:

1.SELECT * FROM USER where id = to_number(‘5’);

2.SELECT * FROM USER where id = to_number(‘RMB23’,’L99′);

4.nvl函数

作用:判断是否为null,不为null值进行处理

语法:NVL(a1,a2) 如果a1为null,返回a2,否则返回a1;

​ NVL2(a1,a2,a3) 语法:如果a1不为null,返回a2;a1为null,返回a3;

例子:select NVL(sum(user_id),0) from user

3.mysql函数

1.ifnull函数

作用:判断是否为null,不为null值进行处理

语法:ifnull(expr1,expr2) 如果expr1不是null,ifnull()返回expr1,否则它返回expr2;

​ if(expr1,expr2,expr3)如果expr1不是null, if()返回expr2, 否则 if() 返回expr3;

例子:select IFNULL(sum(user_id),0) from user

2.TIMESTAMPDIFF函数

作用:计算两个日期的差值
语法:TIMESTAMPDIFF(时间单位,参数1,参数2)
可以设置参数,可以精确到天(DAY),小时(HOUR),分钟(MINUTE),秒(SECOND),毫秒(FRAC_SECOND(低版本不支持,可以用秒,再乘1000)),单位为第一个参数设置的值
例子:

    --相差1天
  select TIMESTAMPDIFF(DAY, '2018-03-20 23:59:00', '2015-03-22 00:00:00');
  --相差49小时
  select TIMESTAMPDIFF(HOUR, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
  --相差2940分钟
  select TIMESTAMPDIFF(MINUTE, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
  --相差176400秒
  select TIMESTAMPDIFF(SECOND, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
  --查询出用户在某天通话时间大于15分钟的记录
    SELECT * FROMwhere TIMESTAMPDIFF(MINUTE, 开始时间字段, 结束时间字段) >15;
    --日期提前五分钟提醒的数据
    SELECT * FROMwhere TIMESTAMPDIFF(MINUTE, 规定日期字段, sysdate()) >5;
3.DATEDIFF函数

作用:计算两个日期的天数,返回值为相差的天数,int类型,不能定位到时分秒,固定天数为单位
语法:DATEDIFF(参数1,参数2)
注意:参数1-参数2为正,所以参数1为结束时间,参数2为开始时间

   --查询七天内的数据
   SELECT * FROMwhere DATEDIFF(sysdate(),开始时间字段) <7;

4.sql常见问题

1.字段为日期格式,模糊搜索不可用 like ‘数据%’,必须先把字段转化为字符串,再使用like模糊搜索

如在Oracle数据库中: to_char(create_time,‘yyyy-MM-dd HH24:mi:ss’) like ‘%20%’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值