chelseaの日記

データサイエンス系の技術と趣味を綴る(アイコンはchatgptに描いてもらいました)

データサイエンティストに必須のSQLスキル

データサイエンティストとして活躍するためには、SQLの習得が必須スキルとなっています。しかし、「SQLをどのように学んでいけばいいのか分からない」という声をよく耳にします。

この記事では、SQLの基本的な概念から実践的な使い方まで、データサイエンティストを目指す方々向けに、効率的なSQL学習の道筋をご紹介します。

特に、Web系の実務で必要となるSQLの使い方に焦点を当て、具体的な例を交えながら解説していきます。

想定読者

  • データサイエンティストを目指す学生・他業種の社会人の方でSQLの学び方がわからない方

1.SQLの概要

SQLとは何か?

SQLとはStructured Query Language(構造化問合せ言語)の略で、データベースを操作するための標準的なプログラミング言語です。主にデータの検索や更新、データベースの作成や変更などを行うために使用されます。リレーショナルデータベースを操作するためにもちいられ、1974年にIBMで開発されて以来、データベース操作の世界標準として広く使われています。

簡単な例えを挙げると、大量の整理された情報(例:図書館の本のカタログ)から必要な情報を探し出したり(検索)、新しい情報を追加したり(挿入)、既存の情報を変更したり(更新)する際に使用する「言語」といえます。

なぜSQLを学ぶ必要があるのか?

SQLはデータサイエンティストの実務でも多く用いられている。私が従事しているWeb系の案件では主に以下の用途に用いられている。

  1. ユーザー行動分析(例:新規登録したユーザーが1週間以内にどのような機能を使用したかを分析)

-アクセスログ解析(例:特定の時間帯におけるページの滞在時間の調査)

-PV数やSS数の集計(例:新機能リリース前後での利用状況の比較)

-マーケティングファネルの追跡(例:商品閲覧から購入までの導線分析)

etc

  1. A/Bテストの分析結果の集計(例:ボタンの色や配置を変更した際のコンバージョン率の違いを分析)
  2. ビジネスメトリクス(LTVやリテンション)の算出など(例:月間アクティブユーザー数の推移や継続率の計算)

このように、SQLはデータサイエンティストにとって一番最初に覚えるべき言語と言っても過言ではありません。

2.SQL学習ロードマップ

学習ロードマップは以下の通りです。

📚 基本構文を覚える

⬇️

✍️ 練習問題を解く

⬇️

💻 実践で使ってみる

それでは、実際にそれぞれの工程の取り組み方を見ていきましょう!

基本的なSQL文法の詳細説明(SELECT, INSERT, UPDATE, DELETE)

1.基本構文を覚える

基本構文はselect, insert, update, deleteの4つです。

4つの基本的なSQL構文を説明します:

 -- SELECT: データの検索
SELECT カラム名 FROM テーブル名 WHERE 条件;
例: SELECT name, age FROM users WHERE age > 20;

-- INSERT: データの追加
INSERT INTO テーブル名 (カラム1, カラム2) VALUES (値1, 値2);
例: INSERT INTO users (name, age) VALUES ('山田太郎', 25);

-- UPDATE: データの更新
UPDATE テーブル名 SET カラム = 新しい値 WHERE 条件;
例: UPDATE users SET age = 26 WHERE name = '山田太郎';

-- DELETE: データの削除
DELETE FROM テーブル名 WHERE 条件;
例: DELETE FROM users WHERE name = '山田太郎';

これらの構文が基本となり、特にSELECT文は実務で最も頻繁に使用されます。

とはいいつも、select文を使う機会が圧倒的に多いので、今回はselectと合わせて用いられる構文を4つご紹介します!

以下を完璧に覚えれば、SQLを使ったクエリはほとんど書けると思います。

  • group byとorder by

これらの構文について、簡単な例を見てみましょう:

-- GROUP BY: データをグループ化して集計
SELECT department, COUNT(*) as 社員数
FROM employees
GROUP BY department;
-- 部署ごとの社員数を集計

-- ORDER BY: データを並び替え
SELECT name, salary
FROM employees
ORDER BY salary DESC;  -- 給与の高い順に並び替え

-- GROUP BYとORDER BYの組み合わせ
SELECT department, AVG(salary) as 平均給与
FROM employees
GROUP BY department
ORDER BY 平均給与 DESC;
-- 部署ごとの平均給与を、高い順に表示

このように、GROUP BYは集計の際に、ORDER BYは並べ替えの際によく使用されます。

  • group byとセットで集計関数を覚える(count,sumなど)

以下に、代表的な集計関数の例を示します:

-- COUNT: レコード数をカウント
SELECT department, COUNT(*) as 社員数
FROM employees
GROUP BY department;
-- 部署ごとの社員数を集計

-- SUM: 合計を計算
SELECT department, SUM(salary) as 給与総額
FROM employees
GROUP BY department;
-- 部署ごとの給与総額を集計

-- AVG: 平均値を計算
SELECT department, AVG(age) as 平均年齢
FROM employees
GROUP BY department;
-- 部署ごとの平均年齢を集計

