sql高级查询(SQL高级查询语句例句)
sql高级查询
我们每个人都会写sql基本的sql就是一个单表的增删改查
高级的sql使用一个连接查询几乎可以搞定
但是我们的sql在上一个等级
必须学会行转列
或者列转行的方式
窗口函数
查询案例
我们统计一个用户输赢的次数
转化成这样的格式信息
我们普通写sql的方式
select * from user where id =1 and remakr = "胜利"这样只会统计一个数据不会统计多个数据
我们应该使用
case when 的写法
select
count( case when id = 1 then remakr else 0 end),
count( case when id = 2 then remakr else 0 end),
from user
这样的操作方式我们可以统计到所有的信息
如果发现这样的写法有点冗余的方式
我们换一个写法的方式
使用if关键字进行判断的方式
select
count( if(id=2,remark,0)),
count( case when id = 2 then remakr else 0 end),
from user
使用if和上门使用case when 的方式几乎功能相同
if看起来比较更加的简单
推荐使用我们if语法方式进行操作
我们通过使用if的方式可以轻松进行行转列的方式
sql经典的题目
sql的连续登录问题
现在有如下的表的方式
我们需要统计用户连续登录的问题
我们普通sql写法的方式
在一个表中查询一个用户是否连续登录问题
第一个思路
select date from user where name = 1
查询到当前时间在代码中进行对比的方式
第二思路进行解题的方式
有几个我们需要注意思考的问题
第一个必须是去重的
第二个我们可以通过临近日期进行比较的方式
我们使用窗口函数如果用户相同给用户进行一个排序的方式
我们可以得到一个值
窗口函数的方式
SELECT
*,
row_number() over( PARTITION BY stu_id ORDER BY stu_id ) AS rn
FROM
t_score
我们使用当前日期减去现在的值等到
select DATE_SUB(now,stu_id) as temp from t_score
使用date_sub减去rn的信息
得到现在值
这三个值相同
我们通过进行条件筛选的方式就可以得到这个数据的方式
我们现在可以通过进行where统计的方式
三个查询的方式
通过with t1 as的方式将三个查询拼接成一个sql的方式
总结
sql解题的关键
要排除空值
是否需要有顺序
是否需要去重
考虑这个三个问题
下面才是如何进行sql查询问题
我们进行sql查询