【postgresql基礎入門】複数テーブルの結合クエリの結合と結合のマージ、交差、差分などの集合演算、両者の違い

複数テーブルデータの結合クエリ

コラムの内容

オープンソースの貢献:

個人ホームページ:私のホームページ
運営コミュニティ:オープンソースデータベース
モットー : 空が強いとき、紳士は自己向上に努め、地形が良いとき、紳士は偉大な美徳を持ちます。

一連の記事

序文

postgresql データベースは、オープン ソース データベースの商用データに匹敵する一般的なリレーショナル データであり、業界でますます人気が高まっています。

オープンソースデータベースであるため、ソースコードが公開されているだけでなく、多くのユースケースや使いやすいプラグインが用意されているため、徐々にデータベースの先駆者、標準となりつつあります。使い方から原則まで理解します。

プログラミングを学ぶなら、豊富なプログラミング知識やデータ構造、プログラミングスキルも学べ、精緻なアーキテクチャデザインや階層化されたアイデア、柔軟にカスタマイズできるアイデアも数多くあります。

このコラムでは、postgresqlの入門的な使い方やデータベースの保守・管理を中心に紹介し、これらの使い方を通してデータベースの原理を理解し、postgresqlとはどのようなデータベースなのか、何ができるのか、どのように優れた機能を提供するのかをゆっくりと理解していきます。サービス. 最も重要なことは、これらの知識がすべて面接にあるということです. 必須項目.

概要

実際のアプリケーションでデータをクエリするときは、複数のテーブルのデータを使用することがよくありますが、単一の SQL を使用して結果を取得するにはどうすればよいでしょうか?

この記事では、複数テーブル データのクエリ方法を共有し、その使用テクニックの例を示します。

原理紹介

複数テーブル データの結合クエリの場合、postgresql には 2 つの基本的な方法があります。

  • 結合接続操作。
  • ユニオンユニオンサブクエリ。

マルチテーブル結合接続では、実際には特定の列をリンクとして使用して、複数の実テーブルを 1 つの大きなテーブルに接続し、その大きなテーブルに対してクエリを実行します。

Union は join とはまったく異なります。Union は複数のサブクエリの結果を結合します。つまり、Union はクエリ結果に対して演算を実行し、複数の結果セットを 1 つの結果セットにマージし、この合計結果セットに対して 2 次クエリ処理を実行します。つまり、いくつかのタイプです
。私たちの数学における集合の

さらに要約すると、関係代数における集合の演算が含まれます。
集合演算には主に次のものが含まれます。

  1. 結合演算 (Union): 両方のセットに属するすべての要素を含めて、2 つのセットを 1 つのセットに結合します。
  2. 交差: 2 つのセットの共通要素を新しいセットに結合します。
  3. 差分操作: あるセットから別のセットに属する要素を削除し、残りの要素で新しいセットを形成します。
  4. 対称的な差異: あるセットに属しているが別のセットに属していない要素、および別のセットに属しているが一方のセットに属していない要素は、新しいセットに結合されます。
  5. デカルト積: 2 つのセットのすべての可能な順序ペアを新しいセットに結合します。

複数テーブル結合接続操作

PostgreSQL では、複数テーブルのクエリは結合 (JOIN) やクロス結合 (CROSS JOIN) などの操作を使用して実装されます。

結合操作とは、指定された条件に従って 2 つ以上のテーブルを関連付け、それらの間の関係データを取得することを指します。
例を挙げて説明します。まず、カスタムとオーダーの 2 つのテーブルを作成します。

以下はPostgreSQLを使用したJOIN操作の例です。

customersという 2 つのテーブルがあるとしますorderscustomersテーブルには顧客に関する情報が含まれており、ordersテーブルには注文に関する情報が含まれています。2 つのテーブルは、共通フィールドを通じてcustomer_id関連付けられています。

まず、これら 2 つのテーブルを作成し、データを挿入しましょう。

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(50)
);

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  total_amount DECIMAL(10,2)
);

INSERT INTO customers (customer_id, name, email)
VALUES (1, 'John Doe', '[email protected]'),
       (2, 'Jane Smith', '[email protected]'),
       (3, 'Bob Johnson', '[email protected]'),
       (4, 'Steven John', '[email protected]'),
       (5, 'Kenidy', '[email protected]');

INSERT INTO orders (order_id, customer_id, order_date, total_amount)
VALUES (1, 1, '2023-01-01', 100.00),
       (2, 1, '2023-02-01', 200.00),
       (3, 2, '2023-02-15', 150.00),
       (4, 3, '2023-03-01', 75.00);

1. 内部結合

