inner joinとhaving

ゆうき( @BASEBALLY15 )です^^

MySQLについて勉強しているのですが,『内部結合(inner join)』について,教えて欲しいです・・・

分かりました!
今回は,『内部結合(inner join)』について,ご紹介します.

よろしくお願いします・・・

(Udemy『はじめてのMySQL・データ分析入門』を参考)

内部結合(inner join)について学習しました!

使うデータ

MySQL Workbench

MySQL Workbenchを使います.

今回は,MySQL Workbench内のサンプルデータである『sakila』というデータベースを使います.

sakila』というデータベースは,このように4つグループに分かれています.

(画像をクリックすると,引用元を確認できます.)

今回は,その中から,『Customer Data』を使います.

MySQL_sakila

それでは,コードを見ていきましょう⤵

inner joinでテーブル同士を結合しよう!

city』テーブルと『country』テーブルを結合します.

MySQL_sakila1

まずは, 『city』テーブルと『country』テーブル をそれぞれ表示してみます.

city

#『sakila』というサンプルデータベースを使う
use sakila;

select * from city ;
 city_idcitycountry_idlast_update
 1A Corua (La Corua)872006-02-15 04:45:25
 2Abha822006-02-15 04:45:25
 3Abu Dhabi1012006-02-15 04:45:25
 4Acua602006-02-15 04:45:25
 5Adana972006-02-15 04:45:25
 6Addis Abeba312006-02-15 04:45:25
 7Aden1072006-02-15 04:45:25
 8Adoni442006-02-15 04:45:25
 9Ahmadnagar442006-02-15 04:45:25
 10Akishima502006-02-15 04:45:25
 

country

select * from country ;
 country_idcountrylast_update
 1Afghanistan2006-02-15 04:44:00
 2Algeria2006-02-15 04:44:00
 3American Samoa2006-02-15 04:44:00
 4Angola2006-02-15 04:44:00
 5Anguilla2006-02-15 04:44:00
 6Argentina2006-02-15 04:44:00
 7Armenia2006-02-15 04:44:00
 8Australia2006-02-15 04:44:00
 9Austria2006-02-15 04:44:00
 10Azerbaijan2006-02-15 04:44:00
 

それでは,この2つのテーブルを『inner join』を使って結合してみましょう.

どちらのテーブルにもcountry_idがあるので,それで結合します.

また,テーブル名は,asを使うことで短くできます.

#cityとcountryを結合する(inner join)
select
	ci.city_id,
    ci.city,
    co.country_id,
    co.country,
    co.last_update
from
	city as ci
inner join
	country as co
    on ci.country_id = co.country_id;
 address_idaddressaddress2districtcity_idpostal_codephonelocationlast_update
 147 MySakila DriveAlberta3002014-09-25 22:30:27
 228 MySQL BoulevardQLD5762014-09-25 22:30:09
 323 Workhaven LaneAlberta300140333355682014-09-25 22:30:27
 41411 Lillydale DriveQLD57661722355892014-09-25 22:30:09
 51913 Hanoi WayNagasaki46335200283033842902014-09-25 22:31:53
 61121 Loja AvenueCalifornia449178868386352866492014-09-25 22:34:01
 7692 Joliet StreetAttika38835794484771904082014-09-25 22:31:07
 81566 Inegl ManorMandalay349535617058140035272014-09-25 22:32:18
 953 Idfu ParkwayNantou36142399106556486742014-09-25 22:33:16
 101795 Santiago de Compostela WayTexas295187438604526264342014-09-25 22:33:55
 

inner joinで3つのテーブルを結合しよう!

次に,複数のテーブルを結合します.

MySQL_sakila3

『inner join』を繰り返し使うことで,複数のテーブルを結合できます.

#cityとcountryとaddressを結合する
select
	ci.city_id,
    ci.city ,
    co.country_id,
    co.country ,
    a.address_id ,
    a.address ,
    a.district,
    a.last_update
from
	city as ci
inner join
	country as co
    on ci.country_id = co.country_id
inner join
	address as a
    on a.city_id = ci.city_id;
 city_idcitycountry_idcountryaddress_idaddressdistrictlast_update
 251Kabul1Afghanistan2221168 Najafabad ParkwayKabol2014-09-25 22:29:59
 59Batna2Algeria4461924 Shimonoseki DriveBatna2014-09-25 22:29:59
 63Bchar2Algeria731031 Daugavpils ParkwayBchar2014-09-25 22:29:59
 483Skikda2Algeria180757 Rustenburg AvenueSkikda2014-09-25 22:30:01
 516Tafuna3American Samoa3251892 Nabereznyje Telny LaneTutuila2014-09-25 22:30:02
 67Benguela4Angola534486 Ondo ParkwayBenguela2014-09-25 22:30:02
 360Namibe4Angola388368 Hunuco BoulevardNamibe2014-09-25 22:30:03
 493South Hill5Anguilla3861368 Maracabo Boulevard2014-09-25 22:30:03
 20Almirante Brown6Argentina3641623 Kingstown DriveBuenos Aires2014-09-25 22:30:04
 43Avellaneda6Argentina5661229 Varanasi (Benares) ManorBuenos Aires2014-09-25 22:30:04

where句とhaving句で条件を絞ろう!

最後に,where句とhaving句を使って,条件を絞ります.

ちなみに,where句については,以下の記事で紹介しています.

country_id=6』かつ『last_update=”2014-09-25 22:30:04″』

のデータを取り出します.

asを使うことで,テーブルのカラムを日本語表記に替えることができます.

#country_idが6でlast_updateが2014-09-25 22:30:04のみに紐づくカテゴリ名を取得
select
	ci.city_id as 都市ID,
    ci.city as 都市,
    co.country_id as 国ID,
    co.country as 国,
    a.address_id as アドレスID,
    a.address as アドレス,
    a.district as 地区,
    a.last_update as 最終更新日時
from
	city as ci
inner join
	country as co
    on ci.country_id = co.country_id
inner join
	address as a
    on a.city_id = ci.city_id
where
	ci.country_id = 6
having
	a.last_update = "2014-09-25 22:30:04";
 都市ID都市国IDアドレスIDアドレス地区最終更新日時
 20Almirante Brown6Argentina3641623 Kingstown DriveBuenos Aires2014-09-25 22:30:04
 43Avellaneda6Argentina5661229 Varanasi (Benares) ManorBuenos Aires2014-09-25 22:30:04
 45Baha Blanca6Argentina3271427 A Corua (La Corua) PlaceBuenos Aires2014-09-25 22:30:04

終わりに

本記事を読んでいただき,本当にありがとうございます!

今回は,MySQLの『inner join』と『having』の使い方についてご紹介しました.

今後も学習したことを発信していきます.

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA