一文速学-玩转SQL之执行顺序,单表自连接操作和用法_表自链接

<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
(4)WHERE
<where条件> # 对上述虚表进行筛选
(5)GROUP BY
<分组条件> # 分组
(6)<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
(7)HAVING
<分组筛选> # 对分组后的结果进行聚合筛选
(8)SELECT
<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
(9)DISTINCT # 数据除重
(10)ORDER BY
<排序条件> # 排序,如非必要尽量不用
(11)LIMIT
<行数限制>


SQL语句顺序:



(8) SELECT (9)DISTINCT < 去重列 >
(1) FROM < 左表 >
(3) < 连接类型 > JOIN < 右表 >
(2) ON <连接条件>
(4) WHERE < 筛选条件 >
(5) GROUP BY < 分组列 >
(6) WITH {CUBE|ROLLUP}
(7) HAVING < 分组筛选 >
(10) ORDER BY < 排序列 >
(11) LIMIT < 行数限制 >
注:这里大家注意,(4)WHERE 筛选的是连接后的新表。


通过SQL的语法顺序和执行顺序很容易就看出,这和我们一步一步一个语句实现一个效果不同。要是我们按照面向过程来编程。那肯定首先是from先拿出表格,再考虑是否根据条件连接其他表格实现多表格联合处理。但是我们写的时候不能这么写,所以会感觉比较不适。了解了原理之后我们便可真正开始进行单表操作了。


## 二、单表操作


### 1.自连接


#### 创建


为了方便演示这里创建一张value\_test:



CREATE TABLE value_test (
code int(20) NOT NULL,
time bigint(124) NOT NULL,
value bigint(124) NOT NULL,
PRIMARY KEY (value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;


插入数据:



INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220601’,‘101’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220602’,‘102’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220603’,‘103’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220604’,‘104’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220605’,‘105’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220606’,‘106’);
INSERT INTO value_test(code,time,value) VALUES(‘1’,‘20220607’,‘107’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220601’,‘201’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220602’,‘202’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220603’,‘203’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220604’,‘204’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220605’,‘205’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220606’,‘206’);
INSERT INTO value_test(code,time,value) VALUES(‘2’,‘20220607’,‘207’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220601’,‘301’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220602’,‘302’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220603’,‘303’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220604’,‘304’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220605’,‘305’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220606’,‘306’);
INSERT INTO value_test(code,time,value) VALUES(‘3’,‘20220607’,‘307’);


 得到了这张表格:


![](https://img-blog.csdnimg.cn/4e902761ad644ac4a6efe3bd95ccd47d.png)


####  自连接


自连接可以这么理解,我们把原始表value\_test作为镜像再去生成另一张一模一样的表,也就是自身的映射,该表设定命名为其他的名字,这样以来便存在两张表可以连接作用。但是因为存在着两张表,那么我们select的字段也不能写原始表的字段,因为两张表存在着相同的字段名称会报错:



select code,time,value
from value_test as v1,value_test as v2


所以需要指定两张某一张表的字段。



select v1.code,v1.time,v1.value
from value_test as v1,value_test as v2


![](https://img-blog.csdnimg.cn/0d1a64d2639f43bf9f61d941e0446cde.png)


 我们现在需要两个指标,code分别为1和2,根据time来索引。通过自连接的方法我们不需要构建新的表就可以实现:



select v1.time,v1.value as value_1,v2.value as value_2
from value_test as v1,value_test as v2
WHERE v1.code=1
and v2.code=2

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

需要这份系统化资料的朋友,可以戳这里获取

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值