ALL ARTICLES FILED IN

Tech Blog

[SQL]マーケターのためのSQL入門2 ー 複数テーブルからデータを取得する

Posted by デジマール技術部 on 2018/09/08
デジマール技術部

前回はSELECT文を使ってごく簡単なクエリを発行する方法についてご説明しました。

前回の記事
[SQL]マーケターのためのSQL入門1 ー SQLの基本

今回は、複数のテーブルを組み合わせたクエリについて書いていきたいと思います。

環境は前回同様にRedashをフロントエンドとして、PostgreSQLチュートリアルのサンプルデータを使用します。

Redashの環境構築に興味がある方は過去の記事をご参照ください。

では、次のSQL文をみてください。

SELECT first_name, last_name, email FROM customer;

こちらのコードを実行すると、customerテーブルに登録されている全顧客の氏名とメールアドレスが返されます。
次はこの情報に住所を追加します。住所が格納されているのは、addressテーブルです。customerテーブルを見ると、address_idというカラムがあり、これをキーとしてaddressテーブルに紐づいていることがわかります。

ERダイアグラム
http://www.postgresqltutorial.com/wp-content/uploads/2018/03/printable-postgresql-sample-database-diagram.pdf

addressテーブルの情報を追加するためには、JOIN句を使います。いくつか種類があるのですが、今回は、INNER JOINというものを使います。
INNER JOINは2つのテーブルに共通するものがあるレコードだけを結合する方法になります。


SELECT first_name,
last_name,
email,
address
FROM (customer
INNER JOIN address ON customer.address_id = address.address_id);

やや複雑なSQLですが、先ほどのSELECT文のあとにaddressというカラムが追加されています。そしてFROMには参照する元のテーブル名を入れていましたが、今回は元々のcustomerテーブルだけではなく、INNER JOINでaddressテーブルを追加しています。そして追加する条件がON以降で、この場合はcustomerテーブルのaddress_idとaddressテーブルのaddress_idが一致するように指定しています。このSQLを実行すると、以下のような結果が得られます。

 

今度は、出力するカラム名を変更してみましょう。


SELECT c.first_name AS 名前,
c.last_name AS 苗字,
c.email AS メールアドレス,
a.address AS 住所
FROM (customer AS c
INNER JOIN address AS a ON c.address_id = a.address_id);

また、こちらのSQLではテーブル名もAS句で別名を定義して、カラム名の前につけるようにしています。これをやらないと複数テーブルを扱う場合に違うテーブルであってもカラム名が重複してしまうためにエラーになることがあります。
このSQLを実行すると以下の結果が得られます。

今回は、複数のテーブルを対象としたSQL文の書き方についてご説明しました。今後、より進んだSQLの使い方についても触れていきます。

 

———-
弊社では、マーケターがRedashをフロントに置いたデータ解析環境を構築するお手伝いもしております。
またRedashだけでなく、社内データの利活用やデジタルマーケティング全般に関するご相談も、お気軽に以下よりお問い合わせください。

お問い合わせはこちら

Topics: sql, Redash, 技術情報, マーケター