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クエリを実行してユーザーのプロファイルデータを取得する場合、結合を使用してユーザーのレコードに関連付けられた都市を取得するにはどうすればよいですか。また、出力されたレコードはどのように表示されますか?

回答:


12

SQL操作の結果はすべて、ディスクまたはメモリに格納されているかどうかに関係なく、機能的には新しいテーブルです。

結合の機能は、2つのテーブルを「結合」して、(通常は)アプリケーションに出力されている間だけメモリに存在する3番目の合成テーブルに結合します。

結合を使用する理由は、データベース内の1つの場所にのみデータが表示されるようにすることで、データ異常を減らすためです。

以下を検討してください。

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

ここでは、政府が郵便番号を変更するたびに(データベース開発者の好みではまったく頻繁に発生します)*すべての古い郵便番号が正しい都市と新しい郵便番号に正しく属するように、personsテーブルを更新する必要があります。

この場合、同じ郵便番号がテーブルの複数のタプルにあり、テーブルが手動で編集可能である場合、データベース全体が更新されずに新しい都市/郵便番号の組み合わせが入力されるため、重大な更新異常が発生します。

代わりに3つのテーブルを使用することで、同じデータが得られますが、柔軟性と信頼性が向上します(パフォーマンスは犠牲になりますが、「適切な非正規化」の質問は別の一連の回答のトピックです)。

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)`

また、次のクエリを使用して、上記の「テーブル」を1つ取得できます。 SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

これにより、関連するデータの残りの部分を破損することなく、特定のテーブルが変更されるたびに個々のテーブルを更新できます。

アンは、INNER JOIN参加のデフォルトタイプです。大まかに言えば、「テーブルaのこのレコードがテーブルbのこのレコードに一致するタプルを結合する」OUTER JOINSとありCARTESIAN PRODUCTます。外部結合は、「指定されたとおりに、左または右のテーブルからすべてを取得し、他のテーブルが一致する場合は、それを結合します。一致しない場合は、nullで埋めます」そして、デカルト積(関係代数に入らない) is:両方のテーブルのタプルの可能なすべての組み合わせを取り、何にも一致せずにそれらを1つのテーブルに出力します。

*ゲリマンダーのために郵便番号の境界を移動する場合は特に、


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は、どちらか一方または両方のタブからフェッチしたいフィールドになります。


括弧は必須ではないため、クエリが読みにくくなります。
Spredzy、2011年

1
@Spredzy Reverseが私に当てはまります。括弧は私にとって読みやすさを向上させます
Sathyajith Bhat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.