Developer

【SQL基礎】単一行副問い合わせ
2021.02.28
Lv1

【SQL基礎】単一行副問い合わせ

単一行副問い合わせ


前回副問い合わせについて説明しましたので、今回は単一行副問い合わせの動作を確認していきましょう。

単一行副問い合わせとは1レコードだけを外側の主問い合わせに返す副問い合わせのことです。

基本的な単一行副問い合わせの書き方は以下の通りです。

SELECT カラム名1,カラム名2, …

FROM テーブル名

WHERE カラム名 = ( SELECT カラム名 FROM テーブル名 [WHERE 条件式])

赤字の部分が副問い合わせです。クエリ実行の際はまず副問い合わせの部分が行われ値が抽出されます。

次に主問い合わせが行われ副問い合わせから返された値と等しい値を持つレコードが選択されます。

上記では副問い合わせと主問い合わせを「=」で結んでいますが、他にも以下の演算子が使用できます。

= 等しい
小さい
大きい
<= 以下
>= 以上
<>, != 等しくない

複数のレコードを扱う場合は次の記事でご紹介する複数行副問い合わせを使用します。

 

では実際に副問い合わせをやってみましょう。

今回は以下のテーブル(テーブル名:teachers)を使用します。

SELECT句内で使用する副問い合わせ


SELECT句で副問い合わせを利用する場合、副問い合わせの結果をメインクエリの結果として表示させることができます。単一のSELECT文ではグループ化された結果と全体の結果を同時に表示できませんが、副問い合わせを利用すると異なる値を同時に取得できます。例えば、以下の例ではそれぞれの点数と全体の平均点を表示しています。


SELECT name ,score,(SELECT AVG(score) FROM teachers)

FROM teachers

GROUP BY name ;

WHERE句内で使用する副問い合わせ


下記の例の場合、WHERE句の「(SELECT AVG(score)FROM teachers )」という箇所が副問い合わせになります。また、演算子を使用する副問い合わせは返す値は1フィールドまでのため、それ以上のフィールドや何も返す値が無い場合はエラーとなります。WHERE句の中の副問い合わせは、AVG関数を使ってteachersテーブルの中の平均点数を算出しています。その結果をWHERE句で受け取り、scoreレコードの平均点数を出力しています。


SELECT *

FROM teachers

WHERE score > (SELECT AVG(score)FROM teachers ) ;

FROM句内で使用する副問い合わせ


FROM句の副問い合わせは、その副問い合わせの結果をテーブルとして渡します。

下記SQLは、teachersテーブルから平均年齢とその年齢に該当する人を抽出しています。

このようにFROM句内で副問い合わせを用いると、その結果をテーブルのように使用することができます。


SELECT age, age_count

FROM (SELECT age, COUNT(age) as age_count

      FROM teachers

      GROUP BY age) as s1 ;

HAVING句内で使用する副問い合わせ


HAVING句にも副問い合わせを利用することができます。

使用方法はWHERE句での副問い合わせと同じです。


SELECT name, AVG(score)as avg_score 

FROM teachers

GROUP BY name

HAVING avg_score >= (SELECT AVG(score) FROM teachers) ;

分割すると理解しやすいので、まずSELECT句だけのクエリを実行してみましょう。


SELECT name, AVG(score)as avg_score 

FROM teachers

GROUP BY name;

クエリ実行後の出力結果は、名前ごとの点数です。ここでは点数が50~90まであることがわかります。

次に副問い合わせの部分だけを実行してみましょう。


SELECT AVG(score) FROM teachers ;

これで全体の平均点数を算出できました。

最初のクエリはこの2つのクエリを1つにまとめて、「平均点と同じかそれ以上の点数をもつ人を選択」というクエリを実行したわけです。

そのため70点以上に該当するタロウ、ナオキ、イチローが抽出されました。

今回の学習ポイント


・主問い合わせと副問い合わせは比較演算子で結ぶことができる。

・単一行副問い合わせでは、複数のレコードを返す場合はエラーとなる。

 

練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。

以下からダウンロード可能です。

以下のようにしてworldcup2014データベースを作成し、インポートしてください。

※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.sql

[sql]

CREATE DATABASE worldcup2014;

USE worldcup2014;

Source C</span>/worldcup2014.sql

[/sql]

 

  1. 副問い合わせを使って全体の平均身長と各ポジションの平均身長を抽出する。
答え
[sql]

<SELECT position,height,(SELECT AVG(height)FROM players) as avg_height

FROM players

GROUP BY position ;

[/sql]

以上、単一行副問い合わせについてでした。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