SQLite - UNIONS Clause

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 SQLite의 마법 같은 UNIONS 절로 흥미로운 여정을 떠나게 될 것입니다. 여러분의 친절한 이웃 컴퓨터 선생님으로서 저는 이 모험을 단계별로 안내해 드릴 것입니다. 그러니 가상의魔杖( 키보드)를 손에 들고 시작해 보세요!

SQLite - UNIONS Clause

UNIONS는 무엇인가요?

상상해 보세요. 작년 여름과 올해 여름에 좋아하는 아이스크림 맛의 두 개의 별도 목록이 있습니다. 이 두 개의 목록을 하나로 결합하여 모든 좋아하는 맛의 슈퍼 목록을 만들고 싶다면 어떻게 하시겠습니까? SQLite에서 UNION이 하는 일은 바로 이와 같습니다. 하지만 아이스크림 맛 대신 데이터베이스 테이블을 사용합니다!

SQLite의 UNION 절은 두 개 이상의 SELECT 문의 결과 집합을 결합할 수 있게 해줍니다. 다양한 데이터 그룹이 어울려 새로운, 더 큰 그룹을 형성하는 큰 파티를 만드는 것입니다.

기본 문법

UNION의 기본 문법은 다음과 같습니다:

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

이를 해부해 보면:

  1. 두 개의 SELECT 문이 있습니다.
  2. 각 SELECT 문은 다른 테이블을 쿼리할 수 있습니다.
  3. UNION 키워드가 이 두 문 사이에 자리 잡고, 다리 역할을 합니다.

중요한 규칙

예제로 들어가기 전에 UNION을 사용하기 위한 중요한 규칙 몇 가지를 살펴보겠습니다:

  1. 모든 SELECT 문에서 열의 수와 순서는 같아야 합니다.
  2. 상응하는 열의 데이터 타입은 호환되어야 합니다.
  3. 기본적으로 UNION은 중복 행을 제거합니다 (이를 나중에 변경하는 방법을 보여드리겠습니다).

UNION을 실제로 사용해 보자

이제 예제 테이블을 만들어 UNION을 실제로 사용해 보겠습니다!

-- 'employees' 테이블 생성 및 데이터 추가
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO employees (name, department) VALUES
('Alice', 'HR'),
('Bob', 'IT'),
('Charlie', 'Finance');

