SQLの実践的なスキルを鍛える方法とは?2つの視点で徹底解説!


SQLをもっと鍛えたいけど、何を学べばいいんだろう?
SQLの実践的なスキルを鍛える方法はないかな?

SQLの基礎ができるようになっても、実践的なスキルの鍛え方がわからない人は多いです。SQLはSELECT文だけでもさまざまな条件指定がありますし、何から学べばいいかわからない人もいるのではないでしょうか。

こんにちは!フリーランスエンジニア兼テックライターのワキザカです。

この記事では、SQLの実践的なスキルを鍛える方法を解説します。

現場でよく使うSQLもまとめているので、ぜひ最後まで読んでみてくださいね。

この記事はこんな人のために書きました。

  • SQLの実践的なスキルを身に着けたい人
  • SQLの基礎だけでなく実践的な書き方を学びたい人

目次

SQLの実践的なスキルを鍛える方法とは?

「SQLの実践的なスキル」と一口に言っても、色々あります。

具体的に言うと、以下の2つのスキルです。

  • データベース・SQLの基礎を覚えてSQLが書けるようになる
  • 現場でよく使う応用的なSQLの書き方を覚える

「データベース・SQLの基礎を覚えてSQLが書けるようになる」はマストで必要なスキルで、「現場でよく使う応用的なSQLの書き方を覚える」は実際に開発現場に出たときに使えるスキルです。

それぞれ詳しく解説しますね。

SQLの実践的なスキル1:データベース・SQLの基礎を学ぶ

まず、「データベース・SQLの基礎を学ぶ」について解説します。

「SQLが書けるようになった」というだけでなく、根本的なデータベースの概念やSQLの基礎知識をつけておくことは重要です。

基礎がしっかりできていないと、いくらSQLの書き方を覚えたところで付け焼刃になってしまうためです。

まずは土台をしっかり固めて、SQLの実践的なスキルを使いこなすための基礎を覚えましょう!

今回は、以下の4つの視点で基礎を解説します。

  • データベースの基礎
  • データベースの環境構築
  • SQLの基礎知識
  • 誤ってデータを書き換えない方法

それぞれ詳しく解説しますね。

データベースの基礎

1つ目は、データベースの基礎です。

SQLはデータベースを定義・操作する言語です。そのため、データベースの理解は必要不可欠です。

たとえば、データベース・テーブル・レコードの概念は、SQLを書くときにとても重要です。


データベース・テーブル・レコードの概念

他にもデータベースの基礎について以下でまとめているので、不安な方はぜひ見てみてください!

データベースの環境構築

2つ目は、「データベースの環境構築」です。

今はWeb上でSQLを実行できる環境が簡単に手に入りますよね。たとえば、paiza.ioなどです。

ただ、SQLはデータベースによって書き方が若干違います。

また開発現場では、パソコンに構築したデータベース環境を使ってSQLを書くことがほとんどです。

そのため、データベースの環境構築はしておきましょう。MySQLの環境構築については以下で解説しているので、ぜひ参考にしてみてください。

SQLの基礎知識

3つ目は、「SQLの基礎知識」です。

「何をいまさら……」と思う方もいるかもしれませんが、SQLは書き方を覚えるだけでなく概念も覚えておくのがおすすめです。

例えば、SQLには大きく分けて以下2つの種類があります。

  • DDL:データベース・テーブルを定義する文法
  • DML:テーブルのレコードを操作する文法

DDLは、データベース・テーブルを定義する文法です。CREATE、ALTER、DROPなどの書き方があります。

DMLは、テーブルのレコードを操作する文法です。SELECT、INSERT、UPDATE、DELETEなどですね。

SELECT、INSERTなどの書き方を知っている人はいますが、種類について理解している人は少ないです。知らなかった人は、このタイミングで覚えておきましょう。

DDL、DMLについてはそれぞれ以下でも解説しています。書き方がわからない方は、ぜひ参考にしてみてください。

誤ってデータを書き換えない方法

4つ目が、「誤ってデータを書き換えない方法」です。

SQLを実践で書くときは、「誤ってデータを消してしまうこと」が一番厄介です。一度消してしまうとバックアップからデータ復元が必要になるので、誤ってデータ更新しないためのテクニックを覚えておくのが重要です。

トランザクション制御を使えば、データ更新前に止めることができます。

