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的所有思路,如有不完善处请评论区指出,感谢阅读❤

相关推荐
wxwx_bscxy32229 分钟前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安1 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB1 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB1 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
SelectDB1 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析
小白学大数据2 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
西索斯coding2 小时前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai
袋鼠云数栈2 小时前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle
数智启示录3 小时前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试
小蒜学长3 小时前
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端