サーチ…


構文

  • UNION DISTINCT - SELECTを結合した後の除外
  • UNION ALL - 非除算(より高速)
  • UNION - デフォルトはDISTINCTです。
  • SELECT ... UNION SELECT ... - OKですが、 ORDER BYではあいまいです
  • (SELECT ...)UNION(SELECT ...)ORDER BY ... - あいまいさを解決する

備考

UNIONは複数のCPUを使用しません。

UNIONは常に*結果を収集するための一時表を含みます。 * 5.7.3 / MariaDB 10.1以降、UNIONのいくつかの形式は、tmpテーブルを使用せずに結果を出力します(したがって速くなります)。

SELECTステートメントをUNIONと組み合わせる

同じ構造の2つのクエリの結果をUNIONキーワードと組み合わせることができます。

たとえば、 authors editorseditors 2つの別々のテーブル(すべての連絡先情報のリスト)が必要な場合は、次のようにUNIONキーワードを使用できます。

select name, email, phone_number 
from authors

union

select name, email, phone_number
from editors

unionを単独で使用すると、重複が取り除かれます。問合せに重複を残す必要がある場合は、次のようにALLキーワードを使用できますUNION ALL

ORDER BY

UNIONの結果をソートする必要がある場合は、次のパターンを使用します。

( SELECT ... )
UNION
( SELECT ... )
ORDER BY

括弧がなければ、最後のORDER BYは最後のSELECTに属します。

OFFSETによるページネーション

LIMITをUNIONに追加する場合は、これを使用するパターンです。

( SELECT ... ORDER BY x  LIMIT 10 )
UNION
( SELECT ... ORDER BY x  LIMIT 10 )
ORDER BY x  LIMIT 10

"10"はどのSELECTから来るのかを予測できないので、それぞれから10を取得し、さらにORDER BYLIMIT両方を繰り返してリストを下ろす必要があります。

10項目のうち4ページ目には、このパターンが必要です。

( SELECT ... ORDER BY x  LIMIT 40 )
UNION
( SELECT ... ORDER BY x  LIMIT 40 )
ORDER BY x  LIMIT 30, 10

つまり、各SELECTで4ページ分の値を収集し、 UNION OFFSETを実行します。

異なる列とのデータの結合

SELECT name, caption as title, year, pages FROM books 
UNION
SELECT name, title, year, 0 as pages FROM movies

2つのレコードセットを異なる列に結合すると、欠落しているレコードセットをデフォルト値でエミュレートします。

UNION ALLおよびUNION

SELECT 1,22,44 UNION SELECT 2,33,55

ここに画像の説明を入力

SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55

結果は上記と同じです。

UNION ALLを使用する

いつ

SELECT 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECT 2,33,55

ここに画像の説明を入力

同じ列を持つ異なるMySQLテーブルのデータを一意の行と実行クエリに結合してマージする

このUNION ALLは、複数の表のデータを結合し、問合せに使用する表名の別名として機能します。

SELECT YEAR(date_time_column), MONTH(date_time_column), MIN(DATE(date_time_column)), MAX(DATE(date_time_column)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
    (SELECT date_time_column, ip FROM server_log_1 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log_2 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log_3 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log WHERE state = 'action' AND log_id = 150)
) AS table_all
GROUP BY YEAR(date_time_column), MONTH(date_time_column);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow