作者 | 趣谈编程

责编 | Elle

在开发中我们有时需要跨表查询某些东西

此时,我们就会使用数据库表的连接

双十二的战争

一天,慧能看着一尘愁眉苦脸的,便上前去问发生了什么事情。

慧能

一尘

慧能:一尘,看你怎么不高兴鸭

一尘:现在实体店越来越不好做了,今年双11销量只有一两台。

慧能:那当然,现在大家都习惯网购了

一尘:那该如何是好?

慧能:不如写个交易平台网站吧,到时把咱们的商品放到网站上卖。

一尘:好呀好呀。

数据库的设计

慧能:一尘,你来设计一下我们网站的数据库表吧。

一尘:这个简单,我们网站肯定有用户吧。那我就先来个用户表。

一尘随手写了个建表语句

CREATE TABLE CUSTOMER(
C_ID INT NOT NULL,
C_NAME VARCHAR(40) NOT NULL
);

一尘:看,我建了一个顾客表(CUSTOMER),里面有两个字段 : 顾客ID(C_ID)和顾客姓名(C_NAME)

这个顾客ID(C_ID)唯一标识了每一个顾客,就像身份证一样,每个人都不一样。

一尘话音刚落,又写了一个建表语句

CREATE TABLE PRODUCT(
P_ID INT NOT NULL,
P_NAME VARCHAR(40) NOT NULL
);

很快一尘就建好了另一张产品表,很显然,产品表里面可以存放自己想卖的手机(产品)。

同样,产品ID(P_ID)是唯一的,标识一个产品。

师傅慧能一看,摇了摇头

慧能:你这设计的也太简单了吧,顾客只有姓名这个属性吗?性别,手机号等等呢?

罢了罢了,这个不提了,那我现在想要查询哪位顾客买了哪件商品(产品)怎么办呢?

一尘:要不再加一个表保存顾客和产品的购买关系?

慧能:不用了,在产品表再加一个字段即可。

只见慧能给产品加了一个顾客ID(C_ID)字段。

慧能:通过产品表的顾客ID(C_ID)就可以建立起产品表和顾客表的关系了。

内连接的神奇功效

慧能:师傅师傅,我听山下的李公子老说临界区,这个临界区是个什么东西呀?

一尘:那现在怎么查哪些用户买了哪些产品了呢?

慧能:你想想

在一尘思考的过程中,慧能给两张表插入了一些数据

一尘:咦,师傅,你把数据都准备好了。我想到了一种方法。

只见一尘随手写了一个SQL

SELECT C.C_NAME,P.P_NAME FROM
CUSTOMER C,PRODUCT P
WHERE C.C_ID = P.C_ID

慧能:嗯嗯,你这种方法也可以,但我们经常用的是 内连接

一尘:内连接?什么鬼,没听过哎。

慧能清了清嗓子

所谓连接,就是两张表根据关联字段,组合成一个数据集。

上面两张表的关联字段就是顾客ID(C_ID).

组合的数据集就好像两张表被粘(连接)在一块,返回一个新的数据集合。

那返回的数据集合是两张表的所有数据吗?并不是,是有筛选条件的。

内连接指的是只连接匹配上的行,也就是说只返回两张表匹配的记录。

这里的匹配指的是满足筛选条件,下面会讲。

内连接用关键字INNER JOIN(或者JOIN)表示。

慧能:举个例子。

只见慧能随手写了一个SQL

可以看到这条SQL用内连接(INNER JOIN)把客户表(CUSTOMER)和产品表(PRODUCT)连接起来了。

连接时的筛选条件是客户表的ID(C.C_ID)和产品表的客户ID(P.C_ID)相等。

筛选条件在关键字ON后面(ON C.C_ID=P.C_ID)

这个筛选条件就是筛选两个表记录的条件,满足这个筛选条件就是两张表的两条记录匹配上了。

