我一直想使用连接有一段时间了,但我在可视化输出时遇到了问题,所以我知道如何使用它。
假设我有 2 个表:
CREATE TABLE Cities (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
city tinyblob
);
CREATE TABLE Users (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username TINYBLOB,
city INT UNSIGNED,
FOREIGN KEY (city) REFERENCES Cities (id)
);
如果我的应用程序要运行 SQL 查询来获取用户的个人资料数据,我将如何使用联接来获取与用户记录关联的城市,以及输出的记录将如何显示?
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
所谓的 aCARTESIAN PRODUCT
。外部联接是“从左表或右表(按照指定)获取所有内容,在另一个表匹配的地方加入它。在不匹配的地方,用空值填充它”和笛卡尔积(没有进入关系代数就是:把两张表中元组的每一种可能组合都输出到一张表中,不匹配任何东西。* 多于从不,尤其是在由于不公正划分而移动邮政编码边界的情况下
我想你在找
这会给你
但不要相信我的话:在你的数据库上试试看,看看你得到了什么!
简而言之,您的 SQL 语句将是 -
Fields1.. Fieldsn 将是您想要从一个或两个表中获取的字段。