2 つのテーブルの行を照合し、結合条件を満たす行を返します。構文は次のとおりです。

postgres=# SELECT * FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id;
 customer_id |    name     |      email       | order_id | customer_id | order_date | total_amount
-------------+-------------+------------------+----------+-------------+------------+--------------
           1 | John Doe    | john@example.com |        1 |           1 | 2023-01-01 |       100.00
           1 | John Doe    | john@example.com |        2 |           1 | 2023-02-01 |       200.00
           2 | Jane Smith  | jane@example.com |        3 |           2 | 2023-02-15 |       150.00
           3 | Bob Johnson | bob@example.com  |        4 |           3 | 2023-03-01 |        75.00
(4 rows)

*ここでは、結果セット全体を明確に確認できるように、結果セット内のすべての列を見つけるために特に使用します。結合後の結果セットは 2 つのテーブルのすべての列を結合したものであることがわかります

インライン接続の場合、接続条件を満たす行のみがリストされますが、他にどのような記述方法でこのような効果が得られるのか考えてみましょう。

なぜなら、条件は where 句に記述することもできるため、内部結合は where 条件と同等になります。

postgres=# select * from customers,orders where customers.customer_id = orders.customer_id;
 customer_id |    name     |      email       | order_id | customer_id | order_date | total_amount
-------------+-------------+------------------+----------+-------------+------------+--------------
           1 | John Doe    | [email protected] |        1 |           1 | 2023-01-01 |       100.00
           1 | John Doe    | [email protected] |        2 |           1 | 2023-02-01 |       200.00
           2 | Jane Smith  | [email protected] |        3 |           2 | 2023-02-15 |       150.00
           3 | Bob Johnson | [email protected]  |        4 |           3 | 2023-03-01 |        75.00
(4 rows)

2. 左結合

内部結合に基づいて、右側のテーブルに一致する行がない場合でも、左側のテーブルのすべての行が結果セットに含まれます。構文は次のとおりです。

postgres=# select * from customers left join orders on  customers.customer_id = orders.customer_id;
 customer_id |    name     |       email        | order_id | customer_id | order_date | total_amount
-------------+-------------+--------------------+----------+-------------+------------+--------------
           1 | John Doe    | john@example.com   |        1 |           1 | 2023-01-01 |       100.00
           1 | John Doe    | john@example.com   |        2 |           1 | 2023-02-01 |       200.00
           2 | Jane Smith  | jane@example.com   |        3 |           2 | 2023-02-15 |       150.00
           3 | Bob Johnson | bob@example.com    |        4 |           3 | 2023-03-01 |        75.00
           5 | Kenidy      | Kenidy@example.com |          |             |            |
           4 | Steven John | steven@example.com |          |             |            |
(6 rows)

左結合後の結果セットでも、列は 2 つのテーブルを結合したものですが、行数が前とは異なります。左側のテーブルにはすべての行がリストされ、右側のテーブルには条件を満たす行のみがリストされます。左側のテーブルの余分な行、右側のテーブル テーブルは空に置き換えられます。

3. 右結合

内部結合に基づいて、左側のテーブルに一致する行がない場合でも、右側のテーブルのすべての行が結果セットに含まれます。構文は次のとおりです。

postgres=# select * from customers right join orders on  customers.customer_id = orders.customer_id;
 customer_id |    name     |      email       | order_id | customer_id | order_date | total_amount
-------------+-------------+------------------+----------+-------------+------------+--------------
           1 | John Doe    | john@example.com |        1 |           1 | 2023-01-01 |       100.00
           1 | John Doe    | john@example.com |        2 |           1 | 2023-02-01 |       200.00
           2 | Jane Smith  | jane@example.com |        3 |           2 | 2023-02-15 |       150.00
           3 | Bob Johnson | bob@example.com  |        4 |           3 | 2023-03-01 |        75.00
(4 rows)

右結合は左結合と似ており、結果セットの行には右テーブルのすべての行が含まれ、左テーブルには結合テーブルの条件を満たす行のみが含まれます。

4.完全結合

これは、左結合と右結合に基づいて左結合と右結合を同時に実行し、両側のテーブルで条件を満たすすべての行を返すことと同じです。構文は次のとおりです。

postgres=# select * from customers full join orders on  customers.customer_id = orders.customer_id;
 customer_id |    name     |       email        | order_id | customer_id | order_date | total_amount
-------------+-------------+--------------------+----------+-------------+------------+--------------
           1 | John Doe    | john@example.com   |        1 |           1 | 2023-01-01 |       100.00
           1 | John Doe    | john@example.com   |        2 |           1 | 2023-02-01 |       200.00
           2 | Jane Smith  | jane@example.com   |        3 |           2 | 2023-02-15 |       150.00
           3 | Bob Johnson | bob@example.com    |        4 |           3 | 2023-03-01 |        75.00
           5 | Kenidy      | Kenidy@example.com |          |             |            |
           4 | Steven John | steven@example.com |          |             |            |
