UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#039 1教科でも30点以下の点数を取った生徒の名前を出力する サブクエリ IN演算子

記入日:2023-02-16 編集日:2023-02-16

SQL見るだけクエリ。今回はMySQLのSQLで、サブクエリやIN演算子を使って、1教科でも30点以下の点数を取った生徒の名前を取得してみようと思います。

```sql
SELECT name FROM students 
WHERE id IN ( 
    SELECT student_id FROM scores 
    WHERE score <= 30 
)
```

この記事を読むと(約5分)
サブクエリやINの使い方がわかります。

サブクエリは複雑な処理をする場合に便利な機能で、SQL文の中にSQL文を書くことです。
サブクエリが使える場所はWHEREだけでなく、SELECTやFROMでも使えます。

IN演算子は、指定した値のリストの中に含まれるかどうかを判定する演算子です。
例えば、WHERE id IN (1, 2, 3)とすると、idが1, 2, 3のいずれかに一致するレコードを選択します。

サブクエリでは、IN演算子の後にカッコ内でSQL文を書くことで、そのSQL文の結果を値のリストとして扱うことができます。

 

この例では、まずカッコ内のSQL文を実行し、scoresテーブルからscoreが30以下のstudent_idを取得してきます。 それから、外側のSQL文を実行しstudentsテーブルからidがカッコ内で取得したstudent_idと一致するnameを出力します。

 

つまり、この例では以下のような処理をしています。

  • scoresテーブルからscoreが30以下のstudent_idを探す
  • studentsテーブルからidが上記で探したstudent_idと一致するnameを探す
  • 探したnameを出力する
 

例えば、以下のようなstudentsテーブルとscoresテーブルがあるとします。

//studentsテーブル
| id | name |
| -- | ---- |
| 1  | 太郎 |
| 2  | 花子 |
| 3  | 次郎 |

//scoresテーブル
| student_id | subject | score |
| ---------- | ------- | ----- |
| 1          | 国語    | 80    |
| 1          | 数学    | 40    |
| 2          | 国語    | 90    |
| 2          | 数学    | 20    |
| 3          | 国語    | 70    |
| 3          | 数学    | 50    |

このとき、サブクエリを使って以下のSQL文を実行すると、

```sql
SELECT name FROM students 
WHERE id IN ( 
    SELECT student_id FROM scores 
    WHERE score <= 30 
)
```

まずカッコ内のSQL文が実行されます。
このSQL文はscoresテーブルからscoreが30以下のstudent_idを取得します。
つまり、以下のような結果になります。

| student_id |
| ---------- |
|     2      |

次に外側のSQL文が実行されます。このSQL文は、
studentsテーブルからidがカッコ内で取得したstudent_idと一致するnameを出力します。
つまり、以下のような結果になります。

| name |
| ---- |
| 花子 |

以上のように、サブクエリは一つのSQL文で複数のテーブルから
必要な情報を取得することができます。

 

IN演算子は、指定された値が副問合せ、またはリスト内の値と一致するかどうかを判断します。IN演算子の前に与えられた式が、INの後ろで指定されている副問合せの実行結果のリスト、または数値式のリストと一致するものがあった場合には真を返し、一致する値がない場合には偽が返されます。

例えば、以下のようなSQL文を考えます。

```sql
SELECT * FROM products
WHERE price IN (1000, 2000, 3000);
```

このSQL文はproductsテーブルからpriceが1000, 2000, 3000のいずれかに一致するレコードを選択します。つまり、以下のような結果になります。

| id | name   | price |
| -- | ------ | ----- |
| 1  | ペン   | 1000  |
| 3  | ノート | 2000  |
| 5  | 消しゴム| 3000 |

また、以下のようなSQL文を考えます。

```sql
SELECT * FROM products
WHERE category IN (
    SELECT category FROM target
);
```

このSQL文はproductsテーブルからcategoryがtargetテーブルのcategoryと一致するレコードを選択します。つまり、以下のような結果になります。

| id | name   | price | category |
| -- | ------ | ----- | -------- |
| 1  | ペン   | 1000  | 文房具   |
| 2  | 鉛筆   | 500 | 文房具   |
| 3 | ノート | 2000 | 文房具   |

以上のように、IN演算子は複数の値と比較したいときや副問合せで得られた値と比較したいときに便利です。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。