-- MAX/MIN: 最大値・最小値を取得
SELECT department, 
       MAX(salary) as 最高給与,
       MIN(salary) as 最低給与
FROM employees
GROUP BY department;
-- 部署ごとの最高給与と最低給与を表示

これらの集計関数は、GROUP BY句と組み合わせることで、グループごとの集計値を簡単に計算することができます。

  • (INNER) JOINとLEFT JOIN(テーブルの結合のイメージをつかむ)

(INNER) JOINとLEFT JOINは、複数のテーブルを結合するために使用される重要な操作です。以下に例を示します:

-- 社員テーブルと部署テーブルの結合例

-- INNER JOIN(両方のテーブルに存在するデータのみ取得)
SELECT employees.name, departments.dept_name
FROM employees
JOIN departments ON employees.dept_id = departments.id;
-- 部署に所属している社員のみ表示

-- LEFT JOIN(左テーブルの全データを取得)
SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.id;
-- 部署に所属していない社員も含めて全社員を表示

(INNER) JOINは両方のテーブルに存在するデータのみを取得するのに対し、LEFT JOINは左側のテーブル(この例ではemployees)の全データを保持したまま結合を行います。これにより、部署に所属していない社員のデータも取得することができます。

LEFT JOINは、マスタテーブルを左側に配置し、紐づけたいデータを元のレコード数を維持したまま結合できます。

実務では、3つ以上のテーブルが存在することが一般的です。その際は、プライマリーキー(テーブル内でユニークな識別子となるカラム)の特定と、テーブル間の関係性(ER図で表現される)を十分に理解した上で結合処理を行う必要があります。ER図の詳しい説明については、参考書籍「達人に学ぶDB設計徹底指南書」をご覧ください。

  • With句

WITH句は、複雑なSQLクエリを分かりやすく整理するために使用される構文です。一時的な名前付きの結果セットを作成できます。以下に例を示します:

 -- 部署ごとの平均給与を計算し、それを基に高給与部署を特定する
WITH 部署別平均給与 AS (
    SELECT department,
           AVG(salary) as avg_salary
    FROM employees
    GROUP BY department
)
SELECT department,
       avg_salary
FROM 部署別平均給与
WHERE avg_salary > 500000;

-- 複数のWITH句を使用する例
WITH 月間売上 AS (
    SELECT date_trunc('month', sale_date) as month,
           SUM(amount) as monthly_sales
    FROM sales
    GROUP BY month
),
年間平均 AS (
    SELECT AVG(monthly_sales) as yearly_avg
    FROM 月間売上
)
SELECT month,
       monthly_sales,
       yearly_avg,
       monthly_sales - yearly_avg as difference
FROM 月間売上, 年間平均
ORDER BY month;

With句を使用することで、複雑なクエリを小さな部分に分割し、より読みやすく保守しやすいコードを作成することができます。特に、同じサブクエリを複数回使用する場合に便利です。

SQL参考書籍:

達人に学ぶDB設計徹底指南書

 https://www.amazon.co.jp/達人に学ぶDB設計-徹底指南書-初級者で終わりたくないあなたへ-ミック/dp/4798124702

  1. 練習問題を解く

基本的なSQL文法を覚えたら、練習問題をドリル形式で繰り返し解いていきましょう!

下のSQL参考書で紹介するドリル形式の演習書やコンテストに参加してみるのがいいです。

SQL参考書籍:

SQL書き方ドリル

 https://www.amazon.co.jp/改訂3版-すらすらと手が動くようになる-SQL書き方ドリル-PRESS-plus-ebook/dp/B07JHHSFJX/ref=sr_1_3?crid=2ME9CFNR56AEQ&dib=eyJ2IjoiMSJ9.QSnYk_Gj6WWC_W6PiYLAhLxfzCGcvMP5hYc7S53jBcbB4DwJZojR1VR6WcVIAVptmEwU_fx45PHkm5nCdqCfW2Pz0nGzFpU8WRjd93bRI9F2gJl4S3Tb75W_0oMi5--72tNP6Fly3lQb9UG2ebHuv_lCKlPUKpL6xKokZ7LmVkA6my88u_7RG4EPksDiXMm5S3lGvPSP7GIshs5cmuH5o4GYdpYzVpS_DOGN7Xao7LW7-xcGeSQAiOgHI17zTALaGEPv6r7DTDrMzUy2AlnNGpsTUTAJybOZoZUksLaLtcI.27wjA4jT0hJzdDXKhpR2H1xgiwJT6lVTbXHgE8MDBLY&dib_tag=se&keywords=sql書き方ドリル&qid=1733907538&sprefix=sqlかき%2Caps%2C152&sr=8-3

上の書籍では、SQLの書き方を練習問題することができます。習ったことを定着させるために繰り返し練習しましょう

