前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >趣谈JOIN操作

趣谈JOIN操作

作者头像
用户1260737
发布2019-12-10 14:30:31
5260
发布2019-12-10 14:30:31
举报
文章被收录于专栏:趣谈编程趣谈编程

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

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

一尘随手写了个建表语句

代码语言:javascript
复制
CREATE TABLE CUSTOMER(
C_ID INT NOT NULL,
C_NAME VARCHAR(40) NOT NULL
);
一尘话音刚落,又写了一个建表语句
代码语言:javascript
复制
CREATE TABLE PRODUCT(
P_ID INT NOT NULL,
P_NAME VARCHAR(40) NOT NULL
);

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

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

师傅慧能一看,摇了摇头

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

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

只见一尘随手写了一个SQL

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT C.C_NAME,P.P_NAME FROM
CUSTOMER C INNER JOIN PRODUCT P
ON C.C_ID = P.C_ID

可以看到这条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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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支持。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣谈编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档