(6 rows)

完全結合には左右の行がすべて含まれ、条件を満たさない行は空白に置き換えられます。

複数テーブルのユニオン操作

PostgreSQL のユニオン クエリは、複数の SELECT ステートメントの結果を 1 つの結果セットに結合する方法です。複数のテーブルまたはクエリからデータを取得し、指定した条件に基づいてそれらを組み合わせることができます。

ユニオン クエリの基本的な構文は次のとおりです。

SELECT column1, column2, ...
FROM table1
UNION/UNION ALL/EXCEPT/INTERSECT
SELECT column1, column2, ...
FROM table2
WHERE condition;

ここにはいくつかの重要な部分があります。

  1. SELECTステートメント: 取得する列とテーブルを指定するために使用されます。
  2. UNIONUNION ALLEXCEPTおよびINTERSECT: これらのキーワードは、実行する結合演算のタイプを指定するために使用されます。
  3. WHERE句: 結果をフィルタリングするためのオプションの条件。

ユニオン型の説明

  1. UNION: 2 つのクエリ結果の和集合を返しますが、重複する行は削除されます。
  2. UNION ALL: 重複行を含む 2 つのクエリ結果の和集合を返します。
  3. EXCEPT: 最初のクエリ結果には存在するが、2 番目のクエリ結果には存在しない行を返します。
  4. INTERSECT: 両方のクエリ結果に共通する行を返します。

ユニオン クエリを使用する場合は、各クエリで選択された数値と列の型が一致していることを確認してください。一致していない場合、エラーが発生する可能性があります。

1.組合

2 つのテーブルのデータをマージし、重複する行を削除します。

postgres=# select  customer_id from customers union select customer_id from orders ;
 customer_id
-------------
           2
           3
           5
           4
           1
(5 rows)

これにより、両方のテーブルの一意の行をすべて含む結果セットが返されます。

2 つの結果セットをマージできるように、2 つの select 句の列の数と型は一貫している必要があります。

2. すべてを結合する

2 つのテーブルのデータをマージし、重複した行を保持します

重複行を含む両方のテーブルのすべての行を保持したい場合は、UNION ALL 演算子を使用できます。

postgres=# select  customer_id from customers union all select customer_id from orders ;
 customer_id
-------------
           1
           2
           3
           4
           5
           1
           1
           2
           3
(9 rows)

これにより、重複行を含む両方のテーブルのすべての行を含む結果セットが返されます。
同時に、結果を並べ替えたい場合は、

ORDER BY 句を使用できます。例えば:

postgres=# select  customer_id from customers union all select customer_id from orders order by customer_id asc;
 customer_id
-------------
           1
           1
           1
           2
           2
           3
           3
           4
           5
(9 rows)

もちろん、where などの他の句を追加することもできます。

3.除く

2 つのセットの差、つまり、前のセットには含まれるが、後のセットには含まれない行を取得します。

postgres=# select  customer_id from customers except select customer_id from orders ;
 customer_id
-------------
           5
           4
(2 rows)

つまり、まだ注文を生成していない顧客 ID のリストをクエリします。

3.交差する

INTERSECTSELECT演算子は、 2 つのステートメントの結果セットの共通部分を見つけるために使用されます。その構文は次のとおりです。

postgres=# select  customer_id from customers intersect select customer_id from orders order by customer_id asc;
 customer_id
-------------
           1
           2
           3
(3 rows)

これは内部結合に似ており、注文のある顧客 ID のリストを検索します。

要約する

同じことは、それらはすべて結果セットに対して動作するということです。

ただし、明らかな違いがあります。結合は複数のテーブルを結合して結果セットを生成し、結合された結果セットを where およびその他の条件でフィルター処理することです。一方、ユニオンはテーブル間だけでなく、異なるクエリに対しても適用されます。結果セットを実行してから実行します
。セット操作であり、最終結果の列に対する要件があります。参加する必要があるセット列の数とタイプは同じである必要があります。

終わり

応援していただき誠にありがとうございます。閲覧中は貴重なコメントを忘れずに残してください。励みになると思ったら、いいねと保存をお願いします。さらに頑張ります!

著者のメールアドレス:[email protected]
間違いや漏れがあれば、ご指摘いただき、お互いに学び合ってください。

注:許可なく転載することは禁止されています!

おすすめ

転載: blog.csdn.net/senllang/article/details/133500747