サブクエリとは 〜実際に叩いてみた〜

はじめに

この記事はクエリについて学習を始めたばかりの人を対象に、
サブクエリとは何なのかイメージをつけてもらうためのものになります。

そもそもクエリとは

クエリとは、SQLと呼ばれるデータベースを操作するための言語を使って、
データベースへの具体的な処理・命令のことです。

イメージとしてはこんな感じ↓

この操作・処理にあたる部分がクエリです。
そしてクエリには操作パターンがいくつかあり、以下のようになっています。

  • SELECT: 検索
  • UPDATE: 更新
  • DELETE: 削除
  • INSERT: 挿入

さらにクエリについて詳しく知りたい方は以下のようなサイトを参考にしてみてください。

サブクエリとは

そして本題のサブクエリついてご説明します。
これは簡単にいうとクエリ内のクエリのこと、もしくはそれを利用したSQLのことです。

イメージ図

図のとおり、黄色の部分がサブクエリです。
そしてパターンとしては以下の様ものがあります。

  • FROM句
  • WHERE句

FROM句パターンの例

SELECT * FROM (SELECT * FROM users WHERE id BETWEEN 1 AND 10) AS A_T WHERE A_T.name_kana LIKE "さとう%";

FROM句の()の中がサブクエリです
usersテーブルのIDが1〜10の値をサブクエリで抽出し、そこからname_kanaカラムに「さとう」と含まれている物をさらに絞り込むという内容のクエリになります。

サブクエリのメリット
サブクエリをつかうことにより以下のようなメリットがあります。

  • 本来なら複数クエリなどを使って表示する内容を1つのクエリで表示することができる
  • 複雑な結合や集合処理を行わずにクエリを記述できる

実際にサブクエリを叩いてみた

環境

DB:
 MySQL
DB_GUIツール:
 DBerver バージョン7.0.5

データ紹介

テーブル構造はこんな感じ
スクリーンショット 2020-06-28 23.53.19.png

usersテーブル

messagesテーブル

groupsテーブル

FROM句パターン

シナリオ
messageテーブルのimagesカラムの値がnullでないものから、user_idが1のものを取得します。

SQL

SELECT * FROM (select * FROM messages WHERE image IS NOT NULL) AS A_T 
WHERE A_T.user_id = 1

結果(DBeaver)
user_idが1でかつ、imageがnullでないものが取得できています。

WHERE句のパターン

シナリオ
messagesテーブルのimagesカラムがnullでないレコードのuser_idカラムの値を条件に、
userテーブルから値を取得します。

SQL

SELECT * FROM  users 
WHERE id in (select user_id FROM messages WHERE image IS NOT NULL)

結果(DBeaver)
取得結果
このように別のテーブルから取得した値を条件にすることもできます。

おわりに

  • サブクエリはクエリ内のクエリのこと
  • いくつかパターンがあり、FROM句やWHERE句の中で使われる
  • 別のテーブルの値を条件にし、より詳細な処理が可能