EXCEPT、NOT EXISTS、FULL OUTER JOIN:データ比較のためのSQLクエリ
SQLクエリを使用して2つのテーブルの違いを返す
前提条件
このガイドを理解するには、以下の知識が必要です。
- SQLの基本的な構文
- 2つのテーブルの構造 (列名、データ型など)
方法
2つのテーブルの違いを返すには、以下の3つの方法があります。
EXCEPT演算子は、2つのテーブルの行を比較し、一方のテーブルにのみ存在する行を返します。
SELECT *
FROM table1
EXCEPT
SELECT *
FROM table2;
このクエリは、table1
に存在するが table2
には存在しないすべての行を返します。
NOT EXISTS条件は、あるテーブルに存在しない行を返すために使用できます。
SELECT *
FROM table1
WHERE NOT EXISTS (
SELECT *
FROM table2
WHERE table1.column1 = table2.column1
);
このクエリは、table1
の column1
の値が table2
の column1
の値と一致しないすべての行を返します。
FULL OUTER JOINは、2つのテーブルのすべての行を返し、一致する行だけでなく、一致しない行も返します。
SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.column1 = table2.column1
WHERE table1.column2 IS NULL OR table2.column2 IS NULL;
このクエリは、table1
または table2
のいずれかで column2
の値が NULL であるすべての行を返します。
例
以下の例では、customers
テーブルと orders
テーブルの違いを返します。
customers テーブル:
| customer_id | name |
|---|---|
| 1 | John Doe |
| 2 | Jane Doe |
| 3 | Peter Smith |
orders テーブル:
| order_id | customer_id | product |
|---|---|---|
| 1 | 1 | Product A |
| 2 | 2 | Product B |
| 3 | 3 | Product C |
EXCEPT演算子を使用する
SELECT *
FROM customers
EXCEPT
SELECT *
FROM orders;
このクエリは、customers
テーブルにのみ存在する行を返します。
| customer_id | name |
|---|---|
| 3 | Peter Smith |
NOT EXISTS条件を使用する
SELECT *
FROM customers
WHERE NOT EXISTS (
SELECT *
FROM orders
WHERE customers.customer_id = orders.customer_id
);
このクエリは、orders
テーブルに注文していない顧客を返します。
| customer_id | name |
|---|---|
| 3 | Peter Smith |
FULL OUTER JOINを使用する
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id
WHERE customers.column2 IS NULL OR orders.column2 IS NULL;
| customer_id | name | order_id | product |
|---|---|---|---|
| 1 | John Doe | 1 | Product A |
| 2 | Jane Doe | 2 | Product B |
| 3 | Peter Smith | NULL | NULL |
このガイドでは、SQLクエリを使用して2つのテーブルの違いを返す3つの方法について説明しました。
CREATE TABLE customers (
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (customer_id)
);
INSERT INTO customers (name) VALUES ('John Doe'), ('Jane Doe'), ('Peter Smith');
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
customer_id INT NOT NULL,
product VARCHAR(255) NOT NULL,
PRIMARY KEY (order_id),
FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);
INSERT INTO orders (customer_id, product) VALUES (1, 'Product A'), (2, 'Product B'), (3, 'Product C');
SELECT *
FROM customers
EXCEPT
SELECT *
FROM orders;
| customer_id | name |
|---|---|
| 3 | Peter Smith |
SELECT *
FROM customers
WHERE NOT EXISTS (
SELECT *
FROM orders
WHERE customers.customer_id = orders.customer_id
);
| customer_id | name |
|---|---|
| 3 | Peter Smith |
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id
WHERE customers.column2 IS NULL OR orders.column2 IS NULL;
| customer_id | name | order_id | product |
|---|---|---|---|
| 1 | John Doe | 1 | Product A |
| 2 | Jane Doe | 2 | Product B |
| 3 | Peter Smith | NULL | NULL |
このサンプルコードは、基本的な例です。
実際の要件に合わせて、クエリを変更する必要があります。
2つのテーブルの違いを返すその他の方法
UNION ALL演算子は、2つのテーブルのすべての行を結合し、重複行を削除します。
SELECT *
FROM table1
UNION ALL
SELECT *
FROM table2;
INTERSECT演算子は、2つのテーブルに共通する行のみを返します。
SELECT *
FROM table1
INTERSECT
SELECT *
FROM table2;
SELECT *
FROM table1
MINUS
SELECT *
FROM table2;
sql sql-server sql-server-2008