目次
SQL 結合
それでは、SQL基本の最後の結合です。
結合とは、複数のテーブル(表)から組み合わせてデータを抽出することです。
仮に、「kojin_table」と「zei_table」があったとしましょう。
「zei_table」は、次の様な表です。
kojin_no | zeimoku | zeigaku | tourokubi |
1000000001 | jyuuminzei | 10000 | 1900/1/1 |
1000000001 | kokuhozei | 15000 | 1900/1/1 |
1000000001 | jidousyazei | 34500 | 1900/1/1 |
1000000001 | koteisisanzei | 35000 | 1900/1/1 |
1000000002 | jyuuminzei | 20000 | 1900/1/1 |
1000000002 | kokuhozei | 25000 | 1900/1/1 |
1000000002 | jidousyazei | 45000 | 1900/1/1 |
1000000002 | koteisisanzei | 23000 | 1900/1/1 |
1000000003 | jyuuminzei | 80000 | 1900/1/1 |
1000000003 | kokuhozei | 30000 | 1900/1/1 |
1000000003 | jidousyazei | 29500 | 1900/1/1 |
1000000003 | koteisisanzei | 50000 | 1900/1/1 |
1000000006 | jyuuminzei | 18000 | 1900/1/1 |
1000000006 | kokuhozei | 29500 | 1900/1/1 |
1000000006 | jidousyazei | 25000 | 1900/1/1 |
1000000006 | koteisisanzei | 29000 | 1900/1/1 |
例えば、「kojin_table」の「日本太郎」さんの課税されている税目を全て抽出したいとしましょう。
SQL文は、
select
*
from
kojin_table koj,
zei_table zei
where
koj.kojin_no = zei.kojin_no
and koj.kojin_no = ‘1000000006’
;
※表記上「全角」を使っている場合がありますが、実際の記載は、全て「半角英数」になりますので、注意してください。
となります。
「*」は、2つのテーブル(表)の全てのカラム(列)を抽出することとなります。
複数のテーブル(表)を選択する場合は、最後のテーブル(表)を除き、テーブル(表)の後ろに、「,」コロンを付ける必要があります。
また、テーブル(表)名の後に、短縮名を付けることにより、カラム(列)名を指定する際に、記述を短縮できます。
例:「kojn_table.kojin_no」=「koj.kojin_no」
「koj.kojin_no = zei.kojin_no」は、「kojin_table」と「zei_table」のうち「kojin_no」が合致しているもののみ抽出する意味です。
「koj.kojin_no = ‘1000000006’」は、「kojin_no」から「1000000006」の行を抽出することとなります。
2つのテーブルには、共通するカラム(データ)が必要
一つ大切なことは、「kojin_table koj」と「zei_table zei」のどちらにも、個人を特定できる「kojin_no」というカラム(列)があることです。
それぞれ、「主キー」と「外部キー」と言いますが、各テーブルに紐づける事ができるカラム(列)があることが重要となります。
これが無いと、複数のテーブルを結合することはできませんので、必ず紐づけできる列(カラム)があるかどうか確認しましょう。
kojin_no | kanji_name | kana_name | jyuusyo | seibetsu | seinengappi | tourokubi | kojin_no | zeimoku | zeigaku | tourokubi |
1000000006 | 日 太郎 | ニホン タロウ | トウキョウ | 女 | 1905/1/1 | 1900/1/1 | 1000000006 | jyuumnzei | 28000 | 1900/1/1 |
1000000006 | 日 太郎 | ニホン タロウ | トウキョウ | 女 | 1905/1/1 | 1900/1/1 | 1000000006 | kokuhozei | 30000 | 1900/1/1 |
1000000006 | 日 太郎 | ニホン タロウ | トウキョウ | 女 | 1905/1/1 | 1900/1/1 | 1000000006 | jidousyazei | 39500 | 1900/1/1 |
1000000006 | 日 太郎 | ニホン タロウ | トウキョウ | 女 | 1905/1/1 | 1900/1/1 | 1000000006 | koteisisanzei | 42000 | 1900/1/1 |
カラム(列)名を指定して抽出する場合のSQL分は、次のとおりです。
select
koj.kojin_no,
koj.kanji_name,
zei.zeimoku,
zei.zeigaku
from
kojin_table koj,
zei_table zei
where
koj.kojin_no = zei.kojin_no
and koj.kojin_no = ‘1000000006’
;
※表記上「全角」を使っている場合がありますが、実際の記載は、全て「半角英数」になりますので、注意してください。
2つのテーブル(表)から指定された条件で、行とカラム(列)が抽出されます。
kojin_no | kanji_name | zeimoku | zeigaku |
1000000006 | 日 太郎 | jyuumnzei | 28000 |
1000000006 | 日 太郎 | kokuhozei | 30000 |
1000000006 | 日 太郎 | jidousyazei | 39500 |
1000000006 | 日 太郎 | koteisisanzei | 42000 |
SQL 左外部結合
結合の最後に、「zei_table」にデータがない場合も含めて全て表示させる方法を実施してみます。
SQL分は、次のとおりです。
select
koj.kojin_no,
koj.kanji_name,
zei.zeimoku,
zei.zeigaku
from
kojin_table koj,
zei_table zei
where
koj.kojin_no = zei.kojin_no (+)
;
※表記上「全角」を使っている場合がありますが、実際の記載は、全て「半角英数」になりますので、注意してください。
「(+)」を付けると、「kojin_table」の全ての行を「zei_table」のデータの有無に関わらず全て週出します。
「zeimoku_table」の「zeimoku」に「jyuuminzei」が無い行は、空白として抽出されます。
kojin_no | kanji_name | zeimoku | zeigaku |
1000000001 | 伊 太郎 | jidousyazei | 34500 |
1000000001 | 伊 太郎 | jyuuminzei | 10000 |
1000000001 | 伊 太郎 | kokuhozei | 15000 |
1000000001 | 伊 太郎 | koteisisanzei | 35000 |
1000000002 | 英 太郎 | jidousyazei | 45000 |
1000000002 | 英 太郎 | jyuuminzei | 20000 |
1000000002 | 英 太郎 | kokuhozei | 25000 |
1000000002 | 英 太郎 | koteisisanzei | 23000 |
1000000003 | 仏 太郎 | jidousyazei | 29500 |
1000000003 | 仏 太郎 | jyuuminzei | 80000 |
1000000003 | 仏 太郎 | kokuhozei | 30000 |
1000000003 | 仏 太郎 | koteisisanzei | 50000 |
1000000004 | 露 太郎 | ||
1000000005 | 加 太郎 | ||
1000000006 | 日 太郎 | jidousyazei | 25000 |
1000000006 | 日 太郎 | jyuuminzei | 18000 |
1000000006 | 日 太郎 | kokuhozei | 29500 |
1000000006 | 日 太郎 | koteisisanzei | 29000 |
1000000007 | 米 太郎 |
MySQL等の場合は、Oracleと記述が異なり(+)が使えないので、次の記述となります。
SELECT
koj.kojin_no,
koj.kanji_name,
zei.zeimoku,
zei.zeigaku
FROM
kojin_table koj LEFT JOIN zei_table zei ON koj.kojin_no = zei.kojin_no
;
※表記上「全角」を使っている場合がありますが、実際の記載は、全て「半角英数」になりますので、注意してください。
LEFT JOIN(左外部結合)
ここまでが、SQLの基本となります。
テーブル(表)名とカラム(列)名さえ分かれば、これだけでもかなり、自由にデータを抽出することができます。
とにかくやってみることが大切です。
抽出したデータをエクセルで操作し集計等もできます。
次回からは、条件分岐やSQL内での集計など、さらに実践的なことをやっていきたいと思います。