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

推薦する

SQL インジェクションのある Web サイトを見つける方法 (必読)

方法 1: Google の詳細検索を使用します。たとえば、次に示すように.asp?id=9などの ...

MySQLのユーザー権限の確認と管理方法の詳細な説明

この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...

ページのレンダリング時間を短縮してページの実行速度を速めます

ブラウザでのページのレンダリング時間をできるだけ短縮するにはどうすればよいでしょうか? この記事は、...

MySQL 8.0.22 の最新バージョンのダウンロードとインストールの超詳細なチュートリアル (Windows 64 ビット)

目次序文1. 公式サイトからMySQL 8.0.22をダウンロードする2. 環境変数を設定する3. ...

HTML で 2 列レイアウトを実装する方法の例 (左側は固定幅、右側は適応幅)

HTMLは2列レイアウトを実装し、左側は固定幅、右側は適応幅です。実装1: <スタイル>...

dockerfile における ENTRYPOINT と CMD の組み合わせと違い

前回の記事【dockerコンテナのためのdockerfileを詳しく解説】では、dockerfile...

1つの記事でTypeScriptのデータ型について学ぶ

目次基本タイプあらゆるタイプ配列タプルインタフェース関数自己推論を入力する結合タイプ(1つ以上選択)...

Vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュについて

目次1. コンポーネント切り替え方式方法1: v-ifとv-elseを使用する方法 2: 組み込みコ...

Kubernetes ポッドオーケストレーションとライフサイクルの詳細な説明

目次K8Sマスター基本アーキテクチャポッドオーケストレーションコンセプトPod オブジェクトのプロパ...

MySQLとOracleの違いを簡単に説明してください

1. Oracle は大規模データベースですが、MySQL は小規模から中規模のデータベースです。O...

CSS 手法を使用してモジュール性を実現する例

1. CSS 方法論とは何ですか? CSS methodologiesデザイン パターンまたは CS...

Dockerコンテナのいくつかの保存方法の詳細な説明

目次前面に書かれた複数のストレージマウント方法1.バインドマウント2. 巻数3.tmpfsマウントス...

CSS3 を使用してピカチュウのアニメーション壁紙を作成する例

文章さて、次はレンダリングを見せましょう。画像を見て初めて理解することに興味が湧くでしょう。そうでな...

MySQLクエリ時にフィールドにデフォルト値を割り当てる方法

必要フィールドをクエリする場合、フィールドに同じ値を指定する必要があります。この値はハードコードする...

Nginx プロキシ axios リクエストと注意事項

序文最近、小さなデモを作成しました。大規模な工場のオンライン データを使用したため、インターフェイス...