具体的には、以下のようなイメージです。


トランザクション制御でデータ更新前に止めるイメージ

そのため、SQLを書くときは必ず以下のように「BEGIN;」と「ROLLBACK;」で囲うようにしましょう!

トランザクション制御のSQLの例:

BEGIN;


-- ここにUPDATE文のようなデータ更新文を書く


ROLLBACK;

SQLの実践的なスキル2:現場でよく使う応用的なSQLを学ぶ

次に、「現場でよく使う応用的なSQLを学ぶ」について解説します。

基礎がある程度理解出来たら、テクニック面を鍛えていきましょう。具体的には、以下のような書き方を覚えておくのがおすすめです!

  • ASを使って表示名を変える方法
  • 条件を指定してデータ取得する方法
  • JOINを使って結合したテーブルのデータを取得する方法
  • GROUP BYでグループ化してデータ取得する方法
  • サブクエリでデータ取得する方法
  • サブクエリでデータ更新する方法

具体的な書き方について、それぞれ詳しく解説しますね。

ASを使って表示名を変える方法

1つ目は、ASを使って表示名を変える方法です。

SELECT文でデータを表示すると、テーブルで定義した名称が表示されてしまいますよね。

ただ、実際に使う時は、日本語のわかりやすい名前で表示するケースがほとんどです。そのため、SELECT文の表示名の変え方を覚えておきましょう。

表示名を変えるときは、AS句を使います。具体的には、以下のように書きます。

AS句を使ったSQLのサンプル:

SELECT
  dept_cd AS 部署コード,
  dept_name AS 部署名称,
  id AS ユーザID
FROM
  dept_users;

実行結果:

| 部署コード | 部署名称 | ユーザID | 
| --- | --- | ---: | 
| A0001 | 第一開発部 | 1 | 
| A0001 | 第一開発部 | 2 | 
| A0002 | 第二開発部 | 3 | 
| A0002 | 第二開発部 | 4 | 
| A0003 | 第三開発部 | 5 | 

表示名を変えることができたので、列名を見るだけで内容がわかりやすいですよね。このようにAS句を使えば、簡単に表示名を変えることができます。

条件を指定してデータ取得する方法

2つ目は、条件を指定してデータ取得する方法です。

条件と一口に言ってもいろいろあるので、ここでは以下3つの条件指定方法を解説しますね。

  • 〇〇以下のデータ
  • 〇〇日以前のデータを調べる方法
  • 〇〇 ~ 〇〇の間のデータ

〇〇以下のデータ

まず、「〇〇以下のデータ」の取得方法について解説します。

SQLでは、以下の比較演算子を使ってデータを絞り込むことができます。

演算子意味
=等しい従業員番号 = 100020
>大きい従業員番号 > 100020
>=以上従業員番号 >= 100020
<小さい従業員番号 < 100020
<=以下従業員番号 <= 100020
!=等しくない従業員番号 != 100020

〇〇以下のデータを取得するサンプルは、以下のとおりです。

〇〇以下のデータを取得するSQLサンプル:

SELECT
  dept_cd AS 部署コード,
  dept_name AS 部署名称,
  id AS ユーザID
FROM
  dept_users
WHERE
  id <= 3;

実行結果:

| 部署コード | 部署名称 | ユーザID | 
| --- | --- | ---: | 
| A0001 | 第一開発部 | 1 | 
| A0001 | 第一開発部 | 2 | 
| A0002 | 第二開発部 | 3 | 

idが3以下のデータのみ表示されていますよね。このように、簡単に条件を付けてデータを絞り込むことができます。

データを演算子で絞る書き方は基本なので、使い方を覚えておきましょう。

〇〇日以前のデータを調べる方法

次に、「〇〇日以前のデータを調べる方法」について解説します。

数値の比較だけでなく、日付でデータを取得するケースはよくあります。「〇〇日以前のデータ」のように、日付を絞って取得するケースも覚えておきましょう。

先ほど紹介した比較演算子を使えばOKですが、サンプルをもとに解説しますね。

登録されている全てのデータ:

