【SQL】スカラ・サブクエリを1分でわかりやすく解説

Database

SQL初心者がその単語を聞いただけで苦手意識を持ちそうなスカラ・サブクエリ(英:scalar-subquery)についてわかりやすく1分で解説します。

スカラ・サブクエリとは、取得結果が単一の値になるサブクエリのこと。

このページでは、サブクエリってそもそもなんだっけ?という点をまずは復習しつつ、スカラ・サブクエリの使い方を1から学習していきます。

このページで学べる内容
  • スカラ・サブクエリとは?
    • 【前提】サブクエリ(副問い合わせ)とは?
  • スカラ・サブクエリの利用方法:サンプルコード
  • スカラ・サブクエリの注意点

データベースエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

スカラ・サブクエリとは?

スカラ・サブクエリとは「取得結果が単一の値になるサブクエリ」です。「取得結果が単一になる」というのは、例えば以下のSQLのように結果が「1行1列」だけになります。

SELECT AVG(Math) FROM PointList;

/*結果
+-----------+
| AVG(Math) |
+-----------+
|   82.5000 |
+-----------+
*/

1レコード1カラムの結果だけが返ってくるサブクエリが、スカラ・サブクエリ

スカラ(Scalar)は「単一の」という意味の単語です。SQLだけでなく、様々なプログラミング言語でも用いられる単語なので、知らない方はこの機会に合わせてチェックしておきましょう!

【復習】サブクエリとは?

サブクエリとは、SQLの中に記述する別のSQL。言い換えると一時的なビューのようなものです。

例えば以下のSQL文はSELECT文の中にSELECT文が記述されているため、サブクエリの一例です。

SELECT * FROM (SELECT ID FROM PointList) AS Sub;

サブクエリを利用することで、以下のようなテーブルからクラスAの平均点を取得するようなことも可能になります。

サンプルテーブル
SELECT * FROM
(SELECT Class, AVG(Japanese), AVG(Math), AVG(English) FROM PointList
 GROUP BY Class)
AS Sub
WHERE Class = 'A';

/* 結果
+-------+---------------+-----------+--------------+
| Class | AVG(Japanese) | AVG(Math) | AVG(English) |
+-------+---------------+-----------+--------------+
| A     |       91.2500 |   76.2500 |      76.2500 |
+-------+---------------+-----------+--------------+
*/

参考:AVG関数/GROUP BY句

スカラ・サブクエリの使い方

スカラ・サブクエリは主にWHERE句で利用するのが一般的です。

SELECT * FROM PointList
WHERE Math > (SELECT AVG(MATH) FROM PointList);

/* 結果
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |      85 |
|  5 | 小林 | B     |       70 |   90 |    NULL |
|  6 | 山口 | B     |       90 |   85 |    NULL |
|  7 | 田中 | B     |       70 |   90 |    NULL |
|  8 | 伊藤 | B     |       70 |   90 |    NULL |
+----+------+-------+----------+------+---------+
*/

スカラ・サブクエリのSQLを単独で実行すると結果が以下の通り。

SELECT AVG(MATH) FROM PointList;

/* 結果
+-----------+
| AVG(MATH) |
+-----------+
|   82.5000 |
+-----------+
*/

したがって、スカラ・サブクエリをもし利用せずに同様のSQLを実行しようとすれば、以下のようなSQLを記述することになります。

SELECT * FROM PointList
WHERE Math > 82.5;

/* 結果
+----+------+-------+----------+------+---------+
| ID | Name | Class | Japanese | Math | English |
+----+------+-------+----------+------+---------+
|  1 | 佐藤 | A     |      100 |  100 |      85 |
|  5 | 小林 | B     |       70 |   90 |    NULL |
|  6 | 山口 | B     |       90 |   85 |    NULL |
|  7 | 田中 | B     |       70 |   90 |    NULL |
|  8 | 伊藤 | B     |       70 |   90 |    NULL |
+----+------+-------+----------+------+---------+
*/

スカラ・サブクエリを記述する場所

実はスカラ・サブクエリはWHERE句だけでなく、SELECT句HAVING句ORDER BY句など、基本的にどのような場所にでも記述することができます。

例えば、SELECT句に記載する例がこちら。

SELECT MATH, (SELECT AVG(MATH) FROM PointList)
FROM PointList;
+------+-----------------------------------+
| MATH | (SELECT AVG(MATH) FROM PointList) |
+------+-----------------------------------+
|  100 |                           82.5000 |
|   70 |                           82.5000 |
|   70 |                           82.5000 |
|   65 |                           82.5000 |
|   90 |                           82.5000 |
|   85 |                           82.5000 |
|   90 |                           82.5000 |
|   90 |                           82.5000 |
+------+-----------------------------------+

HAVING句で利用した例がこちら。

SELECT ID,Name,AVG(Math) FROM PointList
GROUP BY Class
HAVING AVG(Math) > (SELECT AVG(Math) FROM PointList WHERE Class = 'A');

/* 結果
+----+------+-----------+
| ID | Name | AVG(Math) |
+----+------+-----------+
|  5 | 小林 |   88.7500 |
+----+------+-----------+
*/

-- スカラ・サブクエリだけを単独で実行
SELECT AVG(Math) FROM PointList WHERE Class = 'A';
/* 結果
+-----------+
| AVG(Math) |
+-----------+
|   76.2500 |
+-----------+
*/

このようにスカラ・サブクエリは利用するポイントによって可能性を大きく広げることができるのです。

スカラ・サブクエリを利用する際は、決して結果が複数行であってはいけない!という点に注意しましょう。

もしスカラ・サブクエリの結果が複数行となってしまう場合は、以下のようにエラーとなります。

SELECT * FROM PointList
WHERE Math = (SELECT Math FROM PointList WHERE Class = 'A');
--ERROR 1242 (21000): Subquery returns more than 1 row
スカラ・サブクエリのまとめ
  • スカラ・サブクエリは1レコード1カラムのレコードを返すSQL。
  • SELECT句やWHERE句、ORDER BY句など、あらゆる場所に記述することが可能。

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

タイトルとURLをコピーしました