SQL初心者がその単語を聞いただけで苦手意識を持ちそうなスカラ・サブクエリ(英:scalar-subquery)についてわかりやすく1分で解説します。
スカラ・サブクエリとは、取得結果が単一の値になるサブクエリのこと。
このページでは、サブクエリってそもそもなんだっけ?という点をまずは復習しつつ、スカラ・サブクエリの使い方を1から学習していきます。
データベースエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
SQL文の基本ルール(大文字/小文字の区別、コメントの付与など)を始めに学んでおきたい方は以下の記事を先にご覧ください。
スカラ・サブクエリとは?
スカラ・サブクエリとは「取得結果が単一の値になるサブクエリ」です。「取得結果が単一になる」というのは、例えば以下のSQLのように結果が「1行1列」だけになります。
SELECT AVG(Math) FROM PointList; /*結果 +-----------+ | AVG(Math) | +-----------+ | 82.5000 | +-----------+ */
スカラ(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 | +-------+---------------+-----------+--------------+ */
サブクエリの基本については以下の記事で詳しく解説しております。
サブクエリがいまいちよく理解できていない・・・という方はご確認ください。
スカラ・サブクエリの使い方
スカラ・サブクエリは主に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 | +-----------+ */
このようにスカラ・サブクエリは利用するポイントによって可能性を大きく広げることができるのです。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。
システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。