内连接就是只有客户表中的C_ID等于产品表中的C_ID,此时才会返回这两张表中匹配的记录。

所以很显然,查询的结果为:

只显示C_NAME 和 P_NAME 是因为当时 SELECT 的时候就只选择了这两列。

这样就通过内连接查出了谁买了你的手机了。除了内连接还有左连接,右连接,全连接。

其他的SQL连接

理解了内连接,其他三种连接就很好理解了。

其实用韦恩图来表示SQL的各种连接时比较好理解的。上面说的内连接可以这样表示:

图片来自阮一峰的网络日志

可以看到,内连接(Inner Join)就是取两个表相同的那一部分。

左连接

图片来自阮一峰的网络日志

可以看到,左连接就是取左边的表的所有记录和右表中匹配的行。

还是用上面的表举例。

如果让顾客表当左边的表(左表),产品表当右表。左表 LEFT JOIN 右表会发生什么?

慧能随手写了个SQL

SELECT C.C_NAME,P.P_NAME FROM
CUSTOMER C LEFT JOIN PRODUCT P
ON C.C_ID = P.C_ID

慧能在脑子里运行了一下,只见他画了两幅图。

可以看到:LEFT JOIN返回左表的全部记录和右表满足ON条件的记录,如果左表的记录在右表中没有匹配,那么这一条记录在右表中对应数据用NULL代替

右连接

图片来自阮一峰的网络日志

可以看到,右连接就是取右边的表的所有记录和左表中匹配的行。

同理写一个SQL:

SELECT C.C_NAME,P.P_NAME FROM
CUSTOMER C RIGHT JOIN PRODUCT P
ON C.C_ID = P.C_ID

可以看到:RIGHT JOIN返回右表的全部记录和左表满足ON条件的记录,如果右表的记录在左表中没有匹配,那么这一条记录在左表中对应数据用NULL代替。

全连接

图片来自阮一峰的网络日志

可以看到,全连接(Full Join)返回两个表中所有的记录。

按照惯例写个SQL:

SELECT C.C_NAME,P.P_NAME FROM
CUSTOMER C FULL JOIN PRODUCT P
ON C.C_ID = P.C_ID

可以看到:全连接(Full Join)返回两个表中所有的记录,如果其中一个表的记录在另一个表中没有匹配记录,那么对面的数据用NULL代替

注意:全连接(FULL JOIN)MySql 不支持,Oracle支持。

一尘:哇,原来SQL连接有这么多玩法,涨知识了。我赶紧去写网站去了,希望双十二能够大卖。

慧能:好好好,赶紧去吧

看着一尘高兴的背影,慧能露出了欣慰的笑容。

声明:本文为作者投稿,版权归作者个人所有。

【End】

90%的程序员学Python这么认为:

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

Python系列学习成长课来了!15年经验专家、CSDN特级讲师亲自授课,还等什么?立即扫码报名学习:

热 文 推 荐  推 荐 

☞互联网诞生记:风起于青萍之末

☞罗永浩回应“鲨鱼皮技术遭质疑”;消息称马蜂窝开启裁员;Dart 2.7 发布 | 极客头条

☞“弃用 Google AMP!”

☞20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划

☞操作系统兴衰史

☞图灵奖得主Bengio:深度学习不会被取代,我想让AI会推理、计划和想象

☞我在华为做外包的真实经历

☞搞定面试算法系列 | 分治算法三步走

点击阅读原文,参与有奖调查!

你点的每个“在看”,我都认真当成了喜欢

