MySQL
UNIE
Zoeken…
Syntaxis
- UNION DISTINCT - dedups na het combineren van de SELECT's
- UNION ALL - niet-dedup (sneller)
- UNION - de standaardinstelling is DISTINCT
- SELECT ... UNION SELECT ... - is OK, maar dubbelzinnig bij
ORDER BY
- (SELECT ...) UNION (SELECT ...) ORDER BY ... - lost de dubbelzinnigheid op
Opmerkingen
UNION maakt geen gebruik van meerdere CPU's.
UNION heeft altijd * een tijdelijke tabel nodig om de resultaten te verzamelen. * Vanaf 5.7.3 / MariaDB 10.1 leveren sommige vormen van UNION de resultaten zonder een tmp-tabel (dus sneller).
SELECT-instructies combineren met UNION
U kunt de resultaten van twee identiek gestructureerde zoekopdrachten combineren met het UNION
trefwoord.
Als u bijvoorbeeld een lijst met alle contactinformatie uit twee afzonderlijke tabellen, authors
en editors
, wilt, kunt u het trefwoord UNION
als volgt gebruiken:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
Het gebruik van union
op zichzelf zal duplicaten verwijderen. Als u duplicaten in uw zoekopdracht wilt bewaren, kunt u het sleutelwoord ALL
als volgt gebruiken: UNION ALL
.
BESTELLEN BIJ
Als u de resultaten van een UNION moet sorteren, gebruikt u dit patroon:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Zonder de haakjes zou de laatste ORDER BY tot de laatste SELECT behoren.
Paginering via OFFSET
Bij het toevoegen van een LIMIT aan een UNION is dit het patroon dat moet worden gebruikt:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Omdat je niet kunt voorspellen uit welke SELECT ('s) de "10" zal komen, moet je van elk 10 halen en vervolgens de lijst verder afbouwen door zowel ORDER BY
als LIMIT
herhalen.
Voor de 4e pagina van 10 items is dit patroon nodig:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
Dat wil zeggen, verzamel 4 pagina's in elke SELECT
en voer dan de OFFSET
in de UNION
.
Gegevens combineren met verschillende kolommen
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
Wanneer u twee recordsets combineert met verschillende kolommen, emuleer dan de ontbrekende sets met standaardwaarden.
UNION ALL en UNION
SELECT 1,22,44 UNION SELECT 2,33,55
SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55
Het resultaat is hetzelfde als hierboven.
gebruik UNION ALL
wanneer
SELECTEER 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECTEER 2,33,55
Combineren en samenvoegen van gegevens op verschillende MySQL-tabellen met dezelfde kolommen in unieke rijen en lopende query
Deze UNION ALL combineert gegevens uit meerdere tabellen en dient als alias voor de tabelnaam om te gebruiken voor uw vragen:
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);