MySQL が UNION を使用して 2 つのクエリを接続できない理由の詳細な説明

MySQL が UNION を使用して 2 つのクエリを接続できない理由の詳細な説明

概要

連合

接続データセットキーワードは、2つのクエリ結果セットを1つに連結し、同一のレコードを除外することができます。

ユニオンオール

接続データセット キーワードを使用すると、同一のレコードを除外せずに、2 つのクエリ結果セットを 1 つに連結できます。

本日、依頼を受けてUNIONを使ってクエリを実行したところ、2つのクエリをそれぞれORDER BYを使って連結するとうまく並び替えられないことが分かりました。色々と苦労したので記録しておきます。

テーブル構造とデータ

-- テーブルを作成する CREATE TABLE test_user (
 ID int(11) NOT NULL AUTO_INCREMENT、
 USER_ID int(11) DEFAULT NULL COMMENT 'ユーザーアカウント',
 USER_NAME varchar(255) DEFAULT NULL COMMENT 'ユーザー名',
 AGE int(5) デフォルト NULL コメント '年齢',
 COMMENT varchar(255) DEFAULT NULL COMMENT 'はじめに',
 主キー (ID)
) ENGINE=InnoDB AUTO_INCREMENT=7 デフォルト CHARSET=utf8;
 
-- データ挿入ステートメント INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', 'Happy rookie', '18', 'Very happy today');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲しい新人', '21', '今日はとても悲しい');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '本気の新人', '30', '今日はとても本気');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', 'Happy rookie', '18', '今日はとても幸せです');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '本気の新人', '21', '今日はとても本気です');

デフォルトのテーブルデータは次のように表示されます


結果分析を実行する

-- クエリ 1
選択
 *
から
 テストユーザー u
年齢順

結果セット 1


-- クエリ 2
-- UNIONの使用
(
 選択
  *
 から
  テストユーザー u
 年齢順
)
連合
(
 選択
  *
 から
  テストユーザー u
 年齢順
);
 
-- クエリ 3
-- UNION ALLの使用
(
 選択
  *
 から
  テストユーザー u
 年齢順
)
ユニオンオール
(
 選択
  *
 から
  テストユーザー u
 年齢順
)

結果セット2: UNIONの使用

UNION は同一のレコードを結合するため (DISTINCT と同じ効果があります)、ここでは 5 つのレコードのみが表示されます。

結果セット3: UNION ALLの使用

UNION ALL を使用してソートする必要がある場合は、サブクエリとしてクエリを実行する必要があります。

-- クエリ 4
-- UNION ALLをサブクエリとして使用し、SELECTをソートする
 *
から
 (
 (
 選択
 *
 から
 テストユーザー u
 注文する
 年
 )
 ユニオンオール
 (
 選択
 *
 から
 テストユーザー u
 注文する
 年
 )
 )
注文する
 年;

結果セット 4

改善する

関連する経験を検索した後、私は不必要なことをしていたことに気づきました。サブクエリを使用せずにソートを実行できることがわかりました。

-- クエリ 5
-- 最初のクエリではソートを使用しません。ソートを使用する場合は、括弧なしでエラーが報告されます (これが、以前はサブクエリを使用したかったのに、この方法を思いつかなかった理由です)
選択
 *
から
 テストユーザー u
 
ユニオンオール
 
選択
 *
から
 テストユーザー u
注文する
 年

結果セットは結果セット 4 と同じなので、結果はここに貼り付けられません。

結論は

UNION (または UNION ALL) ステートメントを使用する場合、UNION の 2 つの結果セットが別々にソートされてから結合されると、ORDER BY は無効になります。並べ替えるには、次の 2 つの方法があります。

  1. これらをサブクエリとして使用し、ORDER BY で再度クエリを実行します (サブクエリは簡潔ではないため、方法 2 が依然として推奨されます)
  2. 最初の結果セットではソートを使用せず、結果を区切るために括弧を使用せず、2番目の結果セットの後にORDER BYを使用します。

参考リンク

cnblogs: MySQL での UNION と UNION ALL の使用

要約する

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

以下もご興味があるかもしれません:
  • MySQL ソート失敗問題の解決方法

<<:  Vue 親コンポーネントが子コンポーネント関数の実装を呼び出す

>>:  Linux (CentOS7) で RPM を使用して MySQL 8.0.11 をインストールするチュートリアル

推薦する

高度な JavaScript フロントエンド開発でよく使用されるいくつかの API の例の詳細な説明

目次ミューテーションオブザーバーAPI特徴インターセクションオブザーバーAPI例えば画像の遅延読み込...

MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します

デフォルトでは、MySQL は日付に 0 値を挿入することを受け入れますが、実際には日付の 0 値に...

iframeをカプセル化するvueコンポーネントを開発する

目次1. コンポーネントの紹介2. コンポーネントの内部構造とロジック1. コード組織構造2. マッ...

uniappを使用してWeChatミニプログラムでEChartsを使用する方法

今日は、uniapp を使用して Echarts を統合し、マップ チャートを表示します。 mpvu...

MySQL 接続失敗の一般的な障害と原因

==================================================...

JavaScript が重複したネットワークリクエストを防ぐ方法の例

序文開発中は、インターフェース要求の繰り返しによってさまざまな問題が発生することがよくあります。ネッ...

Nginx の場所と proxy_pass パスの設定の問題の概要

目次1. Nginxロケーションの基本設定1.1 Nginx 設定ファイル1.2 Pythonスクリ...

負荷分散と動的・静的分離を実現するNginx+Tomcatの原理の分析

1. Nginx ロードバランシングの実装原理1. Nginxはリバースプロキシを通じて負荷分散を実...

Mysql-connector-java ドライバのバージョン問題の概要

Mysql-connector-java ドライバのバージョンの問題私のデータベースのバージョンは ...

Javascript クロージャの使用シナリオの原則の詳細

目次1. 終了2. クロージャの使用シナリオ1.タイムアウトを設定する2. コールバック3. 手ぶれ...

Linux trコマンドの使い方

01. コマンドの概要tr コマンドは、標準入力からの文字を置換、圧縮、削除できます。ある文字セット...

MySql 最適化のための my.ini 中国語構成スキームの詳細な説明: InnoDB、4GB メモリ、および複数のクエリ

この記事は、4G メモリ システム用の MySQL 構成ファイル ソリューションです (主に Inn...

HTML_PowerNode 入門 Java アカデミー

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 HTML ...

適応レイアウトの処理について(フロートとマージンネガティブマージンを使用)

適応型レイアウトは、実際のアプリケーションでますます一般的になっています。今日は、主にフローティング...

Linux 時間サブシステムの時間表現例の詳細な説明

序文Linux カーネルでは、元のコードとの互換性を保つため、または特定の仕様に準拠するため、また現...