pocket

[SQL] 여러 개의 테이블 사용하기 (UNION, Subquery) 본문

데이터베이스/SQL

[SQL] 여러 개의 테이블 사용하기 (UNION, Subquery)

jpocket 2025. 4. 4. 15:54
반응형

학습 내용


  • ✅ 기본키(PK), 외래키(FK)
    • 기본키(PK : Primary Key)
    • 외래키(FK : Foreign Key)
  • ✅ 다중 테이블 사용하기(JOIN)
    • JOIN
    • JOIN의 종류
  • ✅ 데이터 이어붙이기(UNION)
  • ✅ 서브쿼리 원리와 방식(Subquery)
    • Subquery
    • WHERE절 서브쿼리
    • 단일행 서브쿼리
    • 다중행 서브쿼리
    • FROM절 서브쿼리

 

 

 

 


🛠 UNION

  • 데이터를 붙일 때 사용한다.
  • 테이블을 아래로, 세로로 붙이며 새로운 행을 생성한다.

 

 

 

🔥주의할 점

  • ✅ 2개의 테이블의 컬럼명이 달라도 적용할 수 있다.
  • ❌ 컬럼수가 다르면 사용할 수 없다.
  • ❌ 컬럼의 데이터 타입이 서로 다르면 사용할 수 없다.

👉 즉, 2개의 테이블의 컬럼수와 데이터 타입이 같으면 사용할 수 있다.🚀

 

 

종류

📌
UNION ALL: 중복 포함하여 쿼리문 2개를 합친다.
UNION: 중복 제거하여 쿼리문 2개를 합친다.

 

 

mysql("""

SELECT work_year, experience_level, job_title
FROM ds_2020
UNION
SELECT work_year, experience_level, job_title
FROM ds_2021
LIMIT 100

""")

 

 

🔥참고

다른 DBMS에서는 UNION DISTINCT 를 써도 중복 제거가 되지만, pandasql 에서는 에러가 나기 때문에 UNION 만 적으면 된다.

 

 

 

 

 

 


🛠 Subquery

  • 하나의 쿼리문 안에 포함되는 또 다른 쿼리문이다. (=중첩 쿼리문 이라고도 불린다.)
  • join 과 달리, 새로운 컬럼이 필요하지 않을 때 서브쿼리를 사용한다.
  • 서브쿼리는 SELECT, FROM, WHERE, HAVING 등 다양한 절에 사용할 수 있다.
  • FROM 절에서 사용될 경우, 서브쿼리의 결과는 임시 테이블처럼 활용된다.

 

 

 

Subquery 실행 순서

서브쿼리 -> 메인쿼리

 

 

 

들어갈 서브 쿼리를 항상 먼저 추출해보고 사용한다.

🔎그렇다면 서브쿼리는 어떻게 생겼을까❓

 

 

 

형태

select * from 테이블명 where 컬럼명 in (select 컬럼명 from 테이블명)

 

  • ✅ 괄호를 묶어서 사용한다.
  • ✅ 연산자의 오른쪽에 위치한다.
  • ❌ 서브쿼리 내에서는 ORDER BY 가 지원되지 않는다.

 

종류

🛠 where절 서브쿼리

서브쿼리의 결과는 메인쿼리의 조건으로 사용된다.

 

 

🛠 단일행 서브쿼리

  • 서브쿼리의 실행 결과가 항상 1건 이하인 서브쿼리
  • 단일행 비교연산자 (=, !=, >, < 등)과 함께 사용한다.
mysql("""

SELECT *
FROM customers
WHERE creditLimit < (SELECT MIN(price)
                    FROM orders)
""")

 

 

 

🛠 다중행 서브쿼리

  • 서브쿼리의 실행 결과가 여러 건인 서브 쿼리
  • 다중행 비교연산자(INNOT IN 등)와 함께 사용한다.
mysql("""
SELECT orderId
FROM orders 
WHERE customerId IN (SELECT customerId
                    FROM customers
                    WHERE country = 'USA')
""")

 

 

🛠 from절 서브쿼리

Inline View(=인라인 뷰)

뷰처럼 작동하여 인라인뷰라고 부른다.

 

 

🛠 뷰 View 란?

  • SELECT문을 저장해 둔 가상의 테이블로 물리적으로 데이터를 저장하지 않고, 원본 테이블의 데이터를 바라보는 창(window) 역할을 한다.
  • 실제 테이블처럼 SELECT, JOIN, WHERE 등에 사용할 수 있다.

  실행 시점에 결과가 만들어져서
  일시적으로 임시 테이블처럼 사용된다는 점이 핵심이다.

 

🔁 뷰(View) vs 인라인 뷰

구분                   뷰 (View)                                                                       인라인 뷰 (Inline View)

 

생성 방법 CREATE VIEW 구문 FROM 절에 서브쿼리 작성
저장 여부 ✅ 저장됨 (데이터는 X, 쿼리 구조는 O) ❌ 저장되지 않음
사용 목적 재사용 가능한 쿼리 정의 쿼리 내부에서 임시 테이블처럼 활용
사용 위치 일반 쿼리에서 테이블처럼 FROM 절 내부

쉽게 말하면: 인라인 뷰는 "잠깐 쓰고 버리는 뷰" 라고 생각하면 된다.😊

 

 

mysql("""
SELECT *
    , CAST(julianday('now') - julianday(max_date) AS INT) AS date_diff
FROM (SELECT customerId
            , MAX(orderDate) AS max_date
      FROM orders 
      GROUP BY 1) AS main
""")

고객별 마지막 제품의 구매일자가 현재일을 기준으로 며칠 지났는지 확인

 

 

 

🔥[참고]

날짜 차이를 구할 때 MySQL 등과 같은 DBMS에서는 날짜와 관련된 함수, 예를 들면 DATEDIFF 등의 함수를 사용하지만 pandasql과 SQLite에서는 julianday 함수를 사용한다.

 

반응형