MySQL
SYNDICAT
Recherche…
Syntaxe
- UNION DISTINCT - déduit après avoir combiné les SELECT
- UNION ALL - non dedup (plus rapide)
- UNION - la valeur par défaut est DISTINCT
- SELECT ... UNION SELECT ... - est OK, mais ambigu sur
ORDER BY
- (SELECT ...) UNION (SELECT ...) ORDER BY ... - résout l'ambiguïté
Remarques
UNION n'utilise pas plusieurs processeurs.
UNION toujours * implique une table temporaire pour collecter les résultats. * A partir de 5.7.3 / MariaDB 10.1, certaines formes d’UNION fournissent les résultats sans utiliser de table tmp (donc plus rapide).
Combiner les instructions SELECT avec UNION
Vous pouvez combiner les résultats de deux requêtes à structure identique avec le mot-clé UNION
.
Par exemple, si vous vouliez une liste de toutes les informations de contact de deux tables, authors
et editors
distincts, par exemple, vous pourriez utiliser le mot-clé UNION
comme suit:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
Utiliser l' union
par elle-même supprimera les doublons. Si vous aviez besoin de conserver des doublons dans votre requête, vous pouvez utiliser le mot clé ALL
comme suit: UNION ALL
.
COMMANDÉ PAR
Si vous devez trier les résultats d'un UNION, utilisez ce modèle:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Sans les parenthèses, le dernier ORDER BY appartiendrait au dernier SELECT.
Pagination via OFFSET
Lorsque vous ajoutez une LIMITE à une UNION, c'est le modèle à utiliser:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Comme vous ne pouvez pas prédire quel (s) SELECT (s) le "10" va provenir, vous devez obtenir 10 pour chacun, puis réduire la liste, en répétant à la fois ORDER BY
et LIMIT
.
Pour la 4ème page de 10 articles, ce modèle est nécessaire:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
Autrement dit, collectez 4 pages dans chaque SELECT
, puis effectuez le OFFSET
dans l’ UNION
.
Combinaison de données avec différentes colonnes
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
Lors de la combinaison de 2 jeux d’enregistrements avec des colonnes différentes, émulez les éléments manquants avec des valeurs par défaut.
UNION ALL et UNION
SELECT 1,22,44 UNION SELECT 2,33,55
SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55
Le résultat est le même que ci-dessus.
utiliser UNION ALL
quand
SELECT 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECT 2,33,55
Combinaison et fusion de données sur différentes tables MySQL avec les mêmes colonnes en lignes uniques et requête en cours d'exécution
Cet UNION ALL combine des données provenant de plusieurs tables et sert d'alias de nom de table à utiliser pour vos requêtes:
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);