0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLの基礎について学ぶ#10

Last updated at Posted at 2021-01-22

今回は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. まとめ

 今回は以上になります。また何か間違い等ありましたら、コメントお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?