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


8

我一直想使用联接一段时间,但是我在可视化输出时遇到了麻烦,因此我知道如何使用它。

假设我有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查询以获取用户的个人资料数据,我将如何使用联接来获取与用户记录相关联的城市,输出的记录将如何显示?

Answers:


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)

这使我们可以在有关表的某些特定内容发生更改时更新各个表,而不会破坏其余的关联数据。

An INNER JOIN是默认的联接类型。粗略地说,它指出:“组合元组,其中表a中的记录与表b中的记录相匹配”。其他类型的联接是OUTER JOINS,也称为a CARTESIAN PRODUCT。外部联接是“从左表或右表(按指定)获取所有内容,并在另一个表匹配的地方进行连接。在不匹配的地方,将其填充为空”和笛卡尔积(无需进入关系代数)是:将两个表中的元组的所有可能组合都输出到一个表中,而不进行任何匹配。

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


6

我想你在找

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

这会给你

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

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


3

简而言之,您的SQL语句将是-

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn将是您要从一个或两个表中获取的字段。


括号不是必需的,它使查询更难阅读。
2011年

1
@Spredzy Reverse是我的情况,括号对我来说增加了可读性
Sathyajith Bhat 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.