SQL不会写?不会找关联表?复杂SQL语句编写逻辑实现思路请查收✉

目录

[一、FROM 关联表](#一、FROM 关联表)

思路:

[二、WHERE 查询过滤条件](#二、WHERE 查询过滤条件)

逻辑:

[三、SELECT 字段列表](#三、SELECT 字段列表)

强调:


前言

今天实战开发刚好写到了复杂 SQL,突然想起前几天两位正在实习的同学分享的经历,这里用同学A和B称呼切入和大家聊聊。

A 在做数据库操作时候依赖鼠标可视化点击操作,结果把整个数据库都删了。然后带他的前辈强调:但凡涉及数据库的操作,绝对不要用鼠标,都要写 SQL 脚本执行 。我还记得他说好像并不是简单的点击失误,反正大家记住直接图形化鼠标操作数据库很危险就对了。

然后再说B被批评的这个经历,我感觉很多还在学习的小伙伴可能都有这个问题。他视频中坦诚交代了,之前学习的时候就没有太认真去敲代码,像SQL语句之类他都是AI写的。前段时间程序员岗位热潮,大家都强调了能看懂代码的重要性,所以B很多代码都没有自己认真写过。结果实习之后,他们公司明令禁止工作中使用 AI 写代码,主要是为了防止企业业务数据泄露。然后他说自己只能偷偷用 AI ,后来那天交付成果,直接被老板约谈批评了,AI 生成的 SQL字段命名错误、逻辑不符合业务预期、漏洞一大堆。B也是很诚实说了自己不会写SQL,他们老板人还不错的,说给他一个小时现在立马学会然后重新写一份。

说实话我之前对 SQL 也不够重视。看完他们的真实实习踩坑经历,才意识到手写 SQL、吃透语法逻辑的重要性。正好借这篇博文梳理复杂SQL书写逻辑。

我们要写的逻辑是查询所有商品详情。

一、FROM 关联表

思路:

写的思路从返回的实体类切入。

涉及到什么信息,就涉及到什么表。

明面上我们看出来要关联的表有:商品表、商品图片表、品牌表、规格表

然后我们再向里找,鼠标悬停看关联实体:

规格关联实体返回的是商品规格和规格项列表。我们这样就知道了要关联商品规格表规格项表

这里有一个更简便的方法:

涉及到返回的是一个集合的,我们可以直接看数据库,把表名带关键字段的全部作为要关联的表。比如规格specification,我的数据库里关于specification表的有规格表,规格项表,商品规格表,这三个表就都需要关联。

类目关联实体里面的内容是类型。我们这样就知道了要关联商品类型表。(共三级类目,关联三次类型表)

这样我们就找到了所有要关联的表,总共七张,还有一张是要关联三次的。这个多找多写多体会就好了。

很好,我们写完了第一步。

这里字段列表我们一会要进行修改,先用*替一下。

写完了关联表,我们来写where过滤条件。

二、WHERE 查询过滤条件

这里强调一下 表设计规则子表一定会存主表主键当外键。

每一张表都对应着一张牵连自己的表。顺着每一张关联表找关联,他们形成一个闭环。n张表就是n-1条过滤条件。

逻辑:

不难理解goods表一定是主表。我们切入去看。

主表外键可关联到的有四张表:brand,3个productType。这就对应了四条过滤条件。

我们划去 bz_brand,type1,type2,type3 四个表去看其他表,还有:bz_goods_image,bz_specification,bz_specification_option,bz_goods_specification_option,四个表。

很明显,bz_goods_image 和另外三个格格不入,去看它的外键,找它的外键是谁的主键,就和谁关联。

然后就三张规格表了,他们三个之间一定有关联,一伙处理。

他们仨不可能凭空产生关系,因为所有表关联都要勾搭上主表!!

所以我们去看这三个表,谁里包含的键值能勾搭上主表的主键,因为主表别的键都名花有主,只能是主键。

一看是bz_goods_specification_option。

很好,然后我们就像接龙一样,每一条首尾呼应,完成这三这张表的查询过滤,具体什么样看成品前三条🤓👇:

很清晰的对吧!

三、SELECT 字段列表

多表联查时,如果字段数量不多,可以直接使用*查询全部字段,不用手动写别名。

一旦出现字段重名冲突 (多张表存在同名字段,例如多张表都有idname),就不能直接写*。 需要手动写明字段:表.字段 别名AS关键字可以省略。

强调:

就算部分字段没有发生重名冲突,也建议全部显式写出,别名和实体属性保持一致,方便 MyBatis 做结果封装,避免映射错乱。


以上就是小编完成这个复杂SQL的所有思路,如有不完善处请评论区指出,感谢阅读❤

相关推荐
DB哥讲数据库1 小时前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse
TDengine (老段)2 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
小白勇闯网安圈11 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨11 小时前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图12 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl12 小时前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl12 小时前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl12 小时前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库
麻瓜code14 小时前
【Mysql】重新学一遍 SQL 执行顺序
数据库·sql