JOIN 语句的输出是什么样的?

Kaj*_*aji 8 mysql join foreign-key

一段时间以来,我一直想使用连接,但是我无法将输出可视化,因此我知道如何使用它。

假设我有 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)
);
Run Code Online (Sandbox Code Playgroud)

如果我的应用程序要运行 SQL 查询来获取用户的个人资料数据,我将如何使用连接来获取与用户记录关联的城市,以及输出的记录将如何显示?

Bri*_*ton 12

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)

这允许我们在有关它们的特定内容发生变化时更新单个表,而不会破坏其余相关数据。

AnINNER JOIN是默认的联接类型。粗略地说,它指出:“组合元组,其中表 a 中的此记录与表 b 中的此记录相匹配” 其他类型的连接是OUTER JOINS和所谓的 a CARTESIAN PRODUCT。外连接是“从左表或右表(如指定)中取出所有内容,并在另一个表匹配的地方加入它。在不匹配的地方,用空值填充它”和笛卡尔积(不涉及关系代数是:取两个表中元组的所有可能组合并将它们输出到一个表中,不匹配任何内容。

* 比以往任何时候都更重要,尤其是在由于 gerrymandering 而移动邮政编码边界的情况下


小智 6

我想你正在寻找

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)
Run Code Online (Sandbox Code Playgroud)

这会给你

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |
Run Code Online (Sandbox Code Playgroud)

但不要相信我的话:在您的数据库上尝试一下,看看您会得到什么!