| id | name | sex | password | created_at | updated_at | 
| ---: | --- | ---: | --- | --- | --- | 
| 1 | 侍1 | 1 | A1234 | 2019-08-01 12:00:00 | 2019-08-15 12:00:00 | 
| 2 | 侍2 | 1 | A4567 | 2019-08-10 11:00:00 | 2019-08-10 11:00:00 | 
| 3 | 侍3 | 2 | A8910 | 2019-08-15 15:00:00 | 2019-08-18 12:00:00 | 
| 4 | 侍4 | 2 | A1112 | 2019-08-17 12:00:00 | 2019-08-20 12:00:00 | 
| 5 | 侍5 | 1 | A1314 | 2019-08-20 12:00:00 | 2019-08-30 12:00:00 | 

「2019年8月15日12時」以前のデータを取得するSQLサンプル:

SELECT
  *
FROM
  regist_users
WHERE
  created_at <= '2019-08-15 12:00:00';

実行結果:

| id | name | sex | password | created_at | updated_at | 
| ---: | --- | ---: | --- | --- | --- | 
| 1 | 侍1 | 1 | A1234 | 2019-08-01 12:00:00 | 2019-08-15 12:00:00 | 
| 2 | 侍2 | 1 | A4567 | 2019-08-10 11:00:00 | 2019-08-10 11:00:00 | 

「2019年8月15日12時」以前のデータのみ、取得できていますよね。このように、日付のデータを絞って取得することもできます。

〇〇 ~ 〇〇の間のデータ

次に、「〇〇 ~ 〇〇の間のデータ」を取得する方法を解説します。

2017年4月から2018年3月のように指定して、データ取得するケースはよくあります。そのため、範囲を指定してデータ取得する方法を覚えておくのがおすすめです。

具体的には、Between句を使えば範囲指定で条件を絞ることができます。

Between句の使い方:

SELECT
  *
FROM
  テーブル名
WHERE
  項目 BETWEEN A AND B;

「項目 BETWEEN A AND B」で簡単に指定できます。「2019年8月10日10時」から「2019年8月17日13時」の間を指定する場合は、以下のように書きます。

「2019年8月10日10時」から「2019年8月17日13時」の間を指定する場合のSQL:

SELECT
  *
FROM
  regist_users
WHERE
  created_at BETWEEN '2019-08-10 10:00:00' AND '2019-08-17 13:00:00';

実行結果:

| id | name | sex | password | created_at | updated_at | 
| ---: | --- | ---: | --- | --- | --- | 
| 2 | 侍2 | 1 | A4567 | 2019-08-10 11:00:00 | 2019-08-10 11:00:00 | 
| 3 | 侍3 | 2 | A8910 | 2019-08-15 15:00:00 | 2019-08-18 12:00:00 | 
| 4 | 侍4 | 2 | A1112 | 2019-08-17 12:00:00 | 2019-08-20 12:00:00 | 

「2019年8月10日10時」から「2019年8月17日13時」の間のデータを、絞り込むことができていますよね。BETWEENの使い方は、以下でも詳しく解説しています。もっと深く知りたい方は、ぜひ参考にしてみてください。

JOINを使って結合したテーブルのデータを取得する方法

3つ目は、JOINを使って結合したテーブルのデータを取得する方法です。

テーブルを結合してデータ取得するケースはよくあるので、覚えておくのがおすすめです。

たとえば、以下のようなテーブルがあったとします。


テーブル一覧

ここから以下のようにデータを表示するためには、テーブルの結合が必要です。


テーブルを結合したイメージ

1つのテーブルでほしいデータが取得できるケースは稀なので、使い方を覚えておきましょう。

上記のデータを取得するSQLは、以下のように書きます。

JOIN句を使ったSQLサンプル:

SELECT
  d.dept_cd,
  d.dept_name,
  u.id,
  u.name
FROM
  users AS u
INNER JOIN dept_users AS d
  ON u.id = d.id;

実行結果:

| dept_cd | dept_name | id | name | 
| --- | --- | ---: | --- | 
| A0001 | 第一開発部 | 1 | 侍太郎1 | 
| A0001 | 第一開発部 | 2 | 侍太郎2 | 
| A0002 | 第二開発部 | 3 | 侍太郎3 | 
| A0002 | 第二開発部 | 4 | 侍1 | 
| A0003 | 第三開発部 | 5 | 侍2 | 

INNER JOINの後に結合するテーブル名を指定し、ONの後に結合する条件を書いています。2つのテーブルを結合し、上記画像のようにデータが取得できていますよね。