-- 'contractors' 테이블 생성 및 데이터 추가
CREATE TABLE contractors (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO contractors (name, department) VALUES
('David', 'Marketing'),
('Eve', 'IT'),
('Frank', 'HR');

이제 UNION을 사용하여 두 테이블을 결합해 보겠습니다:

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

이 쿼리는 다음과 같은 결과를 반환합니다:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR

여기서 무슨 일이 일어났나요? UNION 절이 두 테이블의 결과를 결합하여 모든 근로자( 직원 및 계약직)의 완전한 목록을 제공해 주었습니다. 중복이 없습니다.

중복 제거의 마법

curious thing you might have noticed? Even though we have two people in the HR department (Alice and Frank), they both appear in our result. This is because UNION automatically removes duplicate rows based on all column values.

If we had someone with the exact same name and department in both tables, UNION would only show them once. For example:

INSERT INTO contractors (name, department) VALUES ('Alice', 'HR');

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

This would still give us the same result as before, without an extra 'Alice' in HR.

UNION ALL 절

occasionally, you might want to keep all rows, even if they're duplicates. That's where UNION ALL comes in handy. It's like telling the database, "I want everyone at this party, even if they have a twin!"

Let's modify our previous query:

SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM contractors;

Now we get:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR
Alice    HR

See how we now have two entries for Alice in HR? UNION ALL keeps all rows, regardless of duplication.

실질적인 응용

UNION과 UNION ALL은 오락이 아닙니다. 실제 세계에서 다양한 용도로 사용됩니다! 다음은 그 사용 사례 몇 가지입니다:

  1. 유사한 구조를 가진 여러 테이블의 데이터를 결합하는 경우 (우리의 직원과 계약직 예제와 같이).
  2. 다양한 시간 기간이나 범주에 걸치는 보고서를 작성하는 경우.
  3. 다른 데이터베이스나 데이터 소스에서 데이터를 통합하는 경우.

보다 복잡한 예제를 보겠습니다. 우리는 서점을 운영하고 있으며 구매와 반품을 포함한 모든 거래를 보고하고 싶습니다:

-- 'purchases' 테이블 생성 및 데이터 추가
CREATE TABLE purchases (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO purchases (book_title, amount, transaction_date) VALUES
('The Great Gatsby', 15.99, '2023-06-01'),
('To Kill a Mockingbird', 12.50, '2023-06-02'),
('1984', 10.99, '2023-06-03');

-- 'returns' 테이블 생성 및 데이터 추가
CREATE TABLE returns (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO returns (book_title, amount, transaction_date) VALUES
('The Great Gatsby', -15.99, '2023-06-05'),
('Pride and Prejudice', -14.99, '2023-06-06');

-- 구매와 반품을 결합
SELECT book_title, amount, transaction_date, 'Purchase' as transaction_type
FROM purchases
UNION ALL
SELECT book_title, amount, transaction_date, 'Return' as transaction_type
FROM returns
ORDER BY transaction_date;

이 쿼리는 다음과 같은 결과를 제공합니다:

The Great Gatsby       15.99   2023-06-01  Purchase
To Kill a Mockingbird  12.50   2023-06-02  Purchase
1984                   10.99   2023-06-03  Purchase
The Great Gatsby      -15.99   2023-06-05  Return
Pride and Prejudice   -14.99   2023-06-06  Return

여기서 우리는 UNION ALL을 사용하여 구매와 반품을 결합하고, 거래 유형을 구분하는 열을 추가하고, 날짜로 정렬한 결과를 얻었습니다.

팁과 트릭

  1. 결과 정렬: UNION 쿼리의 끝에 ORDER BY 절을 추가하여 결합된 결과를 정렬할 수 있습니다.

  2. 결합된 결과 필터링: 각 SELECT 문에서 WHERE 절을 사용하여 개별 테이블을 필터링하거나, UNION 쿼리를 서브쿼리로 감싸고 WHERE 절을 사용하여 결합된 결과를 필터링할 수 있습니다.

  3. 열 별칭: 다른 테이블에서 열이 다른 이름을 가지고 있을 때, 별칭을 사용하여 일치시킬 수 있습니다:

SELECT name AS person, department FROM employees
UNION
SELECT contractor_name AS person, dept AS department FROM contractors;
  1. 두 개 이상의 테이블 결합: 두 개의 테이블을 결합하는 것에 국한되지 않으며, 여러 UNION 또는 UNION ALL 절을 연속적으로 사용하여 여러 테이블을 결합할 수 있습니다.

일반 방법

SQLite에서 UNION과 관련된 일반 방법을 요약한 표입니다:

방법 설명 예제
UNION 두 개 이상의 SELECT 문의 결과를 결합하고 중복을 제거 SELECT * FROM table1 UNION SELECT * FROM table2
UNION ALL 두 개 이상의 SELECT 문의 결과를 결합하고 중복을 유지 SELECT * FROM table1 UNION ALL SELECT * FROM table2
ORDER BY UNION과 함께 사용하여 결합된 결과를 정렬 (SELECT * FROM table1 UNION SELECT * FROM table2) ORDER BY column_name
WHERE 각 SELECT 문에서 결과를 필터링 SELECT * FROM table1 WHERE condition UNION SELECT * FROM table2 WHERE condition

이제 여러분은 UNION 절을 마스터하셨습니다! 실제 데이터셋에서 이 쿼리를 실험해 보세요. 행복한 쿼리 작성을 기원합니다! 여러분의 UNION이 항상 성공하길 바랍니다!

Credits: Image by storyset