MySQL
UNIONE
Ricerca…
Sintassi
- UNION DISTINCT: deduplica dopo aver combinato i SELECT
- UNION ALL - non dedup (più veloce)
- UNION - il valore predefinito è DISTINCT
- SELEZIONA ... UNION SELECT ... - è OK, ma ambiguo su
ORDER BY
- (SELEZIONA ...) UNIONE (SELEZIONA ...) ORDINA PER ... - risolve l'ambiguità
Osservazioni
UNION non usa più CPU.
UNION sempre * comporta una tabella temporanea per raccogliere i risultati. * A partire da 5.7.3 / MariaDB 10.1, alcune forme di UNION forniscono i risultati senza utilizzare una tabella tmp (quindi, più veloce).
Combinare le istruzioni SELECT con UNION
È possibile combinare i risultati di due query identicamente strutturate con la parola chiave UNION
.
Ad esempio, se si desidera un elenco di tutte le informazioni di contatto da due tabelle separate, authors
e editors
, ad esempio, è possibile utilizzare la parola chiave UNION
modo:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
L'utilizzo union
da sola eliminerà i duplicati. Se dovessi conservare i duplicati nella tua query, potresti utilizzare la parola chiave ALL
modo: UNION ALL
.
ORDINATO DA
Se è necessario ordinare i risultati di UNION, utilizzare questo modello:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Senza le parentesi, l'ORDER BY finale apparterrebbe all'ultima SELECT.
Paginazione tramite OFFSET
Quando si aggiunge un LIMIT a UNION, questo è il modello da utilizzare:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Dal momento che non è possibile prevedere quale / i SELEZIONA / i arriverà il "10", sarà necessario ottenere 10 da ciascuno, quindi ridurre ulteriormente l'elenco, ripetendo sia ORDER BY
che LIMIT
.
Per la quarta pagina di 10 articoli, questo modello è necessario:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
Vale a dire, raccogliere il valore di 4 pagine in ciascuna SELECT
, quindi eseguire lo OFFSET
UNION
.
Combinare i dati con colonne diverse
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
Quando si combinano 2 set di record con colonne diverse, emulare quelli mancanti con i valori predefiniti.
UNIONE TUTTI e UNIONE
SELEZIONA 1,22,44 UNIONE SELEZIONA 2,33,55
SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55
Il risultato è lo stesso di sopra.
usa UNION ALL
quando
SELECT 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECT 2,33,55
Combinazione e fusione dei dati su diverse tabelle MySQL con le stesse colonne in righe univoche e query in esecuzione
Questo UNION ALL combina i dati di più tabelle e funge da alias di nome tabella da utilizzare per le query:
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);