MYSQL高阶技能之函数和自定义函数

一.CASE函数

变量

set @test = 1;
select count(*) from school.student into @test;
select @test;
replace into s_count (c) values (@test);

sql中用一个@符号开头表示变量。

CASE函数:CASE…………END

-----比如:计算及格不及格------
    select (case 
    when score>=90 then '优秀'
    when score>=80 then '良好'
    when score>=60 then '及格' 
    else '不及格'
    end) as score1,s_id,score from total;

你可以思考一下:用case计算学生,根据他们的出生年月,分为80前 80后 90后,00后

SELECT *,(CASE WHEN year < 1980 THEN '80前' 
       WHEN year >= 1980 AND year <1990 THEN '80后'
       WHEN year >= 1990 AND year <2000 THEN '90后'
       ELSE '00后'
  END) AS a
FROM
 (SELECT *,SUBSTR(S_age,1,4) AS year
 FROM Student) t1

查询结果:

 CASE函数其实有两种写法

--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
---这两种方式,可以实现相同的功能。

二.窗口函数

----在组内进行排序---
SELECT *,ROW_NUMBER() OVER(PARTITION BY C_id ORDER BY Score DESC) AS ranking
 FROM Total;
---括号内无条件的话,输出序号--
SELECT *,ROW_NUMBER() OVER() AS r
 from total;

1.最典型的例子:排名,序号

----运行三个窗口函数,比较结果
SELECT Score,RANK() OVER(ORDER BY Score DESC) AS a,
   ROW_NUMBER() OVER (ORDER BY Score DESC) AS b,
   dense_rank() OVER (ORDER BY Score DESC) AS c
   FROM Total;
Scoreabc
99111
98222
90333
89444
87555
80666
80676
80686
80696
806106
7611117
7012128
6013139
50141410
34151511
31161612
30171713
20181814
NULL191915

RANK()函数:排名,如上述结果同为80分的都是第六名,76分的为第11名,与我们日常比赛的排                         名方式一致;(并列跳过)

ROW_NUMBER()函数: 同为80分的五个同学分别为第6、7、8、9、10名;

DENSE_RANK()函数:同为80分的都是第六名,76分的为第七名(并列不跳过)。

2.计算第几个(也就是把本组的第几个补充到当前 )

select first_value(Score) over (PARTITION by c_id ORDER by score DESC) as r,s_id,c_id,score
from total;
-----按C_id分组,然后将每一组内的第一个Score补充到当前,也即是输出每一组(每个课程)的最高分

 

3.查询前两行到当行的平均值(移动平均)

select AVG(score) over (PARTITION  by c_id ORDER BY score desc ROWS 2 preceding) as r,s_id,c_id,score
from total;

常用的窗口函数:(20条消息) 常用的窗口函数_简之的博客-优快云博客

三、自定义函数

--将自定义函数的功能开启
SHOW VARIABLES LIKE '%func%';
set global log_bin_trust_function_creators = 'ON' ;
--自定义一个f_add函数。begin和end中间可以修改,为函数主体部分
delimiter $$
drop function if exists `f_add` $$
create function `f_add`(a int , b int) returns int
begin
return a + b;
end$$
delimiter ;
--验证
SELECT f_add(1,2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值