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

推薦する

jQueryは要素を追加した後に元のイベントが実行されない問題を解決します

まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...

キャンバスはスクラッチカード効果を描画します

この記事では、キャンバスでスクラッチカード効果を描画するための具体的なコードを参考までに共有します。...

ウェブページ制作でウェブフォントファイルにベクターアイコンを追加する方法

ご存知のとおり、コンピューターには 2 種類の画像があり、1 つはビットマップ、もう 1 つはベクタ...

CSS の新機能には、コントロールページの再描画と再配置の問題が含まれています

新しい CSS プロパティ contain を紹介する前に、読者はページの再描画と再配置が何であるか...

MySQL で複数の主キーが定義されているエラーの解決方法

主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...

XHTML チュートリアル: 初心者のための XHTML の基礎

<br />当サイトのオリジナルコンテンツですので、転載の際は出典を123WORDPRE...

React Hooks に基づく小さな状態管理の詳細な説明

目次React Hooks に基づく状態共有の実装ユーザーエクスペリエンスこの記事では、主に Rea...

JavaScriptの基本構文とデータ型の詳細な説明

目次JavaScript のインポート1. 内部ラベル2. 外部紹介基本的な構文データ型番号弦ブール...

IE6/7 における a.getAttribute(href,2) 問題の分析と解決

簡単な説明<br />IE6および7では、一般的なaタグ(HTMLで記述され、DOM操作...

jsBridgeの動作メカニズムを1つの記事で学ぶ

目次js 呼び出しメソッドアンドロイド1.jsはネイティブを呼び出す2. ネイティブコールjs iO...

JavaScript 遅延読み込みの詳細な説明

目次遅延読み込みCSS スタイル: HTML部分:スクリプト部分:要約する遅延読み込み名前の通り、私...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

データ型の判断における js typeof と instanceof の違いと、その開発と使用について

目次1. typeof演算子2. インスタンスオブ演算子3. typeof と instanceof...

MySQL ベースのストレージエンジンとログの説明 (包括的な説明)

1.1 ストレージエンジンの概要 1.1.1 ファイルシステムストレージファイル システム: オペ...

JDBC および MySQL 一時テーブルスペースの詳細な分析

背景一時テーブルスペースは、データベースのソート操作を管理し、一時テーブルや中間ソート結果などの一時...