SQL总结,满满干货,秒变SQL大佬

SQL的执行顺序

Select 字段 from 表名 where 条件  group by  having

from 表名 --> where 条件  --> group by --> having --> select

where的使用

where后面不能使用聚合函数

 分组的使用

SQL的条件判断语句

IF表达式(二分支)

select name , score ,  if(score >= 60 , "及格" , "不及格") as 结果 from 表名  

 IFNULL(expr1,expr2)

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

 SELECT IFNULL(1,0);
 -> 1

SELECT IFNULL(NULL,10);
 -> 10

SELECT IFNULL(1/0,10);
-> 10

SELECT IFNULL(1/0,'yes');
-> 'yes'

case when 表达式(多分支)

select name score (
	case when score < 60 then '不及格'
			when score>=60 and score<80 '良好'
			when score >= 80 and score< 100 ' 优秀'
			else '极好'
end
 )  as 结果 from表明

子查询

--工资最低的员工名字
select name from emp where sales = (select min(sales) from emp)

--平均工资最低的部门
select min(a) from (select dpt avg(sales) as a from emp group by dpt) b
--解题思想:先通过对部门分组得到每个部门的平均工资--> 在通过min得到最低工资

透视表


面试题:

 建表:

查询语句(行转列):

select nikname,
	sum(if(kind='IC',amount,0)) as IC,
	sum(if(kind='KP',amount,0)) as KP,
	sum(if(kind='KT',amount,0)) as KT
	from dlrxz group by nikname;

查询结果(行转列):

查询语句(列转行):

SELECT nikname ,'amount' as 金额 , amount as x FROM dlrxz

查询结果(列转行):

时间函数

当前时间

select now()
select year('2021-4-3'),month('2021-4-3'),day('2021-4-3')

解析时间(毫秒转时间)

select from_unixtime(123456643)  
-- 返回结果如下

 

 2天后的时间

select subdate(now(),2)

计算时间差

计算时间查:-4
select datediff('2021-5-2','2021-5-6')

计算各玩家登陆时间:

select max(logindate) from gemes group by userid
-- 解析:max(logindate)最大的登陆时间==最后的登陆时间

连续两天登陆的玩家

select a.udi from game a join games b
on a.udi = b.udi and datediff (b.login,a.login) = 1
-- 解析:通过表的自连接计算时间差为1的玩家,就是连续两天登陆的玩家

窗口函数(开窗函数)

over(开窗函数)

--员工以及所造部门的平均工资
select  name ,avg(sales) over (partition by dpt) from emp  

窗口函数dense_rank()

各部门平均工资排名
select dpt ,avg (sales) ,dense_rank() over (order by avg (sales)) as 排名 from emp group by dpt

【后期有时间会专门出一期窗口函数的博客,下次见】

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻窕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值