Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL UNION 연산자 완벽 가이드: 여러 테이블의 결과를 하나로 합치는 방법

MySQL의 UNION 연산자는 기본적으로 2개 이상의 SELECT 문이 반환하는 결과 집합을 하나로 결합하는 데 사용됩니다. 이때 UNION은 각 SELECT 문 사이에서 중복된 행을 자동으로 제거합니다. 단, UNION 안에 포함된 모든 SELECT 문은 결과 집합의 컬럼 수가 동일해야 하며, 각 컬럼의 데이터 타입도 서로 유사해야 한다는 점에 유의해야 합니다.

기본 문법

SELECT expression1, expression2, … expression_n
FROM table
[WHERE conditions]
UNION [DISTINCT]
SELECT expression1, expression2, … expression_n
FROM table
[WHERE conditions]

expression1, expression2, … expression_n : 조회하고자 하는 컬럼들을 의미합니다.

table : 레코드를 가져올 대상 테이블입니다.

WHERE conditions : 선택 사항으로, 레코드가 선택되기 위해 반드시 충족해야 하는 조건을 지정합니다.

DISTINCT : 역시 선택 사항이며, 결과 집합에서 중복을 제거하는 역할을 합니다. 다만 UNION 연산자는 기본적으로 이미 중복을 제거하므로, DISTINCT를 명시적으로 작성해도 결과에는 아무런 영향을 미치지 않습니다.

예제

이번 예제에서는 Student_detailStudent_info라는 두 개의 테이블을 사용합니다. 각 테이블에는 다음과 같은 데이터가 저장되어 있습니다.

mysql> Select * from Student_detail;
+-----------+---------+------------+------------+
| studentid | Name    | Address    | Subject    |
+-----------+---------+------------+------------+
|    101    | YashPal | Amritsar   | History    |
|    105    | Gaurav  | Chandigarh | Literature |
|    130    | Ram     | Jhansi     | Computers  |
|    132    | Shyam   | Chandigarh | Economics  |
|    133    | Mohan   | Delhi      | Computers  |
|    150    | Rajesh  | Jaipur     | Yoga       |
|    160    | Pradeep | Kochi      | Hindi      |
+-----------+---------+------------+------------+
7 rows in set (0.00 sec)

mysql> Select * from Student_info;
+-----------+-----------+------------+-------------+
| studentid | Name      | Address    | Subject     |
+-----------+-----------+------------+-------------+
|    101    | YashPal   | Amritsar   | History     |
|    105    | Gaurav    | Chandigarh | Literature  |
|    130    | Ram       | Jhansi     | Computers   |
|    132    | Shyam     | Chandigarh | Economics   |
|    133    | Mohan     | Delhi      | Computers   |
|    165    | Abhimanyu | Calcutta   | Electronics |
+-----------+-----------+------------+-------------+
6 rows in set (0.00 sec)

아래 쿼리는 UNION 연산자를 사용하여 두 테이블에 존재하는 모든 'studentid' 값을 반환합니다. 두 테이블에 공통으로 존재하는 101, 105, 130, 132, 133은 중복 없이 한 번씩만 출력되며, 각 테이블에 고유한 값인 150, 160, 165까지 포함되어 최종적으로 8개의 행이 조회됩니다.

mysql> Select Studentid FROM student_detail UNION SELECT Studentid FROM student_info;
+-----------+
| Studentid |
+-----------+
|    101    |
|    105    |
|    130    |
|    132    |
|    133    |
|    150    |
|    160    |
|    165    |
+-----------+
8 rows in set (0.00 sec)

참고: 만약 중복된 행까지 그대로 유지하고 싶다면 UNION 대신 UNION ALL을 사용하면 됩니다. UNION ALL은 중복 검사를 수행하지 않으므로, 대용량 데이터를 처리할 때 성능 면에서 더 유리할 수 있습니다.