JOIN 运算符出现的先决条件

随着表中数据量的增长,其中经常会出现重复值。例如,产品表有品牌名称。有时会重复。为他们准备一个单独的品牌表会很有用,例如,其中将包含以下数据:

  • id - 品牌标识;
  • 名称——品牌名称;
  • company_owner - 品牌公司所有者的名称;
  • company_contacts - 品牌所有者公司的联系人。

然后我们想创建一个地址表,我们可以将所有地址放入其中:

  • id – id 地址;
  • 国家;
  • 地区;
  • 城市;
  • 街道;
  • 房子;
  • 压缩。

此外,在此表中,不仅可以存储品牌拥有公司的地址,还可以存储客户和员工的地址。这种方法只是数据量(表中的行数)增长的结果。这使得操作表中的数据和维护它们的完整性变得更加容易。

当您有 5 名员工时,您只需在职业栏中输入他们的职业即可。如果您的公司有 5000 名员工,那么您需要一个包含 x 个职业及其职责列表的表格。

顺便说一下,在 Java 语言中也有类似的东西。如果你在一个方法中有很多代码,那么就有将它分解成几个方法的愿望。如果一个类中有很多方法,那么我想把它分成几个类。

这就是大型数据库有数千张表的原因。而且几乎所有的查询都是同时在多个表上执行的。而每张表都有一千条记录的三个表的行的笛卡尔积已经是十亿行。

但是仅使用 WHERE 过滤十亿行可能需要数小时。因此,SQL 语言的创建者提供了他们的解决方案——JOIN 运算符。

JOIN 运算符简介

JOIN 运算符用于明确告诉 SQL 服务器我们不需要所有表的所有行的笛卡尔积,而是使用 ID(或以其他方式)相互引用的不同表的行的智能粘合. 服务器有一个单独的算法来处理使用 JOIN 运算符的表连接,这样可以更快地执行此类操作。JOIN 运算符的一般形式如下:

table 1 JOIN table 2 ON condition

这里说的是需要将表table1table2合二为一,并以condition作为join criterion 。

让我们以我们的旧例子为例:

SELECT * FROM employee, task WHERE emploee.id = task.emploee_id

并使用 JOIN 运算符重写它:

SELECT * FROM employee JOIN task ON emploee.id = task.emploee_id

在我们的例子中,两个查询都会给出相同的结果,但这只是因为查询非常简单。将来,WHERE 允许您精确地构建行过滤器,而在 ON 之后指定的过滤器允许您编写用于链接表的复杂脚本。在使用 JOIN 语句时也可以使用别名(表别名)。例子:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id