MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでサブクエリを内部結合(INNER JOIN)に変換する方法

サブクエリを内部結合に変換する方法

理解しやすくするために、以下の2つのテーブルのデータを使用して説明します。

使用するテーブルデータ

まず、顧客情報を格納した「customers」テーブルと、予約情報を格納した「reserve」テーブルを用意します。

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 reserve;
+------+------------+
| ID   | Day        |
+------+------------+
|    1 | 2017-12-30 |
|    2 | 2017-12-28 |
|    2 | 2017-12-25 |
|    1 | 2017-12-24 |
|    3 | 2017-12-26 |
+------+------------+
5 rows in set (0.00 sec)

サブクエリによる検索例

次のサブクエリは、車を予約したことのあるすべての顧客の名前を取得するものです。

mysql> Select Name from customers WHERE customer_id IN (Select id from reserve);
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Gaurav   |
+----------+
3 rows in set (0.00 sec)

このクエリでは、WHERE句の中でIN演算子を使用し、「reserve」テーブルから返されたIDリストに「customer_id」が含まれているかどうかを判定しています。このようなサブクエリは、パフォーマンスの観点から内部結合に置き換えることが推奨される場合があります。

サブクエリを内部結合に変換する手順

以下の手順に従うことで、上記のサブクエリを内部結合に変換できます。

  • 手順1: サブクエリ内で指定されている「reserve」テーブルをFROM句に移動します。
  • 手順2: WHERE句では、customer_idカラムとサブクエリから返されたIDを比較しています。この比較を、2つのテーブルのidカラム同士の明示的な直接比較に変換します。

これにより、以下のようなクエリになります。

mysql> SELECT Name from customers, reserve WHERE customer_id = id;
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Yashpal  |
| Rahul    |
| Gaurav   |
+----------+
5 rows in set (0.00 sec)

DISTINCTキーワードで重複を除去する

上記の結果を見ると、サブクエリの結果とは異なり、同じ顧客名が複数回表示されています。これは、1人の顧客が複数回予約している場合、結合によってその分だけ行が生成されるためです。元のサブクエリと同じ結果を得るには、DISTINCTキーワードを使用して重複行を削除します。

mysql> SELECT DISTINCT name from customers,reserve WHERE customer_id = id;
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Gaurav   |
+----------+
3 rows in set (0.03 sec)

これで、サブクエリを使った場合とまったく同じ結果が得られました。なお、現代のSQLでは、暗黙的な結合構文(FROM句にカンマでテーブルを並べる方法)よりも、INNER JOINキーワードを使った明示的な結合構文が推奨されます。同じクエリは次のように書けます。

mysql> SELECT DISTINCT c.name 
FROM customers c
INNER JOIN reserve r ON c.customer_id = r.id;

明示的な結合構文を使用することで、コードの可読性が向上し、結合条件とフィルタ条件を明確に区別できるようになります。

  1. Matplotlibで数値をカラースケールに変換する方法をわかりやすく解説

    Matplotlibでは、数値データをカラースケール(カラーマップ)に変換することで、散布図などに色の濃淡として視覚的に表現できます。この記事では、数値をカラースケールに変換してプロットする具体的な手順を、サンプルコードとともに解説します。変換の手順numpyを使用して、x・y・c の3つのデータポイントを作成します。作成したデータポイントをPandasのデータフレームに変換します。subplots()メソッドを使って、新しい図を作成(または既存の図をアクティブ化)します。hotカラーマップを取得します。データを線形に正規化するために、Normalize()クラスを使用します。x・yのデータポ

  2. 【Python入門】文字のリストを文字列に変換する方法

    Pythonのjoin()メソッドとは Pythonには、リストやタプルなどのシーケンスオブジェクトの要素を連結して1つの文字列を返す、組み込みのjoin()メソッドが用意されています。join()は、呼び出し元の文字列を「区切り文字」として要素間に挿入しながら連結を行います。そのため、区切り文字なしで単純に連結したい場合は、空文字列()に対してjoin()を呼び出します。 基本的な使い方:区切り文字なしで連結する 以下の例では、文字のリスト [h, e, l, l, o] を空文字列で連結し、「hello」という1つの文字列に変換しています。 >>> lst=[h,e,l