1.自定义变量

语法:set @变量名:=值(冒号可以不加)
或者 select @变量名:=值;(冒号必须加)
使用方法:select @变量名
在这里插入图片描述
需求:要求两个数的和

set @m:=3;
set @n:=2;
select @res:=@m+@n;
select @m+@n into @num;

在这里插入图片描述

2.基础知识(用了变量后就是先排序):

mysql语句的执行顺序:正常是先查询后排序,但是如果 使用了变量,就是先排序后查询

1)先查询后排序:

select gender,
first_name as name,age from person order by name;

2)先排序后查询:
如果是先执行排序后执行查询,不可能查询出来0值;
如果是先执行查询后执行排序,会查询出来0值;

set @rownum:=0;
select
	first_name,
	gender,
	@rownum
from person
where @rownum<=1
order by first_name,least(0,@rownum:=@rownum+1);

在这里插入图片描述
知识点:LEAST()函数是GREATEST()的相反函数。 其目的是为了返回从值列表(N1,N2,N3,和等)的项最少值。
在这里插入图片描述
mysql least函数

3.inner join 的简写

select * from a inner join b on a.id =b.id;

简写:实际上是a,b表做了笛卡尔积(所有的记录两两做关联),然后用where做筛选,留下符合条件的
select * from a,b where a.id=b.id;

4.需求

数据分析面试之mysql的分组排序和变量赋值排序
根据不同性别进行人员分组,然后分组按照年龄进行升序排序得到序号

方法一:用窗口函数很容易:

select * ,row_number() over(partition by gender order by age) 排名
from person;

方法二:用变量定义的方法
注:mysql8.0中已经支持窗口函数,有rank关键字,故不能再使用rank作为自定义变量名称

select 
	first_name,gender,age,rankk 
from
(select
	first_name,
	gender,
	age,
	@rankk:=if(@gen=gender,@rankk+1,1) as rankk,
	@gen:=gender
from person,(select @rankk:=0,@gen:=null) temp  -- 临时表做笛卡尔积
order by gender,age asc) a;

注:SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,故这里使用select定义变量
mysql中select与set_sql 中set和select区别
mysql中set赋值报错

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