文章目录
0 前言
在刚开始接触SQL的时候,觉得不就是几个命令嘛
select t1.xx
from xxxx t1
join xxx t2
on t1.a = t2.a
where t1.b = "xxx"
group by t1.c
having t1.d < xxx
order by t1.e
对的,一般学MySQL这种数据库入门时,在书上和教程上可以学到的就这些,实际常用的应该也是这些。
要不是在数仓的岗位实习一段时间,我还真就信了这东西有这么简单。
这东西倒像是解释了啥叫简单即是复杂啊,命令简单,但是在实际用起来,逻辑上就没那么简单了,可能是因为我现在用的还不算多,也可能是暂时还没深入研究到关系型的数学理论基础吧,很多时候,逻辑上拐不过来,就是处于一种能看懂,但自己写不出来,然后别人一写,哦,不难啊…
不对,怎么有种高中物理题既视感。
看来还是缺少实践,所以在此记录一下简单的SQL,没想到的逻辑。
1.使用一条SQL求出几个球队之间的所有比赛组合(笛卡尔积)
SQL题目:
一个team表里,存了多个球队的信息,比如1, 2, 3, …,这些球队之间两两互相笔试,用一句sql显示所有可能的比赛组合。
思路:
使用笛卡尔积连接,然后加限定条件。
select a.name "主队"
,b.name "客队"
from team a
,team b
where a.name < b.name
两张表做查询,在不加任何条件的时候,两张表会做笛卡尔积,通过where小于条件限定,会排出重复的数据。
2. 如何判断表中是否含有重复记录(count(distinct))
说来惭愧,在数仓岗位也实习了2个月左右了,虽然因为各种各样的原因,真正实习的时间很短。。。
今天部门的master叫我开发一个表的逻辑,我写的结果发现同一条记录会出现296条。。。master说肯定是中间 join 的表时,未处理,有重复,将数据放大了,叫我查一下。嘿嘿嘿,学了一招。
假设user_info表中,user_id为主键,看看是否存在一个user_id对应多条记录的情况:
select count(1) --查看一共有多少条记录
,count(distinct user_id) --查看一共有多少个用户
from user_info
看这两个结果是否一致就行了。
当然,这个只能看出来有没有一对多的情况,但是具体是哪一个对应多条记录就不知道了。
3. MySQL中不支持row_number()函数,如何实现?
参考来源:
MySQL中row_number的实现