趣谈 JOIN 操作相关推荐

  1. 趣谈网络协议笔记-二(第十三讲)

    趣谈网络协议笔记-二(第十三讲) 套接字Socket:Talk is cheap, show me the code 前言 这只是笔记,是为了整理刘超大神的极客时间专栏的只是而存在的! 经常会在网络上 ...

  2. 趣谈网络协议笔记-二(第七,八,九讲)

    趣谈网络协议笔记-二(第七,八,九讲) 勉励 人生而自由,却无往不在枷锁(牢笼)之中. ------卢梭@<社会契约论> 为那些有形的牢笼感到庆幸吧. 为自己出生于这个时代感到庆幸吧,因为 ...

  3. 趣谈网络协议笔记-二(第六讲)

    趣谈网络协议笔记-二(第六讲) 交换机记忆的到底是端口,还是方向,如果是方向那么何来方向,下图中的感觉更像是网桥? 局域网中的数据是不是必定先经过交换机(网桥,hub)? 为什么广播时mac地址为25 ...

  4. 趣谈网络协议笔记-二(第五讲)

    趣谈网络协议笔记-二(第五讲) 目录 第二模块 底层网络知识讲解:第二层到第三层 第5讲 | 从物理层到MAC层:如何在宿舍离自己组网完联机游戏 第6讲 | 交换机与VLAN:办公室太复杂,我要回学校 ...

  5. [译]以PostgreSQL为例,谈join计算的代价

    join计算的代价很高吗? 看情况 join的代价依赖于join的条件,索引是什么样,依赖于表有多大,相关信息是否已经cache住了,使用的什么硬件,配置参数的信息,统计信息是否已经更新,同时是否还有 ...

  6. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

    文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...

  7. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  8. 华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解)

    华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解) 程序员高级码农II 2020-09-25 07:23:00 前言 虽然在大学的时候大家都学过网络协议 ,但是肯定感觉网络协议的知识点非常多 ...

  9. 阿里研究院花几年心得终成趣谈网络协议,附技术官讲解

    苦且绕不过去.经过多次放弃之后,我发现在我的职业生涯中,网络这一关无论如何也绕不过去.本来觉得写Java程序时可以依赖别人的库,所以就不用关心这么多底层的技术了,但是到后来才发现,服务数量一多,吞吐量 ...

最新文章

  1. 第九课.朴素贝叶斯分类器
  2. virtualenvvirtualenvwrapper on WindowsUbuntu
  3. 【NLP】一份相当全面的BERT模型精讲
  4. js获取url中的参数,url中传递中文的时候通过js解码的方式
  5. python判断队列是否为空_[python模块]队列queue
  6. QT中父子窗口事件传递与事件过滤器
  7. opengl三维图形图形颜色_【图形学基础】基本概念
  8. php symfony 安装,Symfony4中文文档: 安装和设置Symfony框架
  9. 将not exists更改为外连接
  10. mysql5性能比较_MySQL 5.7&MySQL 8.0 性能对比
  11. 解决Ubuntu18.04下VLC打不开的问题
  12. 无线电发射器 Android,简单无线电app
  13. 获取当前屏幕各种高度
  14. python123随机密码生成、生成三组n位密码_生成随机密码
  15. 6.CCS新建工程及配置
  16. GB28181公网语音对讲
  17. windows server 2016打开服务器管理器和启用或关闭windows功能报.net fr
  18. PMP章节练习(第六章:项目进度管理)
  19. hss网元 java_在NB-IoT建构和流程中,作为网元实体的MME和HSS进行了哪些功能方面的升级?...
  20. 精诚CRMPM系统应该要有哪些销售功能

热门文章

  1. Leaflet学习笔记-Leaflet.awesome-markers
  2. 34-指针与二维数组
  3. 转:VS2005 快捷键
  4. android网络游戏开发实战pdf_python爬虫开发与项目实战PDF高清文档下载
  5. leetcode python3 简单题38. Count and Say
  6. 使用Material Design的Flutter应用
  7. 中国碳纤维复合加热元件行业市场供需与战略研究报告
  8. 中国磷矿市场趋势报告、技术动态创新及市场预测
  9. 权限不足_十分钟掌握Linux文件属性及权限操作,不再担心权限不足!
  10. linux7telnet测试通是提示如何,如何优雅的使用telnet测试端口连通性