AIやビッグデータなど、近年ますます注目を浴びている技術を扱ううえで必要不可欠なSQL。基本的な文法に加えて、関数や結合といった応用をしていくことで、さらに効率よく適切な情報を取得することができるようになります。活用方法によって大きく幅の広がるSQLの応用と、その学習ロードマップについてご紹介します。
計算や処理を一瞬で解決「関数」
SQLには、計算や分析等の処理を自動で行なってくれる関数がもともと備わっています。これらを活用することで、できることの幅が一気に広がります。ここでは、特に良く使う関数を厳選してご紹介します。
集計関数
・COUNT(): 行数をカウント
使い方:
SELECT COUNT(*) FROM [テーブル名];
・SUM(): 数値の合計を計算
使い方:
SELECT SUM([カラム名]) FROM [テーブル名];
・AVG(): 数値の平均値を計算
使い方:
SELECT AVG([カラム名]) FROM [テーブル名];
・MAX():最大値を取得
使い方:
SELECT MAX([カラム名]) FROM [テーブル名];
・MIN():最小値を取得
使い方:
SELECT MIN([カラム名]) FROM [テーブル名];
日付関数
・CURRENT_DATE(): 現在の日付を取得
(例)
SELECT CURRENT_DATE();
→2024-01-01
・CURRENT_TIME():現在の時間を取得
(例)
SELECT CURRENT_TIME();
→12:34:56
・CURRENT_TIMESTAMP:現在の日付と時間を取得
(例)
SELECT CURRENT_TIMESTAMP();
→2024-01-01 12:34:56
文字列関数
・CONCAT([結合するカラム1], [結合するカラム2]):文字列を結合する
(例)
SELECT CONCAT(last_name, first_name) FROM user;
・LENGTH(‘[文字列]’):文字列の長さを調べる
(例)
SELECT LENGTH('SQL');
→3
・SUBSTRING(‘[文字列]’, [何文字目から取り出すか], [取り出す文字数]):一部の文字列を抽出する
(例)
SELECT SUBSTRING('HelloWorld', 2, 5);
→World
変換関数
・CAST([変換したいデータ] AS [変換する型]):型変換
(例)
SELECT CAST(‘2024-01-01’ AS DATE)
・COALESCE([カラム名], [NULLの場合に表示する内容]):結果がNULLの場合に指定の値を表示する
(例)
SELECT COALSECE([manager_count], 0);
【もっと自由にデータを取り出す】並べ替え
データを取り出す際に、日付順や名前順、年齢順など、より見やすい順番に並べられたら便利ですよね。それを実現するのが「ORDER」句です。
SELECT * FROM [テーブル名] ORDER BY [並べ替えるカラム名] [ASC(昇順)/DESC(降順)];
ちなみに、ORDER BYの後ろに複数の条件を「,(コンマ)」でつなげることで複数の並べ替えを指定することも可能です。
【もっと自由にデータを取り出す】テーブル結合
「ユーザーの個人情報のテーブルと、契約内容のテーブルの情報をまとめて出したい」のように、複数テーブルの内容を一度に取り出したい場面は少なくありません。そこで、複数のテーブルをまとめてから検索をかける方法があります。それが「テーブル結合」です。
それぞれのテーブルの中に「id」など、共通の情報がある場合に、それを使ってテーブルの情報をくっつけることができます。その結合の方法は2つあるので、場面に合わせて活用しましょう。
外部結合:OUTER JOIN
外部結合は、それぞれのテーブルに共通するデータをもとに取得した情報に加え、片方のテーブルにしか存在しない情報も取得します。構文は次の通りです。
SELECT [カラム名1], [カラム名2], ...,FROM [テーブル名1]
LEFT(RIGHT) OUTER JOIN [テーブル名2] ON [テーブル名1.結合の軸となるカラム名] = [テーブル名2.結合の軸となるカラム名];
また、結合時はLIGHTとREFTで結合の方向を決めることができます。
LEFT OUTER JOIN:結合時の左側のテーブルをベースに外部結合する
RIGHT OUTER JOIN:結合時の右側のテーブルをベースに外部結合する
文字を読んだだけではなかなかイメージしづらいと思うので、実際にやってみましょう。まずは、「LEFT OUTER JOIN」の例です。会社情報を管理する次のようなテーブルがあるとします。
companyテーブルの「id」とmanagerテーブルの「company_id」は連動しており、これを軸に結合を行います。
SELECT * FROM company
LEFT OUTER JOIN manager ON company.id = manager.company_id;
すると、次のような結果が返ってきます。managerテーブルにはcompany_idが4と5のデータはありませんが、条件の左側に指定したcompanyテーブルをベースに、存在しない分はnullになって表示されるのです。
次に、「RIGHT OUTER JOIN」で結合してみます。
SELECT * FROM company
RIGHT OUTER JOIN manager ON company.id = manager.company_id;
今度は、条件の右側に指定したmanagerテーブルをベースに、存在しないデータがnullとなって表示されます。
内部結合:INNER JOIN
内部結合は、それぞれのテーブルに共通するデータをもとに取得した情報のみ表示します。ベースとなるテーブルを指定する必要はないので、LIGHT/REFTの指定もありません。
SELECT [カラム名1], [カラム名2], ...,FROM [テーブル名1]
INNER JOIN [テーブル名2] ON [テーブル名1.結合の軸となるカラム名] = [テーブル名2.結合の軸となるカラム名];
では、実際に結合してみます。
SELECT * FROM company
INNER JOIN manager ON company.id = manager.company_id;
すると、次のような結果が返ってきます。
内部結合の場合、どちらのテーブルにもデータが存在し、結合の条件が一致するデータのみが表示されます。逆に、片方のテーブルにしか存在しないレコードは削除されるのです。
【もっと自由にデータを取り出す】サブクエリ(副問い合わせ)
サブクエリとはSQLの中に書くSQLのことです。「ある条件で抽出したデータをもとに、ほしいデータを取り出したい」など、少し複雑な操作をしたい場合に活躍します。これを使うと処理が重くなってしまうデメリットもありますが、SQLの柔軟性が増すというメリットがあります。場合に合わせて選びましょう。
サブクエリのもう一つのメリットは、SELECT句、FROM句、WHERE句など、どこでも書くことができる点です。今回は、学生のテスト結果を記録した下記のテーブルを使って副問い合わせをする3パターンを紹介します。
SELECT句での副問い合わせ
別のテーブルからデータを照らし合わせて持ってきてたい場合など、表示するデータの指定に使うことができます。ここでは、studentテーブルの「id」とscoreテーブルの「user_id」を照らし合わせて、点数情報であるscoreを持ってくる副問い合わせをしてみましょう。
SELECT
id,
name,
address,
(
SELECT score
FROM score
WHERE student.id = score.user_id
) AS student_score
FROM student;
かっこの中に、scoreテーブルからscoreを取り出すSQLを書きます。その際、WHERE句の条件で、「id」と「user_id」を照らし合わせています。また、「AS句」で、副問い合わせによって取り出してきたデータを表示する一次的なカラム名を任意で指定しています。
FROM句での副問い合わせ
取り出すデータをあらかじめ定義したい場合などにFROM句での副問い合わせが便利に使えます。ここでは、都道府県別のデータ数を出してから、その都道府県名と一緒にデータを表示するSQLを書いてみます。
SELECT
address,
address_count
FROM (
SELECT address, COUNT(*) AS address_count
FROM student
GROUP BY address
) AS table1;
「GROUP BY」句を使うと、同じデータをグループにまとめることができます。そこからさらに「COUNT」関数を使うことで、グループにしたデータの数を数えているのです。
WHERE句での副問い合わせ
WHERE句で副問い合わせをすると、条件の指定をより柔軟にすることができます。ここでは、scoreテーブルの「user_id」が4という条件で、2つのテーブルから情報を取り出してみます。
SELECT *
FROM student
WHERE id = (
SELECT score
FROM score
WHERE user_id = 4
);
SQLをさらに極める!学習ロードマップとおすすめの方法
SQLはパズルのように組み合わせることができ、そのやり方によって活用の幅が大きく変わってきます。ここからは、SQLをさらに使いこなせるようになるための学習ロードマップについてご紹介します。
そもそもSQLの学習には、基礎から応用へと段階的に進めることと、実際に沢山試しながら、パズルのような組み合わせを自分で考えていく実践が重要です。
1. 基礎固め:オンライン学習サービスで基本文法と簡単なクエリ作成
まずは基本的な文法を知ることから始め、簡単なクエリを作成してみましょう。基礎知識を学ぶことから簡単な実践をするのには、「Progate」などのオンラインの学習サービスがおすすめです。数時間で一通り基礎を学ぶことができます。
Progate:
https://prog-8.com/
2. 実践練習:Webブラウザ上の練習問題で応用力を養う
その後、今回ご紹介した集計関数や結合など、より高度な構文を試しながら修得していきましょう。その際に便利なのが、Webブラウザ上で解ける練習問題です。さまざまなサイトがありますが、ここでは「SQLab」をご紹介します。難易度別に豊富な問題が揃っており、使いやすい見た目と操作感で、初学者から中級、上級者誰にでもおすすめなサービスです。
SQLab:
https://sqlab.net/works/
3. 環境構築:MySQLで自分だけのデータベースを操作
さらに、SQLがある程度身についてきたら、実際にデータベースを操作するための環境を構築してみましょう。その際におすすめなのは、世界で最も普及しているオープンソースデータベース「MySQL」です。環境構築は難しくないので、是非チャレンジして、自分だけのデータベースを自由に扱ってみてください。いろいろ試してみるのが、上達への一番の近道です。
MySQL:
https://www.mysql.com/jp/
まとめ
データ分析やデータベースの操作は、ITに携わる方々にとっては欠かすことのできない技術です。様々なデータから必要な情報を効率的に取得し、ビジネスや研究に役立てるため、ぜひ本記事を参考にして、SQL学習を始めてみてください。