SQL入門

 https://www.amazon.co.jp/スッキリわかるSQL入門-第4版-ドリル256問付き!-スッキリわかる入門シリーズ-中山/dp/4295018465/ref=sr_1_1_sspa?__mk_ja_JP=カタカナ&crid=3TOF30XTJB5LT&dib=eyJ2IjoiMSJ9.A59kzqon0gCVaMvqURGahDvi2q5S4X6j5vfDPm4tm0UfeqQDhv-_KY3ej_VZnX4jb2nuRsphrifXrRFggS1fjsDQN-TEFvq6dHYYPccDPlSo_HjOnHYz682_7hXClJdmunBjpC9I3UfC0qi8KvkKxJgYfooc2453B1iLBDaoiBFRNQKs-B8qWslgOcc1dAVd-mkJum3NCn8hCdftvxaQc7TlSc76NTLMmvOPk8jXY1m2U-Q6p2bKy7viz53IbRUpO-kywvBS6YVT6ChwEHYBbNAqG-lNNizjZ7W7nnbz4o4.AFgqn6dVkpofup25YZLfsNTRvpQevfWb3Awoh2TqYzI&dib_tag=se&keywords=sql+入門&qid=1733907778&sprefix=sql入門%2Caps%2C151&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1

上の書籍では、クラウドサービスを用いて、簡単にSQLを練習できます。

SQLab

 https://sqlab.net

練習問題が豊富で、環境構築不要なSQL練習サービスです。ブラウザ上で練習できるので、初心者でも取り組みやすいです。

3.実践で使ってみる

最後は今まで定着させてきた知識を実践で使ってみましょう!

データサイエンティスト未経験の方はできるだけ実践に近い(何のために、どういう分析をするのか的なことが書かれている)本を読み込む、書き下すことがいい練習になります!

以下の本はおすすめの書籍です。

SQL参考書籍:

SQLレシピ

実際のログデータに近い仮想的なデータセットを使って、基礎的なデータ加工や売上・ユーザー理解のためのWebマーケティングのためのクエリが数多く紹介されています。chapter5の内容まで使いこなせるようになれば、実務のSQLはほぼ問題ないといって差し支えないでしょう。

3. SQL上達のコツとまとめ

SQL最大の上達のコツは繰り返しSQLのクエリを書くことです。基本構文を覚えることはそこまで難しくないので、覚えたら、繰り返し書いて定着させることや実践での使用を意識したクエリを書いていきましょう!

未経験者でデータサイエンティストを目指す方にとっては、SQLとPythonがある程度できると基礎技術は身についていると面接などでアピールできる可能性が高いです。きっちり練習していけば、確実にマスターできるスキルなので、今日からSQL力を上げていきましょう!

個人的にはSQLでリレーショナルデータベースの考え方を身につけてからの方がPythonが習熟しやすいので、まずSQLから取り組むことがおすすめです。

こんな感じで、今後もデータサイエンス系の記事を更新していきたいと思いますので、よろしくお願いいたします!

改めまして自己紹介

ブログ開設1年近く経ってしまいました。今更感ありますが、自己紹介させていただきます。

私は2024年3月に東京大学経済学研究科を卒業しました。博士課程進学と迷った末、4月よりデータ分析受託系のコンサルティング会社にデータサイエンティストとして就職いたしました。

3ヶ月の研修後、旅行サービスのUX改善などの業務を行っています。主なタスクは分析用の集計クエリを書く、効果検証です。

本ブログを再開したきっかけとしては、技術系の話を書いてみたかったからです。受託分析企業なので、案件のことを直接は書けませんが、データサイエンスの現場での実践知を少しでも知っていただければと思います。

とはいえ、個人ブログなので、個人的な趣味(乗り鉄、サッカー、小説など)とかについても書くかもしれません。

週1回を目処に技術記事をアップしていきたいです。(宣言することで、自分を奮いたたせるやつです。)

今後ともよろしくお願いいたします。

お疲れ様です

今日は色んな人と話した一日でした。

内気な人間にとって話をするって、それだけで疲れますよね、、 

研究について指導教員に相談したのですが、思い通りに言葉が伝わらないもどかしさがありました(自分の理解が足りてないからですが)

でも、オンラインでナイジェリアの方とチェルシーの話ができたのは楽しかったです。

経済学って小難しいことばかりやるので、こういう息抜きは大事ですね。

お疲れ様です

今日は色んな人と話した一日でした。

内気な人間にとって話をするって、それだけで疲れますよね、、 

研究について指導教員に相談したのですが、思い通りに言葉が伝わらないもどかしさがありました(自分の理解が足りてないからですが)

でも、オンラインでナイジェリアの方とチェルシーの話ができたのは楽しかったです。

経済学って小難しいことばかりやるので、こういう息抜きは大事ですね。

まずは初めに

新年度になりました。

今年度は色々なことに挑戦して、殻を破る一年にしたいです。

進路としてはほぼ博士課程に行くつもりです。

経済学研究科のコア科目も終わって、修論をやることに集中できるので、思う存分研究生活を楽しみたいです。

と言うことで、今日は夜更かしして、チェルシーの試合を見たいと思います。

 

はじめまして

自分の考えてることを書き留めたいと思いはじめました。

研究(マクロ経済学)のことや趣味のこと雑多に話したいと思います。

自分は高校時代に鬱病になり、人間関係も全て断ち切ってしまったことがあります。内に篭りやすい人間だからこそ、少しでも殻を破りたいと思って、本音を書き留めようと思います。

 

Â