SQL: サブクエリと JOIN

Dec 19 2022
サブクエリと結合は、データベースを管理および操作するための標準プログラミング言語である SQL の 2 つの重要な概念です。このブログでは、サブクエリと結合とは何か、それらの違い、SQL クエリでそれぞれをいつ使用するかについて説明します。

サブクエリと結合は、データベースを管理および操作するための標準プログラミング言語である SQL の 2 つの重要な概念です。このブログでは、サブクエリと結合とは何か、それらの違い、SQL クエリでそれぞれをいつ使用するかについて説明します。

サブクエリとは

サブクエリは、クエリ内のクエリです。これは、別の SELECT、INSERT、UPDATE、または DELETE ステートメント内、または CREATE VIEW ステートメント内に SELECT ステートメントをネストする方法です。サブクエリを使用して、次のようなさまざまなタスクを実行できます。

  • 条件に基づく行のフィルタリング
  • 外部クエリで使用する値の計算
  • 外部クエリの一部として単一の値または複数の値を返す

結合は、関連する列に基づいて 2 つ以上のテーブルの行を結合する方法です。結合には、INNER JOIN、OUTER JOIN、CROSS JOIN など、いくつかの種類があります。

INNER JOIN は、結合条件に一致する行のみを返します。

OUTER JOIN は、結合条件に一致しないものを含め、両方のテーブルからすべての行を返します。外部結合には、LEFT JOIN と RIGHT JOIN の 2 種類があります。LEFT JOIN は、左側のテーブル (クエリの最初のテーブル) からすべての行を返し、右側のテーブルから一致するすべての行を返します。RIGHT JOIN は、右側のテーブル (クエリの 2 番目のテーブル) からすべての行を返し、左側のテーブルから一致するすべての行を返します。

CROSS JOIN は、2 つのテーブルのデカルト積を返します。これは、両方のテーブルのすべての行の組み合わせです。

実際の例:

このシナリオでは、Hogwarts データベースがあり、次のテーブルが以下にリストされています。

  • course_table: このテーブルにはコース名に関するデータが含まれ、一意の主キーを使用して識別されます
  • student_table: このテーブルには、一意の主キーで識別される学生名に関するデータが含まれています
  • registration_table: このテーブルは、学生とコースの間の関係を確立する JOIN テーブルです。学生がコースに登録するたびに、新しいレコードが作成されます。course_id は、course_table からコースを識別するための外部キーであり、student_id は、student_table から学生を識別するための外部キーです。
  • course: 
    +─────+────────────────────────────────+
    | id  | course                         |
    +─────+────────────────────────────────+
    | 1   | Defense against the dark arts  | 
    | 2   | Potions                        | 
    | 3   | History of magic               | 
    +─────+────────────────────────────────+
    
    
    student:
    +─────+────────────────────────────────+
    | id  | student                        |
    +─────+────────────────────────────────+
    | 1   | Harry Potter                   | 
    | 2   | Hermione Granger               | 
    | 3   | Ron Weasly                     |
    | 4   | Voldemort                      |   
    | 5   | Draco Malfoy                   |
    +─────+────────────────────────────────+
    
    enrollment:
    +─────+────────────+─────────────+
    | id  | course_id  | student_id  | 
    +─────+────────────+─────────────+
    | 1   | 1          | 1           | 
    | 2   | 2          | 1           |  
    | 3   | 3          | 2           |  
    | 4   | 2          | 3           | 
    | 5   | 3          | 4           | 
    | 6   | 1          | 5           |
    | 7   | 3          | 1           |   
    | 8   | 1          | 4           |  
    +─────+────────────+─────────────+
    
    
    

以下に、サブクエリ アプローチの例を示します。

SELECT * FROM enrollment
WHERE enrollment.course_id IN (SELECT * FROM courses WHERE course_id = 1);

加入

以下は、結合アプローチです。

SELECT * FROM course AS c 
  LEFT JOIN enrollment AS e ON c.id = e.course_id
WHERE e.course_id = 1

サブクエリと結合を使用する場合

サブクエリと結合はどちらも、複数のテーブルからデータを取得するために使用できますが、ユース ケースが異なります。サブクエリは通常、外部クエリの WHERE または HAVING 句で内部クエリの結果を使用する場合に使用されます。また、外部クエリの一部として単一の値または複数の値を返したい場合にも役立ちます。

結合は通常、関連する列に基づいて複数のテーブルからデータを取得する場合に使用されます。また、結合条件に一致しないものを含め、両方のテーブルからすべての行を返したい場合にも役立ちます。

一般に、少数の行のみを返す必要がある場合はサブクエリがより効率的である傾向があり、多数の行を返す必要がある場合は結合がより効率的です。ただし、この 2 つのパフォーマンスの違いは、テーブルのサイズとクエリの複雑さによって異なります。

結論として、サブクエリと結合は、SQL で複数のテーブルからデータを取得するための 2 つの重要なツールです。サブクエリは、行をフィルタリングし、外部クエリの一部として値を返すのに役立ちますが、結合は、関連する列に基づいて複数のテーブルの行を結合するのに役立ちます。どちらも同様の目的を達成するために使用できますが、どちらを使用するかは、クエリの特定の要件によって異なります。