从功能上说,SQL操作的每个结果都是一个新表,无论它是存储在磁盘上还是内存中
联接的功能是将两个表“联接”到合成的第三个表中(通常),该表仅在将其输出到应用程序期间存在于内存中。
使用联接的原因是通过确保数据出现在数据库中的唯一位置来减少数据异常。
考虑以下:
Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)
在这里,每当政府更改邮政编码时(对于数据库开发人员的口味来说,这种更改太频繁了*人员表将需要更新,以使所有旧邮政编码正确地属于正确的城市和新的邮政编码。
在这种情况下,同一邮政编码位于表的多个元组中,并且如果该表是可手动编辑的,则由于输入新的城市/邮政编码组合而未更新整个数据库,因此会受到严重的更新异常影响。
通过使用三个表,我们可以得到相同的数据,但是具有更高的灵活性和可靠性(以牺牲一些性能为代价,尽管“适当的非规范化”问题是另一系列答案的主题。)
Person ( PersonID Integer Primary Key, FName String, LName String)
City ( CityID Integer Primary Key, City String, State String, ZipCode String )
Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`
通过下面的查询,我们可以从上面得到一个“表”:
SELECT Fname, Lname, AddressLine1, City, State, ZipCode
FROM Person
INNER JOIN Address USING (PersonID)
INNER JOIN City USING (CityID)
这使我们可以在有关表的某些特定内容发生更改时更新各个表,而不会破坏其余的关联数据。
An INNER JOIN
是默认的联接类型。粗略地说,它指出:“组合元组,其中表a中的记录与表b中的记录相匹配”。其他类型的联接是OUTER JOINS
,也称为a CARTESIAN PRODUCT
。外部联接是“从左表或右表(按指定)获取所有内容,并在另一个表匹配的地方进行连接。在不匹配的地方,将其填充为空”和笛卡尔积(无需进入关系代数)是:将两个表中的元组的所有可能组合都输出到一个表中,而不进行任何匹配。
*比以往任何时候都更加重要,尤其是在由于邮递方式移动邮政编码的边界的情况下