このように、簡単にテーブルを結合することができます。詳しいJOIN句の使い方は以下で解説しているので、興味がある方は見てみてくださいね!

GROUP BYでグループ化してデータ取得する方法

4つ目は、「GROUP BYでグループ化してデータ取得する方法」です。

部署ユーザ一覧テーブルから、部署毎のユーザ数を調べたい…と言ったと場合に使うのが、グループ化です。グループ化すると、指定した列を基準にデータをまとめることができます。

言葉だけではわかりづらいので、簡単なサンプルを用意しました。以下は、部署所属ユーザ一覧テーブルから、部署ごとのユーザ数を取得するサンプルです。

部署所属ユーザ一覧テーブルのデータ一覧:

| dept_cd | dept_name | id | 
| --- | --- | ---: | 
| A0001 | 第一開発部 | 1 | 
| A0001 | 第一開発部 | 2 | 
| A0002 | 第二開発部 | 3 | 
| A0002 | 第二開発部 | 4 | 
| A0003 | 第三開発部 | 5 | 

GROUP BYを使ったSQLサンプル:

SELECT
  dept_cd AS 部署コード,
  COUNT(id) AS ユーザ数
FROM
  dept_users
GROUP BY dept_cd;

実行結果:

| 部署コード | ユーザ数 | 
| --- | ---: | 
| A0001 | 2 | 
| A0002 | 2 | 
| A0003 | 1 | 

部署コードごとのユーザ数が表示できましたよね。このように、グループでまとめる基準を決めてデータ集計できるのが、グループ化です。

少しわかりづらいなと思った方は、以下でも詳しく解説しているので参考にしてみてくださいね。

サブクエリでデータ取得する方法

5つ目は、「サブクエリでデータ取得する方法」です。

サブクエリは、SELECT文の結果を利用して別のSQLを実行する書き方です。例えば、部署所属ユーザ一覧のA0001の部署のユーザIDを取得し、ユーザ一覧テーブルからデータを取得するようなケースです。

具体的には、以下のように書きます。

サブクエリを使ったSQLサンプル:

SELECT
  *
FROM
  users
WHERE
  id IN (
           SELECT 
             id
           FROM
             dept_users
           WHERE
             dept_cd = 'A0001'
        );

実行結果:

| id | name | age | 
| ---: | --- | ---: | 
| 1 | 侍太郎1 | 22 | 
| 2 | 侍太郎2 | 23 | 

「dept_cd = ‘A0001’」のIDが1、2のみだったので、ユーザ一覧テーブルではIDが1、2のデータのみ表示されています。このように、検索結果を利用してSQLを作ることができます。

IN句をつかったサブクエリについては、以下でも詳しく解説しています。もっと詳しく知りたい方は、以下を見てみてくださいね!

サブクエリでデータ更新する方法

6つ目は、「サブクエリでデータ更新する方法」です。

サブクエリは、データ取得だけでなく更新にも使えます。SELECT文の結果を利用してデータ更新するケースはよくあるので、こちらも覚えておくと良いでしょう。

具体的なサンプルは、以下のとおりです。

サブクエリでデータ更新するSQL:

UPDATE
  users
SET
  name = 'サブクエリで更新'
WHERE
  id IN (
           SELECT 
             id
           FROM
             dept_users
           WHERE
             dept_cd = 'A0001'
        );

実行結果:

| id | name | age | 
| ---: | --- | ---: | 
| 1 | サブクエリで更新 | 22 | 
| 2 | サブクエリで更新 | 23 | 
| 3 | 侍太郎3 | 25 | 
| 4 | 侍1 | 27 | 
| 5 | 侍2 | 21 | 

さきほどサブクエリを、UPDATE文に置き換えています。IDが1、2の名前が「サブクエリで更新」に変わっていますよね。このように、UPDATE文などのデータ更新でも使えます。

SELECT文で学んだ条件指定はデータ更新でも使えるので、SELECT文を覚えたらデータ更新を試してみると良いかもしれませんね。

まとめ

今回は、SQLの実践的なスキルを鍛える方法について解説しました。

データベースとSQLの基礎が身についたら、応用的な書き方を覚えていけばOKです。

簡単なところからでいいので、ぜひ実際にSQLを書いてみてくださいね。

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次