問題:
SQLの2つのテーブルの(同様のデータ型の)特定の列のデータを表示したい。
例:
データベースには2つのテーブルがあります:employee およびcustomer 。
employee テーブルには、次の列のデータが含まれています: id 、 first_name 、 last_name 、および年齢 。
| id | first_name | last_name | 年齢 |
|---|---|---|---|
| 1 | トム | ミラー | 22 |
| 2 | ジョン | 26 | |
| 3 | リサ | ウィリアムズ | 30 |
| 4 | 21 | ||
| 5 | ジェームズ | ムーア | 22 |
customer テーブルには、次の列のデータが含まれています: id 、 first_name 、 last_name 、および年齢 。
| id | first_name | last_name | 年齢 |
|---|---|---|---|
| 1 | ミラノ | 45 | |
| 2 | 21 | ||
| 3 | マーク | バッカー | 19 |
1つの結果セットで、データベース内のすべての人(従業員と顧客の両方)の名、名前、年齢を表示しましょう。
ソリューション1:
UNION ALLを使用します 2つのテーブルの列のデータを結合します。
作成するクエリは次のとおりです。
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
結果は次のとおりです。
| first_name | last_name | 年齢 |
|---|---|---|
| トム | ミラー | 22 |
| ジョン | スミス | 26 |
| リサ | ウィリアムズ | 30 |
| チャールズ | デイビス | 21 |
| ジェームズ | ムーア | 28 |
| ミラノ | スミス | 45 |
| チャールズ | デイビス | 21 |
| マーク | バッカー | 19 |
ディスカッション:
UNION ALL句を使用して、2つ以上のテーブルの列のデータを結合します。この例では、employee およびcustomer テーブル。 UNION ALLキーワードの左側に、最初のSELECTステートメントを配置して、最初のテーブル(この例ではテーブルemployee )。右側では、別のSELECTステートメントを使用して、2番目のテーブル(この例では、customer )。
両方のテーブルで選択したデータは、各列で同じデータ型である必要があることに注意してください。たとえば、最初のSELECTの最初の列が文字列データ型である場合、2番目のSELECTの最初の列も文字列データ型である必要があります。最初のSELECTステートメントの2番目の列が整数の場合、2番目のテーブルの2番目の列も整数型である必要があります。
最初のクエリでは、3番目の列に年齢(整数データ型である従業員の年齢)を選択しました。したがって、2番目のSELECTの3番目の列も整数値です。 年齢です 顧客の。
両方のSELECTステートメントの2番目の列は、同じデータ型です。ただし、両方のテーブルで値が同じである場合、それらは複数回表示されます。たとえば、「CharlesDavis21」は結果セットに2回表示されます。
結果テーブルに複数の同一のレコードが必要ない場合はどうなりますか?この場合、UNIONを使用します 。 UNION ALLに似ています 、ただし、重複するレコードは削除されます。次の例を見てください。
ソリューション2:
レコードの重複を回避するクエリは次のとおりです。
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
上記のクエリの結果は次のとおりです。
| first_name | last_name |
|---|---|
| マーク | バッカー |
| ジェームズ | ムーア |
| ジョン | |
| ミラノ | スミス |
| トム | ミラー |
| リサ | ウィリアムズ |
注:
UNION ALL UNIONよりも高速です 、ただしUNION 重複する行を削除します。選択は、必要な結果データによって異なります。