サブクエリはテーブルを返します

そして最後の 3 番目のオプションは、サブクエリがテーブル全体を返す場合です。これが最も一般的なオプションです。

特定のテーブルを少し調整したい場合がよくあります。そして、修正されたテーブルを (JOIN ON 演算子を使用して) 別のテーブルと結合するだけです。

2 つのテーブルを JOIN で結合する最も単純なケースから始めましょう。

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

そして、おそらく覚えていると思いますが、タスクテーブルには誰にも割り当てられていないタスクがあります。employee_idはNULLです。

修正されたテーブルを生成して、ハングしているすべてのタスクをディレクター (ID = 4) に割り当ててみましょう。

これを行うには、 IFNULL()関数を使用します。

SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 

そして、このクエリの結果は次のようになります。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01
2 2 バックエンドのバグを修正 2022-06-15
3 5 コーヒーを買う 2022-07-01
4 5 コーヒーを買う 2022-08-01
5 5 コーヒーを買う 2022-09-01
6 4 オフィスを掃除する (ヌル)
7 4 人生を楽しむ (ヌル)
8 6 人生を楽しむ (ヌル)

修正されたセルは赤色でマークされます。

次に、修正したテーブルをクエリに代入してみましょう。

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

タスクテーブルの代わりに。

このようなリクエストは次のようになります。

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
 	FROM task 
) t ON e.id = t.emploee_id

taskという単語の代わりに括弧を書き、その中にリクエストの本文を配置しました。

ちなみに、ネストされたクエリのエイリアス t (エイリアス) は非常に便利でした。ネストされたクエリは、テーブルとは異なり、独自の名前を持たないため、エイリアスは非常に場違いになります。

そして、そのようなクエリの結果は次のとおりです。

ID 名前 職業 給料 参加日 ID 従業員ID 名前
1 イワノフ・イワン プログラマー 100000 25 2012-06-30 1 1 フロントエンドのバグを修正
2 ペトロフ・ペトル プログラマー 80000 23 2013-08-12 2 2 バックエンドのバグを修正
4 ラビノビッチ・モイシャ 監督 200000 35 2015-05-12 6 4 オフィスを掃除する
4 ラビノビッチ・モイシャ 監督 200000 35 2015-05-12 7 4 人生を楽しむ
5 キリエンコ・アナスタシア 事務長 40000 25 2015-10-10 4 5 コーヒーを買う
5 キリエンコ・アナスタシア 事務長 40000 25 2015-10-10 5 5 コーヒーを買う
5 キリエンコ・アナスタシア 事務長 40000 25 2015-10-10 3 5 コーヒーを買う
6 バスカ 1000 3 2018-11-11 8 6 人生を楽しむ

私たちのディレクターには「オフィスを掃除する」という仕事があります。彼はそれを委任する人をすぐに見つけると思います :) WITH 演算子を使用する

ちなみに、MySQL バージョン 8 以降では、すべてのサブクエリを最終クエリ内に直接配置する必要がなくなりました。これらは個別に実行できます。このために、WITH ステートメントが使用されます。

これにより、仮想テーブル (名前付きクエリ) を作成でき、その外観はテンプレートによって与えられます。

WITH Name AS (request) 

サブクエリには、COUNT(*) など、一意の名前が割り当てられていない名前のない列が含まれることがよくあります。この場合、WITH ステートメントには、サブクエリの新しい列名を指定するオプションがあります。

2 番目の形式はテンプレートによって与えられます。

WITH Name(column1, column2, …) AS (request) 

必要な数の仮想テーブル (名前付きクエリ) を使用し、テーブル内で相互に参照できます。リクエストの一般的な形式は次のようになります。

WITH name1 AS (request1),  
       	name2 AS (request2), 
       	name3 AS (request3) 
SELECT * FROM name1 JOIN name2 ON

では、恐ろしいクエリを見てみましょう。

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline 
 	FROM task 
) t ON e.id = t.emploee_id  

そして、WITH ステートメントを使用してこれを書き換えます。

WITH task2(id, employee_id, name, deadline) 
   AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id

または、列名を省略することもできますが、その場合は IFNULL() 関数のエイリアスを指定する必要があります。

WITH task2 AS ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 
) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id