MySQL における UNION と UNION ALL の基本的な使い方

MySQL における UNION と UNION ALL の基本的な使い方

データベースでは、UNION キーワードと UNION ALL キーワードの両方が 2 つの結果セットを 1 つにマージしますが、使用方法と効率の点で 2 つは異なります。

MySQL の UNION

UNION はテーブルをリンクした後に重複レコードを除外します。そのため、テーブルがリンクされた後、結果セットがソートされ、重複レコードが削除されてから結果が返されます。実際には、ほとんどのアプリケーションでは重複レコードは生成されません。最も一般的なのは、プロセス テーブルと履歴テーブルの UNION です。のように:

gc_dfys から * を選択 ls_jg_dfy​​s から * を選択

この SQL を実行すると、まず 2 つのテーブルの結果が取得され、次にソート スペースを使用して重複レコードがソートおよび削除され、最後に結果セットが返されます。テーブル内のデータ量が多い場合は、ディスク ソートが行われる場合があります。

MySQL の UNION ALL

UNION ALL は、2 つの結果を単純に結合して返します。この方法では、返された 2 つの結果セットに重複データがある場合、返された結果セットには重複データが含まれます。

効率の面では、UNION ALL は UNION よりもはるかに高速なので、2 つのマージされた結果セットに重複データが含まれていないことを確認できる場合は、次のように UNION ALL を使用します。

gc_dfys から * を選択 すべて ls_jg_dfy​​s から * を選択

UNION を使用すると、結果セット全体に DISTINCT を使用した場合と同様に、返されるすべての行は一意になります。複数テーブルのクエリ結果にまったく同じデータがある場合、MySQL は重複を自動的に削除します。

Union all を使用すると、重複を削除せずにすべての行が返されます。

ORDER BY 句または LIMIT 句を使用して UNION 結果全体を並べ替えたり制限したりする場合は、個々の SELECT ステートメントを括弧で囲み、最後のステートメントの後に ORDER BY 句または LIMIT 句を配置する必要があります。

(a=10 かつ B=1 の場合、tbl_name から a を選択) 
連合
(a=11 かつ B=2 の場合、tbl_name から a を選択)
制限10で注文します。

これを行うのは少し面倒です:

(からユーザーIDを選択
testa からユーザー ID を選択 union all testb からユーザー ID を選択 t 
ユーザーID制限0,1で並べ替え。

条項の中で。 order by は limit と一緒に使用した場合にのみ意味を持ちます。一緒に使用しない場合は、最適化中にパーサーによって削除されます。

それでもグループ化して条件を設定する場合は、次のようにします。

select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;

注意: ユニオン括弧の後にエイリアスが必要です。そうでない場合はエラーが報告されます。

もちろん、複数の結合テーブルのデータ量が大きい場合は、まずテキストをエクスポートしてからスクリプトで実行することをお勧めします。

純粋な SQL が使用されるため、効率は比較的低く、一時ファイルが書き込まれます。ディスク容量が十分でない場合は、エラーが発生する可能性があります。

ファイル '/tmp/MYLsivgK' の書き込みエラー (エラーコード: 28)

例:

存在する場合はテーブルを削除します `ta`;
テーブル `ta` を作成します (
 `id` varchar(255) デフォルト NULL,
 `num` int(11) デフォルト NULL
)ENGINE=InnoDB デフォルト文字セット=utf8;
 
-- ----------------------------
-- 彼の記録
-- ----------------------------
`ta` VALUES ('a', '5') に INSERT します。
`ta` VALUES ('b', '10') に INSERT します。
`ta` VALUES ('c', '15') に INSERT します。
`ta` VALUES ('d', '10') に INSERT します。
 
-- ----------------------------
-- `tb` のテーブル構造
-- ----------------------------
`tb` が存在する場合はテーブルを削除します。
テーブル `tb` を作成します (
 `id` varchar(255) デフォルト NULL,
 `num` int(11) デフォルト NULL
)ENGINE=InnoDB デフォルト文字セット=utf8;
 
-- ----------------------------
-- 結核の記録
-- ----------------------------
`tb` VALUES ('b', '5') に挿入します。
`tb` VALUES ('c', '15') に挿入します。
`tb` VALUES ('d', '20') に挿入します。
`tb` VALUES ('e', '99') に挿入します。

このとき、ta tbに対応するcフィールドのnumは同じである

SQL: 構文:

SELECT id,SUM(num) FROM (
  taから*を選択
    ユニオンオール
  SELECT * FROM tb) を tmp として
  GROUP BY ID による

実行結果:

のように:

SELECT id,SUM(num) FROM (
  taから*を選択
    連合
  SELECT * FROM tb) を tmp として
  GROUP BY ID による

実行結果:

UNION を使用すると、結果セット全体に DISTINCT を使用した場合と同様に、返されるすべての行は一意になります。複数テーブルのクエリ結果にまったく同じデータがある場合、MySQL は重複を自動的に削除します。

Union all を使用すると、重複を削除せずにすべての行が返されます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQLのunion allとunionの違いを簡単に理解する
  • MySQL の union と union all の簡単な分析
  • MySQLにおけるUNIONの使い方の詳細な説明
  • union (all) と limit および exists キーワードの使用法を理解するための MySQL シリーズチュートリアル

<<:  Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

>>:  Ubuntu 18.04 に Anaconda3 をインストールするための詳細なチュートリアル

推薦する

カルーセル効果を実現するための純粋なjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

JSON.stringify の簡易版の実装とその 6 つの主要機能の詳細な説明

目次序文JSON.stringify の 6 つの機能特集1特集2特集3特集4特集5特集6手動で文字...

tomcatでcatalina.outログをカットする3つの方法の詳細な説明

1. ログセグメンテーションのためのLog4j 1) log4j-1.2.17.jar、tomcat...

Nginx プロキシ転送構成を通じてクロスドメイン API プロキシ転送を実装する方法

序文WEB 開発では、クロスドメイン リクエストが頻繁に発生します。クロスドメインの問題を解決する方...

Webデザインチュートリアル(2):模倣と盗作について

<br />前回の記事では、Webデザインの手順と方法を紹介しました。詳細については、前...

Vue で lodop 印刷コントロールを使用してブラウザ互換の印刷を実現する方法

序文このコントロールを直接印刷すると下部に透かしが入りますが、公式 Web サイトから購入することで...

JavaScriptは、マウスが通過したときにドロップダウンボックスを表示するように実装します。

この記事では、マウスがドロップダウンボックスの上を通過するときにドロップダウンボックスを表示するため...

ラムダ式の原則と例

ラムダ式ラムダ式 (クロージャとも呼ばれる) は、Java 8 のリリースを推進した最も重要な新機能...

Vue が DingTalk の出勤カレンダーを実装

この記事では、DingTalkの勤怠カレンダーを実装するためのVueの具体的なコードを参考までに共有...

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

Linux での MySQL 5.7.18 バイナリ パッケージのインストール チュートリアル (デフォルトの構成ファイル my_default.cnf なし)

現在、MySQL を学習中です。私は完全な初心者で、Linux についてはあまり知りません。今後の作...

MySQL 8.0 WITH クエリの詳細

目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...

CSS スティッキー配置位置の詳細な説明: スティッキー問題の落とし穴

前書き: position:sticky は CSS ポジショニングの新しい属性です。相対ポジショニ...

Vue ローカルコンポーネントデータ共有 Vue.observable() の使用

コンポーネントが詳細になるにつれて、複数のコンポーネントが状態を共有する状況に遭遇するでしょう。Vu...