MySQL
노동 조합
수색…
통사론
- UNION DISTINCT - SELECT를 결합한 후의 dedups
- UNION ALL - 비 dedup (더 빠름)
- 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과 결합
동일하게 구조화 된 두 개의 쿼리 결과를 UNION
키워드와 결합 할 수 있습니다.
예를 들어 authors
와 editors
등 두 개의 별도 테이블에서 모든 연락처 정보 목록을 원한다면 UNION
키워드를 사용할 수 있습니다.
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
union
으로 사용하면 중복을 제거 할 수 있습니다. 쿼리에서 중복을 유지해야하는 경우 ALL
키워드 (예 : UNION ALL
사용할 수 있습니다.
주문
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 BY
와 LIMIT
반복하여 목록을 아래로 내리십시오.
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 사용
언제
선택 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);