网站首页 > 技术文章 正文
作者 | 趣谈编程
责编 | Elle
在开发中我们有时需要跨表查询某些东西
此时,我们就会使用数据库表的连接
双十二的战争
一天,慧能看着一尘愁眉苦脸的,便上前去问发生了什么事情。
慧能:一尘,看你怎么不高兴鸭
一尘:现在实体店越来越不好做了,今年双11销量只有一两台。
慧能:那当然,现在大家都习惯网购了
一尘:那该如何是好?
慧能:不如写个交易平台网站吧,到时把咱们的商品放到网站上卖。
一尘:好呀好呀。
数据库的设计
慧能:一尘,你来设计一下我们网站的数据库表吧。
一尘:这个简单,我们网站肯定有用户吧。那我就先来个用户表。
一尘随手写了个建表语句
CREATE TABLE CUSTOMER(
C_ID INT NOT ,
C_NAME VARCHAR(40) NOT
);
一尘:看,我建了一个顾客表(CUSTOMER),里面有两个字段 : 顾客ID(C_ID)和顾客姓名(C_NAME)
这个顾客ID(C_ID)唯一标识了每一个顾客,就像身份证一样,每个人都不一样。
一尘话音刚落,又写了一个建表语句
CREATE TABLE PRODUCT(
P_ID INT NOT ,
P_NAME VARCHAR(40) NOT
);
很快一尘就建好了另一张产品表,很显然,产品表里面可以存放自己想卖的手机(产品)。
同样,产品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条件的记录,如果左表的记录在右表中没有匹配,那么这一条记录在右表中对应数据用代替
右连接
可以看到,右连接就是取右边的表的所有记录和左表中匹配的行。
同理写一个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条件的记录,如果右表的记录在左表中没有匹配,那么这一条记录在左表中对应数据用代替。
全连接
可以看到,全连接(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)返回两个表中所有的记录,如果其中一个表的记录在另一个表中没有匹配记录,那么对面的数据用代替。
注意:全连接(FULL JOIN)MySql 不支持,Oracle支持。
一尘:哇,原来SQL连接有这么多玩法,涨知识了。我赶紧去写网站去了,希望双十二能够大卖。
慧能:好好好,赶紧去吧
看着一尘高兴的背影,慧能露出了欣慰的笑容。
声明:本文为作者投稿,版权归作者个人所有。
【End】热
文推 荐
猜你喜欢
- 2024-11-16 从阿里手册引出的Join查询思考(阿里技术手册)
- 2024-11-16 Python中join()方法——字符串、路径拼接的常用方法
- 2024-11-16 oracle 多表连接查询 join(一)(oracle多表联查效率优化)
- 2024-11-16 让程序员头疼的微服务下数据聚合join(一)
- 2024-11-16 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程你是否知道?
- 2024-11-16 MySQL的Join到底能不能用,一文搞懂它
- 2024-11-16 一文看懂Mycat跨分片Join实现--全局表、ER分片、HBT、sharejoin
- 2024-11-16 为什么大厂不建议使用多表join?(为什么要多表查询)
- 2024-11-16 SQL Server 2012 高级用法(三)之Join
- 2024-11-16 什么,LEFT JOIN 会变成 JOIN?(left join作用)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-