【SQLite3】JOIN句で内部結合(inner join)する方法

サーバ・DBなどのイメージズを作成している

データベースを作成する際、一つのテーブルにすべてのデータを格納することはありません。

それぞれのテーブルの役割を決め、複数のテーブルに分けてデータを管理します。

禄太
株価の管理データベースで言うと、取引市場テーブルと銘柄が上場しているテーブルをそれぞれ分けていました。
PCで仕事をしている人

【SQLite3】PRIMARY KEYを利用して、レコードを一意に決める

2022年11月23日

そうすることで、管理のしやすく、誤データの混入を防ぎ、高速・防安全に利用できる。と言うメリットが生まれます。

しかし、そういったテーブル群は、単体では人間が見たときに何が格納されているか?がわかりません。

禄太
idの項目なんかは、ただの連番だったりしますので、、、。

そこで、【結合(JOIN)】する必要が出てきます。

今回は、2つのテーブルを、IDが一致した場合に結合する方法をご紹介します。

記事要約
  1. 内部結合(INNER JOIN)について解説します。
  2. 内部結合のサンプルと動作確認をします。

目次

内部結合(INNER JOIN)の特徴

内部結合には、以下のような特徴があります。

内部結合の特徴
  1. 2つの別々のテーブルを、結合します。
  2. 2つのテーブルで、結合対象のカラムを、指定する。
  3. それぞれのカラムに、同じ値が格納されているデータのみを結合して取得する。
禄太
なお、結合対象のテーブルどちらかのテーブルにだけ値が存在したときでも結合をする。ことを、外部結合と言います。

内部結合のイメージ

以前作成した、listedmarketテーブルと、marketテーブルを結合するには以下のようなイメージになります。

【listedmarketテーブル】 内の <listed_MARKET> 列には、上場している市場の情報が格納されています。

【marketテーブル】 内の <mk_id> 列には、取引される市場のIDが格納されています。

<listed_MARKET> に格納されているIDと同じIDを、<mk_id>から探し、一致していたら結合をします。

【イメージ図】

基本構文とサンプル

基本構文

select 取得対象列 from 大元のテーブル(左表) INNER JOIN 結合するテーブル(右表) on 結合条件;

サンプル

select * from listedmarket INNER JOIN market on listed_MARKET = mk_id;
  1. listedmarketとmarketを指定する
  2. listedmarketテーブルの、listed_MARKETを上から取得
  3. ②と同じ値を、marketテーブルのmk_idから検索
  4. 一致しているレコードを、listedmarketテーブルに結合していく

実行結果(画面)

サンプル実行時のイメージ

サンプル実行時の問題点

<listed_MARKET>と<mk_id>の両方の値が結合後のテーブルに出力されています。

間違いではないのですが、同じ値が出力されるのであれば、どちらか片方だけ列として表示されれば良いですよね。

禄太
select * from〜で、全列取得になってしまうので、同じ列が出力されてしまいます。

問題点の回避(取得対象の列を絞り込む)

select MEI_CD,listed_MARKET,name from listedmarket INNER JOIN market on listed_MARKET = mk_id;
  1. 取得対象の列を指定しています。
  2. ②と同じ値を、marketテーブルのmk_idから検索
  3. 一致しているレコードを、listedmarketテーブルに結合していく
禄太
name列は、listedmarketテーブルにはありませんが、結合対象のmarketテーブルにあるname列を取得するため、selectすることができます!

実行結果(画面)

サンプル実行時のイメージ

EOF

INNER JOINについてまとめました。

外部結合と、動作が混同したりはじめはややこしいのですが、一つずつ整理していきたいと思います。

禄太
一緒に学習してくださって、ありがとうございました!

また、次回!

サーバ・DBなどのイメージズを作成している

【SQLite3】JOIN句で外部結合(outer join)する方法

2022年11月30日