当前位置: 首页 > news >正文

(七十三)大白话深入探索多表关联的SQL语句到底是如何执行的?(1)

今天我们来继续跟大家聊聊多表关联语句是如何执行的这个问题,上次讲了一个最最基础的两个表关联的语句和执行过程,其实今天我们稍微来复习一下,然后接着上次的内容,引入一个“内连接”的概念来。

假设我们有一个员工表,还有一个产品销售业绩表,员工表里包含了id(主键)、name(姓名)、department(部门),产品销售业绩表里包含了id(主键)、employee_id(员工id)、产品名称(product_name)、销售业绩(saled_amount)。

现在假设你想看看每个员工对每个产品的销售业绩,写个SQL:

select e.name,e.department,ps.product_name,ps.saled_amount from employee e,product_saled pa where e.id=pa.employee_id

此时看到的数据可能如下:

员工 部门 产品 业绩
张三 大客户部 产品A 30万
张三 大客户部 产品B 50万
张三 大客户部 产品C 80万
李四 零售部 产品A 10万
李四 零售部 产品B 12万

至于上述SQL的执行原理,相信大家应该都理解,其实就是从员工表里走全表扫描,找出每个员工,然后针对每个员工的id去业绩表里找 employee_id 跟员工id相等的数据,可能每个员工的id在业绩表里都会找到多条数据,因为他可能有多个产品的销售业绩。

然后就是把每个员工数据跟他在业绩表里找到的所有业绩数据都关联起来,比如张三这个员工就关联了业绩表里的三条数据,李四这个员工关联上了业绩表里的两条数据。

其实大家已经在不知不觉中学会了最基本的一个SQL关联语法,就是内连接,这个内连接,英语是inner join,意思就是要求两个表里的数据必须是完全能关联上的,才能返回回来,这就是内连接。

那么现在有这么一个问题,假设员工表里有一个人是新员工,入职到现在一个单子都没开过,也就没有任何的销售业绩,那么此时还是希望能够查出来这个员工的数据,只不过他的销售业绩那块可以给个NULL就行了,表示他没任何业绩。

但是如果仅仅是使用上述SQL语法,似乎是搞不定的,因为那种语法要求,必须要两个表能关联上的数据才会查出来,像你员工表里可能有个王五,根本在业绩表里关联不上任何数据,此时这个人是不会查出来的。

所以此时就要到外连接了,也就是outer join,这个outer join分为左外连接和右外连接,左外连接的意思就是,在左侧的表里的某条数据,如果在右侧的表里关联不到任何数据,也得把左侧表这个数据给返回出来,右外连接反之,在右侧的表里如果关联不到左侧表里的任何数据,得把右侧表的数据返回出来。

而且,这里还有一个语法限制,如果你是之前的那种内连接,那么连接条件是可以放在where语句里的,但是外连接一般是把连接条件放在ON字句里的,所以此时可以写出如下的SQL语句:

SELECT
e.name,
e.department,
ps.product_name,
ps.saled_amount
FROM employee e LEFT OUTER JOIN product_saled pa
ON e.id=pa.employee_id

此时返回的数据里,你可能会看到如下的结果:

员工 部门 产品 业绩
张三 大客户部 产品A 30万
张三 大客户部 产品B 50万
张三 大客户部 产品C 80万
李四 零售部 产品A 10万
李四 零售部 产品B 12万
王五 零售部 NULL NULL

所以说,到这里为止,想必大家都很清楚了,其实一般写多表关联,主要就是内连接和外连接,连接的基本语义和实现过程,大家应该也有一定的理解了。

http://www.lryc.cn/news/35433.html

相关文章:

  • SYSU程设c++(第三周) 对象类、类的成员、类与结构体的区别、类的静态成员
  • Redis管道
  • conda的共用package[硬链接]@pytorch和tensorflow装在同一个环境里好不好?
  • 「Vue面试题」动态给vue的data添加一个新的属性时会发生什么?怎样去解决的?
  • Flutter-Scaffold组件
  • Postman简介及接口测试流程(小菜鸟攻略)
  • kubebuilder注释
  • java日志
  • 研发中台拆分过程的一些心得总结
  • HTTP介绍
  • 10 卷积神经网络及python实现
  • 【立体匹配论文阅读】AANet: Adaptive Aggregation Network for Efficient Stereo Matching
  • 服务器防入侵攻击,安全加固措施
  • 解读:“出境标准合同”与“出境安全评估”要点与异同
  • python带你成功复刻热门手机游戏——飞翔的小鸟
  • YOLOv8初体验:检测、跟踪、模型部署
  • Vue 监听(watch handler)
  • 前端代码质量-圈复杂度原理和实践
  • 汽车微控制器芯片F280039CPZRQ1、F280039CSPM、F280039CSPN规格参数
  • 禾观科技三面经历
  • Spring Boot 实现接口幂等性的 4 种方案
  • Android Studio开发APP
  • Spring之实例化Bean _ @Resource和@Autowired实现原理(3)
  • 华为HCIE学习之Openstack Cinder组件(cinder对接glusterfs)
  • 关于Go语言的底层,你想知道的都在这里!
  • 每日一问-ChapGPT-20230308-关于技术与思考的问题
  • Oracle表分区的创建、新增、拆分
  • 如何快速升级Java 8 到Java11
  • 内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字Java八股文
  • 【计组】主存储器有关知识梳理