PostgreSQL - UNIONS 조건

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 PostgreSQL의 마법의 세계로 뛰어들어 یکی از 강력한 마법을 탐구해 볼 것입니다: UNION 조건. 코드를 한 줄도 작성해 본 적이 없어도 걱정 마세요 - 이 모험을 안내해 드릴 친절한 안내자가 바로 저입니다. 그러면 wand( 키보드)를 잡고 시작해 보겠습니다!

PostgreSQL - Unions Clause

UNION이란?

자, 구체적인 내용으로 넘어가기 전에 UNION이 무엇인지 이해해 보겠습니다. 두 개의 별도의 좋아하는 책 목록을 가정해 봅시다. 하나는 판타지 소설이고, 다른 하나는 과학 소설 제목들입니다. 이 두 개의 목록을 하나의 슈퍼 목록으로 결합하고 싶다면 어떻게 하시겠습니까? 바로 UNION이 데이터베이스 세계에서 하는 일입니다!

PostgreSQL에서 UNION은 두 개 이상의 SELECT 문의 결과를 단일 결과 집합으로 결합할 수 있게 해줍니다. 다양한 색상의 페인트를 섞어 새로운 흥미로운 색상을 만드는 것과 같은 것입니다!

문법

이제 UNION 마법을 부르기 위한 마법의 말( 문법)을 살펴보겠습니다:

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

보기에 간단하죠? 하지만 강력한 힘에는 큰 책임이 따릅니다. 다음과 같은 중요한 규칙을 따르세요:

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

예제

우리의 책 목록 유사성을 실제 코드로 살펴보겠습니다. 두 개의 테이블: fantasy_booksscifi_books를 가정해 봅시다.

-- fantasy_books 테이블 생성
CREATE TABLE fantasy_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

-- 몇 가지 판타지 책 추가
INSERT INTO fantasy_books (title, author) VALUES
('The Hobbit', 'J.R.R. Tolkien'),
('Harry Potter and the Sorcerer''s Stone', 'J.K. Rowling'),
('A Game of Thrones', 'George R.R. Martin');

-- scifi_books 테이블 생성
CREATE TABLE scifi_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

-- 몇 가지 SF 책 추가
INSERT INTO scifi_books (title, author) VALUES
('Dune', 'Frank Herbert'),
('The Hitchhiker''s Guide to the Galaxy', 'Douglas Adams'),
('1984', 'George Orwell');

이제 UNION을 사용하여 우리의 슈퍼 목록을 만들어 보겠습니다:

SELECT title, author FROM fantasy_books
UNION
SELECT title, author FROM scifi_books;

이 쿼리는 두 테이블 모두에서 책을 결합한 목록을 중복 없이 제공합니다. 두 개의 카드 덱을 섞는 것처럼, 중복 카드가 없도록 합니다!

결과 이해

이 쿼리를 실행하면 다음과 같은 것을 볼 수 있습니다:

title author
The Hobbit J.R.R. Tolkien
Harry Potter and the Sorcerer's Stone J.K. Rowling
A Game of Thrones George R.R. Martin
Dune Frank Herbert
The Hitchhiker's Guide to the Galaxy Douglas Adams
1984 George Orwell

이렇게 아름다운 결합 목록이 보입니다! 판타지와 SF 작가들이 모여 파티를 열 것 같은 기분이 듭니다. 톨킨과 허버트가 세계 구축에 대해 흥미로운 대화를 나누는 것을 상상할 수 있습니다!

UNION ALL 조건

그런데 만약 중복 행을 유지하고 싶다면 어떻게 하시겠습니까? 그때는 UNION ALL이 유용합니다. UNION ALL은 데이터베이스에게 "모든 책을 원한다, 중복 제외하지 말 것!"이라고 알립니다.

우리의 이전 예제를 약간 수정해 보겠습니다:

-- 중복 책을 scifi_books에 추가
INSERT INTO scifi_books (title, author) VALUES
('The Hobbit', 'J.R.R. Tolkien');

-- 이제 UNION ALL을 사용해 보겠습니다
SELECT title, author FROM fantasy_books
UNION ALL
SELECT title, author FROM scifi_books;

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

title author
The Hobbit J.R.R. Tolkien
Harry Potter and the Sorcerer's Stone J.K. Rowling
A Game of Thrones George R.R. Martin
Dune Frank Herbert
The Hitchhiker's Guide to the Galaxy Douglas Adams
1984 George Orwell
The Hobbit J.R.R. Tolkien

"해리 포터"가 두 번 나타나는 것을 보시죠? 중복된 손님을 두 번 초대하여 두 배의 케이크를 먹이는 것과 같습니다!

실용적인 응용

이것이 cool하지만, 실제 생활에서 언제 사용할까요? 훌륭한 질문입니다! 다음은 몇 가지 시나리오입니다:

  1. 비슷한 구조를 가진 다른 테이블에서 데이터를 결합하는 경우(우리의 책 예제와 같이).
  2. 다양한 쿼리의 결과를 결합하여 종합 보고서를 작성하는 경우.
  3. 다른 시간 기간이나 범주 간의 데이터를 비교하는 경우.

예를 들어, 책방을 운영 중이라면, 재고가 적거나 최근에 판매되지 않은 책을 결합한 목록을 만들 수 있습니다:

SELECT title, 'Low Stock' AS reason
FROM inventory
WHERE quantity < 5
UNION
SELECT title, 'No Recent Sales' AS reason
FROM sales
WHERE last_sale_date < CURRENT_DATE - INTERVAL '30 days';

이 쿼리는 재고 부족이나 최근에 판매되지 않은 책을 빠르게 식별하는 데 도움이 됩니다.

공통된 함정과 피하는 방법

  1. 칼럼 불일치: 모든 SELECT 문에서 칼럼의 수와 순서는 같아야 합니다. 불일치하면 PostgreSQL은 빠르게 오류를 발생시킵니다!

  2. 불일치하는 데이터 타입: 대응하는 칼럼의 데이터 타입은 호환되어야 합니다. 사과와 우주선을 섞을 수 없습니다.

  3. ORDER BY를 잊지 마세요: UNION 작업은 결과의 순서에 영향을 줄 수 있습니다. 특정 순서가 필요하다면 항상 ORDER BY 절을 쿼리의 끝에 추가하세요.

결론

이제 여러분은 PostgreSQL의 강력한 UNION 조건을 어떻게 사용하는지 배웠습니다. 좋은 마법은 많은 연습이 필요합니다. 다양한 쿼리를 실험해 보고 결과를 확인해 보세요.

여러분을 보내기 전에 작은 도전을 드리겠습니다: 자신만의 두 개의 테이블(예: 좋아하는 영화와 좋아하는 TV 프로그램)을 만들어 UNION과 UNION ALL을 사용해 보세요. 차이를 확인해 보세요.

기쁜 쿼리 작성을 기원하며, 데이터베이스는 항상 정규화되고 조인은 빠르기를 바랍니다!

Credits: Image by storyset