今回はSQLにおけるテーブルの結合
について説明していきたいと思います!!
過去の関連投稿
「SQLの基礎について学ぶ#01」
「SQLの基礎について学ぶ#02」
「SQLの基礎について学ぶ#03」
「SQLの基礎について学ぶ#04」
「SQLの基礎について学ぶ#05」
「SQLの基礎について学ぶ#06」
「SQLの基礎について学ぶ#07」
「SQLの基礎について学ぶ#08」
「SQLの基礎について学ぶ#09」
1. テーブル結合の構文
SELECT 選択列リスト /* 選択列リストには両テーブルの列を指定 */
FROM テーブルA
JOIN テーブルB /* 2つのテーブルを結合 */
ON 両テーブルの結合条件
例えば以下の①new_accountテーブル
に② nameテーブル
の内容を結合して、日付
,項目名
,メモ
の列を含んだ表を作成します。
① new_accountテーブル
date(日付) | name_id(項目名ID) | memo(メモ) | price(金額) |
---|---|---|---|
2020-12-03 | 1 | カフェでランチ | 800 |
2021-01-03 | 2 | 地下鉄を使用 | 600 |
2021-05-22 | 1 | レストランで夕食 | 1000 |
2021-03-14 | 3 | トイレットペーパー、洗剤 | 1400 |
② namesテーブル
id | name(項目名) |
---|---|
1 | 食費 |
2 | 交通費 |
3 | 日用品 |
結合するためのSQL文
SELECT date, name AS expense_item, memo /* 選択列リストには両テーブルの列を指定 */
FROM account
JOIN names /* 2つのテーブルを結合 */
ON account.name_id = names.id
JOIN句
によって以下を実施
▶ accountテーブル
とnamesテーブル
が結合されて、namesテーブルの「id」「name」の列が参照できる。
on 結合条件
によって以下を実施
▶ accountテーブル
の各行について、name_id(項目名ID)列のデータ
に注目する。
▶ それと等しいid
を持つnamesテーブルの行
を取り出してつなぐ。
▶ 結合の際に、DBMS内部で以下のSQL文が繰り返されている。
SELECT * FROM names
WHERE /* account.name_idの値 */ = names.id
結果
date | expense_item | memo |
---|---|---|
2020-12-03 | 食費 | カフェでランチ |
2021-01-03 | 交通費 | 地下鉄を使用 |
2021-05-22 | 食費 | レストランで夕食 |
2021-03-14 | 日用品 | トイレットペーパー、洗剤 |
結合とは
結合とは、テーブルを単純にまるごと繋ぐことではなく、結合条件で満たされた行を1つひとつ繋ぐこと
である。
2. テーブルの結合に関する様々な構文
① 2つのテーブル両方に同じ名前のカラムが存在する場合(「memo」の名前のカラムが互いに存在)
SELECT date, account.memo, names.memo /* 属するテーブル名を明示 */
FROM account
JOIN names
ON account.name_id = names.id
② 別名を使ったSQL文
SELECT date, A.memo, N.memo /* 属するテーブル名の別名を明示 */
FROM account AS A /* accountテーブルに別名Aを設定 */
JOIN names AS N /* namesテーブルに別名Nを設定 */
ON A.name_id = N.id /* 属するテーブル名の別名を明示 */
③ 3つ以上のテーブルの結合
SELECT date, user.name, names.name /* userテーブルのnameとnamesテーブルのnameを取得 */
FROM account
JOIN user /* userテーブルと結合 */
ON account.user_id = user.id
JOIN names /* namesテーブルと結合 */
ON account.name_id = names.id
③ 副問合せの結果との結合
SELECT date, name AS expense_item, price
FROM account
JOIN (SELECT * FROM names
WHERE name IN ('食費', '交通費')) /* 名前が「食費」「交通費」の行だけ習得 */
AS names
ON account.name_id = names.id
3. まとめ
今回は以上になります。また何か間違い等ありましたら、コメントお願いします。