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 をインストールするチュートリアル

推薦する

vue3 における vuex と pinia の落とし穴

目次導入インストールと使用方法文章の相違点と類似点の簡単な比較VuexとPiniaの長所と短所Pin...

MySQL データベースの Binlog 使用法の概要 (必読)

MySQL データベースにとって binlog バイナリ ログがどれほど重要であるかについては詳し...

Windows 10 で MySQL の解凍バージョンをインストールする方法の詳細なグラフィック チュートリアル

MySQL のインストールは、インストール バージョンと解凍バージョンに分かれています。インストール...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

MySQL のインデックスとデータ テーブルを管理する方法

目次テーブルの競合を見つけて修正するインデックス統計の更新テーブルの競合を見つけて修正するデータ テ...

VMware Workstation 15 Pro インストール ガイド (初心者向け)

01. VMware Workstation Pro 15 のダウンロードダウンロード: VMwa...

繰り返し送信、繰り返し更新、バックオフ防止に関する問題と解決策の分析

1つ。序文<br />この種の質問は、どの専門掲示板でも見かけます。Google で検索...

Ubuntu 20.04 をインストールした後に行うべきこと (初心者向けガイド)

Ubuntu 20.04 がリリースされ、多くの新機能が導入されましたが、慣れていない機能も多くあ...

フロントエンド開発に必須:推奨されるブラウザ互換性テストツール 12 選

フロントエンド開発者にとって、さまざまな主要ブラウザのさまざまなバージョンでコードが適切に動作するこ...

HTML ページの先頭に戻るいくつかの実装の概要

最近、ウェブサイトを開発する際にトップに戻るボタンを作成する必要がありますが、私は主にバックエンドの...

Linux で FastDFS ファイル サーバーを構築するための実装手順

目次1. ソフトウェアパッケージ2. gccをインストールする3. libfastcommonをイン...

vscode dockerプラグインのdocker.socket権限問題を解決する

解決策: システム内のすべての .vscode 関連プロセスを終了します (または、remote-s...

Ubuntu での mysql のインストールと使用 (一般版)

Ubuntu のバージョンに関係なく、MySQL データベースのインストールは基本的に同じです。具...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...