MySQLのサブクエリとは?代表的な3つの種類と使い方を実例付きで解説
サブクエリ(副問い合わせ)とは、一言でいえば「クエリの中に含まれるもう一つのクエリ」のことです。サブクエリを活用することで、クエリが実際に実行される時点で初めて確定する条件をもとに、動的にデータ行を抽出することができます。より厳密に定義すると、あるSELECT文の句の中に別のSELECT文を記述することを指します。さらに、サブクエリの中に別のサブクエリを入れ子にし、その中にさらにサブクエリを入れるといった多段階のネスト構造も可能です。また、サブクエリはINSERT文、UPDATE文、DELETE文の中にも組み込めます。なお、サブクエリは必ず括弧( )で囲む必要があります。
サブクエリは、単一の値を返す限りにおいて、式が許容されるほぼすべての場所で使用できます。つまり、単一の値を返すサブクエリは、FROM句の対象として指定することも可能です。これを「インラインビュー」と呼びます。FROM句内でサブクエリが使われる場合、それは仮想テーブルやビューのように扱われるためです。サブクエリは、メインクエリのFROM句、WHERE句、HAVING句のいずれにも配置できます。サブクエリ自体は「内部クエリ(INNER QUERY)」または「内部SELECT(INNER SELECT)」と呼ばれ、サブクエリを含む側のクエリは「外部クエリ(OUTER QUERY)」「外部SELECT(OUTER SELECT)」あるいは「コンテナクエリ」と呼ばれます。
それでは、サブクエリの代表的な分類を見ていきましょう。
スカラーサブクエリ
スカラーサブクエリは、1行1列のデータ、つまり単一の値だけを返すサブクエリです。スカラーサブクエリは単純なオペランドとして扱えるため、単一のカラムやリテラルが有効な場所であれば、ほぼどこでも使用できます。ここでは、次のようなデータを持つ「Cars」「Customers」「Reservations」の3つのテーブルを使って説明します。
mysql> Select * from Cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.02 sec) mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec) mysql> Select * from Reservations; +------+-------------+------------+ | ID | Customer_id | Day | +------+-------------+------------+ | 1 | 1 | 2017-12-30 | | 2 | 2 | 2017-12-28 | | 3 | 2 | 2017-12-29 | | 4 | 1 | 2017-12-25 | | 5 | 3 | 2017-12-26 | +------+-------------+------------+ 5 rows in set (0.00 sec)
スカラーサブクエリは単一の値を返すため、以下のようなクエリがスカラーサブクエリの典型例となります。
mysql> Select Name from Customers WHERE Customer_id = (Select Customer_id FROM Reservations WHERE ID = 5); +--------+ | Name | +--------+ | Gaurav | +--------+ 1 row in set (0.06 sec)
テーブルサブクエリ
テーブルサブクエリは、複数の行・複数の列を含む結果セットを返すサブクエリです。「Cars」「Customers」「Reservations」の各テーブルのデータを使用した次のクエリは、テーブルサブクエリの一例です。
mysql> Select Name from customers where Customer_id IN (SELECT DISTINCT Customer_id from reservations); +---------+ | Name | +---------+ | Rahul | | Yashpal | | Gaurav | +---------+ 3 rows in set (0.05 sec)
相関サブクエリ
相関サブクエリとは、WHERE句の中で外部クエリ(外側のクエリ)の値を参照するサブクエリのことです。外部クエリの各行に対して内部クエリが評価されるため、行ごとに異なる結果を得られるのが特徴です。「Cars」テーブルのデータを使用した次のクエリは、集計値と比較する形でサブクエリを活用した例です。
mysql> Select Name from cars WHERE Price < (SELECT AVG(Price) from Cars); +--------------+ | Name | +--------------+ | Nexa | | Maruti Swift | | Alto | | Skoda | | Ford | +--------------+ 5 rows in set (0.00 sec) mysql> Select Name from cars WHERE Price > (SELECT AVG(Price) from Cars); +--------+ | Name | +--------+ | BMW | | VOLVO | | Toyota | +--------+ 3 rows in set (0.00 sec)
このように、サブクエリを適切に使い分けることで、複雑な条件でのデータ抽出や集計結果との比較など、柔軟で高度なクエリを簡潔に記述できるようになります。
-
MySQLのBLOBデータ型とTEXTデータ型の違いとは?使い分けのポイントを解説
BLOBとTEXTの基本的な違いBLOBは「Binary Large Objects(バイナリ・ラージオブジェクト)」の略称で、その名の通りバイナリデータを格納するために使用されるデータ型です。一方、TEXTは大量の文字列を格納するためのデータ型です。BLOBはバイナリデータを扱えるため、画像・動画・音声ファイルだけでなく、実行形式のプログラムなどもそのまま保存できます。例えば、以下のような画像ファイルはバイナリデータで構成されているため、BLOB型のカラムに格納することが可能です。比較・ソートの挙動の違いBLOBとTEXTでは、データの比較やソートの方法が大きく異なります。BLOB値:バイト
-
Windowsドメインとは?仕組みと導入するメリットをわかりやすく解説
職場や学校でパソコンを使用しているなら、そのパソコンはほぼ間違いなくWindowsドメインに参加しています。しかし、「ドメインとは具体的に何を意味するのか」「ドメインにはどのような役割があるのか」「パソコンをドメインに参加させるメリットは何か」と疑問に思っている方も多いのではないでしょうか。この記事では、Windowsドメインの基本概念、仕組み、そして企業がドメインを活用する理由について詳しく解説します。Windowsドメインとは何か?Windowsドメインとは、企業環境で使用される、一元管理されたコンピューターのネットワークのことです。ネットワーク内には少なくとも1台の「ドメインコントローラ