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