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を書いてみてくださいね。