データベースを作成する際、一つのテーブルにすべてのデータを格納することはありません。
それぞれのテーブルの役割を決め、複数のテーブルに分けてデータを管理します。
株価の管理データベースで言うと、取引市場テーブルと銘柄が上場しているテーブルをそれぞれ分けていました。
そうすることで、管理のしやすく、誤データの混入を防ぎ、高速・防安全に利用できる。と言うメリットが生まれます。
しかし、そういったテーブル群は、単体では人間が見たときに何が格納されているか?がわかりません。
idの項目なんかは、ただの連番だったりしますので、、、。
そこで、【結合(JOIN)】する必要が出てきます。
今回は、2つのテーブルを、IDが一致した場合に結合する方法をご紹介します。
記事要約
- 内部結合(INNER JOIN)について解説します。
- 内部結合のサンプルと動作確認をします。
目次
内部結合(INNER JOIN)の特徴
内部結合には、以下のような特徴があります。
内部結合の特徴
- 2つの別々のテーブルを、結合します。
- 2つのテーブルで、結合対象のカラムを、指定する。
- それぞれのカラムに、同じ値が格納されているデータのみを結合して取得する。
なお、結合対象のテーブルどちらかのテーブルにだけ値が存在したときでも結合をする。ことを、外部結合と言います。
内部結合のイメージ
以前作成した、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;
- listedmarketとmarketを指定する
- listedmarketテーブルの、listed_MARKETを上から取得
- ②と同じ値を、marketテーブルのmk_idから検索
- 一致しているレコードを、listedmarketテーブルに結合していく
実行結果(画面)
サンプル実行時のイメージ
サンプル実行時の問題点
<listed_MARKET>と<mk_id>の両方の値が結合後のテーブルに出力されています。
間違いではないのですが、同じ値が出力されるのであれば、どちらか片方だけ列として表示されれば良いですよね。
select * from〜で、全列取得になってしまうので、同じ列が出力されてしまいます。
問題点の回避(取得対象の列を絞り込む)
select MEI_CD,listed_MARKET,name from listedmarket INNER JOIN market on listed_MARKET = mk_id;
- 取得対象の列を指定しています。
- ②と同じ値を、marketテーブルのmk_idから検索
- 一致しているレコードを、listedmarketテーブルに結合していく
name列は、listedmarketテーブルにはありませんが、結合対象のmarketテーブルにあるname列を取得するため、selectすることができます!
実行結果(画面)
サンプル実行時のイメージ
EOF
INNER JOINについてまとめました。
外部結合と、動作が混同したりはじめはややこしいのですが、一つずつ整理していきたいと思います。
一緒に学習してくださって、ありがとうございました!
また、次回!