seegongsik
数据

什么是 SQL 连接

订单表记下了谁买了什么,可“谁”只是一个客户编号。这个编号对应的名字,在另一张客户表里。那么,这笔订单是谁下的、叫什么名字,该怎么查出来?以两张表里都有的客户编号为线索,把编号相同的行配成对就行。像这样用公共列把分散的表连起来,就叫连接。

01

信息分在两张表里

上一课,我们用 SQL 向一张表发问,取出了想要的行。可在真正的数据库里,需要的信息很少全都放在一张表里。比如一家店,订单记在订单表里,顾客的名字和联系方式另外记在客户表里。
这样分是有意为之。要是每来一笔订单,都在那一行里把顾客的名字和联系方式重写一遍,同样的内容就会一再堆积;联系方式一改,还得把这些行全部找出来改掉。先把两张表并排展开看看。

点击展开
点击展开
点表头展开看看

点表头,一张张展开。能看到订单表和客户表各自存着不同的列。

展开后能看出,两张表分工不同。订单表里有订单号、客户编号和物品,客户表里有客户编号和姓名。只看订单表,对买铅笔的人只能知道一个编号。
“买铅笔的人叫什么名字?”这样的问题要跨表:物品在这张表,名字在那张表,得把两张表连起来才答得上。先找找连接它们的线索在哪里。

02

找两张表都有的公共列

把两张表的列名并排一看,有一列两边都有:客户编号。在客户表里,每位顾客都有一个不和别人重复的编号,所以只要知道编号,就能确定是哪位顾客。
订单表里的客户编号,就是把这个编号原样抄过来的。因此,客户表里的客户编号叫主键,订单表里指向它的客户编号叫外键。两张表都有的这一列,就是连接两者的桥。

订单表客户表
选两张表都有的公共列

一个个点列名看看。选中两张表都有的列,它会亮起来;选中只在一张表里的列,会告诉你它只在哪张表里。

物品只在订单表里,姓名只在客户表里。两张表都有的列,只有客户编号一个。
这一列的值相同,两行指的就是同一位顾客:订单表里的客户编号 7 和客户表里的客户编号 7,是同一个人,河俊。所以拿这一列当向导,把行两两配对就行了。

03

编号相同的行配成对

配对的方法很简单。从订单表里挑一行,读出它的客户编号,再到客户表里找客户编号相同的那一行。编号相同,这两行就是一对。
一位顾客也可能下好几笔订单,这时订单表里的好几行会指向客户表里的同一行。在下面依次点铅笔订单和橡皮订单,两笔都会连到同一位顾客。一位顾客对应多笔订单,这种关系叫一对多。

订单表
客户表
3|敏书
7|河俊
点订单的一行找它的配对

点订单表里的一行。客户编号相同的客户表那一行会亮起来,下面会写出这笔订单是谁的。

原来只有编号的订单,现在跟上了人名。铅笔和橡皮的订单都连到河俊,本子的订单连到敏书。
数据库会对每一行重复这件事。主键通常会自动带上索引,所以就算表很大,也能很快在客户表里找到配对的那一行。那么,把找到的每一对并成一行,会得到什么样的表?

04

把配好的行并成一张表

把配好的两行左右并排,就成了列更多的新一行:订单的格子旁边排着那位顾客的格子,两张表都有的客户编号只留一次。把这样的行收在一起,就得到一张结果表,买了什么和谁买的都在同一行里。
在 SQL 里,两张表名之间写 JOIN,再用 ON 写明哪些列的值要相等。上一课的 SELECT 和 WHERE 也照样可以一起用。

客户编号
物品
7
铅笔
3
本子
7
橡皮
客户编号
姓名
7
河俊
3
敏书
7
河俊
点合并把两张表连成一张

点合并按钮看看。两张表按客户编号一行行连起来,买了什么、谁买的都汇到一张表里。再点一次,又会像原来那样分开。

结果表里,河俊这个名字出现了两次。不过在客户表里,河俊仍然只存成一行。名字重复的只是为了回答问题临时做出的结果表,存着的表原样不动。
还要记住,没有配对的行会从结果里落下。要是客户表里有位顾客一次也没下过单,就没有订单可配,这位顾客在基本连接的结果里就不会出现。想把没配上对的行也留下,另有别的连接可用。

05

小结

归纳起来是这样:数据库为了不把同样的信息写好几遍,会把信息分到几张表里存。要回答跨表的问题,就找两张表都有的公共列,把这一列值相同的行配成对,左右并排。
这样就得到一张能像一张表那样读的结果表。分开存,问的时候再连,这就是连接。

依次点要点回顾一下

依次点要点回顾一下。(两张表 → 找公共列 → 用公共列配对 → 并成一张表)

现在,你能用公共列把分散的表连起来发问了。这也说明,把数据分到几张表里,并不妨碍得到答案。
那么,表该按什么标准来分?如果每笔订单都写上顾客的名字,会出什么麻烦?重复的信息又该怎么去掉?下一课讲数据库规范化,会回答这些问题。

一句话总结数据库为了不把同样的信息写好几遍,会把信息分到几张表里存。订单在订单表里,顾客的名字在客户表里,所以“这笔订单是谁下的、叫什么名字?”这样的问题,只看一张表答不了。这时就找两张表都有的公共列。客户表里每位顾客独有的客户编号,订单表里也记着,所以把这一列值相同的行配成对、左右并排,就得到一张能像一张表那样读的结果表。没有配对的行,不会出现在基本连接的结果里。用公共列把行配对,把分散的表连起来,这就是连接。
← 数据
如果有帮助,请支持我们