問題:
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
重複する行を削除します。選択は、必要な結果データによって異なります。