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
这里说的是需要将表table1和table2合二为一,并以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
GO TO FULL VERSION