본문 바로가기
Programming/SQL

[CS Study] JOIN1 : INNER JOIN, 문제 풀이 (김영한의 실전 데이터베이스 기본편)

by Mandy's 2025. 11. 21.

강의 개요

이전 강의를 듣다가 이 강의가 좀 더 설명이 잘 되어 있어서 이 강의로 잠깐 넘어왔다!

여기서 이해를 좀 더 한 다음에 문제를 풀어보는게 좋을 것 같다~

 

김영한의 실전 데이터베이스 - 기본편| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 2,589명인 강의를 만나보세요. 실무에 꼭 필요한 SQL과 데이터베이스의 기본기를 학습합니다. 개발자뿐만 아니라 기획자나 데이터 분석가분들도 SQL을 깊이있게 학습합니다

www.inflearn.com

 

INNER JOIN

  • 교집합.

조인을 사용하는 이유?

  • 데이터 정규화
  • 데이터 중복을 피하기 위해; 데이터 갱신, 삽입, 삭제 시 발생할 수 있는 이상 현상 방지

데이터 정규화란? - 테이블을 나누는 방법, 과정

  • 데이터 중복을 최소화하고, 데이터 삽입, 갱신, 삭제 시 발생할 수 있는 이상 (anmaly)을 방지하기 위한 스키마 설계 원칙
  • 데이터의 일관성의 무결성을 확보, DB의 저장 용량을 줄일 수 있음.

정규화의 종류

  • 제 1정규형 (1NF): 모든 속성의 값은 원자값 (하나의 값)
    • 하나의 컬럼에 배열이나 쉼표로 구분된 값(CSV)와 같은 복합적인 값을 넣지 말아야 함.
  • 제 2정규형 (2NF): 제 1정규형을 만족 + 부분 함수 종속성 제거 (완전 함수 종속)
    • 기본키의 부분집합이 결정자가 되어서는 안됨.
    • 복합 기본키의 일부에만 종속된 속성을 별도의 테이블로 분리
    • → 종류가 다르면 다른 테이블이다 (복합키)
  • 제 3정규형 (3NF): 제 2정규형을 만족 + 이행적 함수 종속성 제거
    • 이행적 종속: A→B, B→C가 성립할 때 A→C가 성립하는 것
    • 기본키가 아닌 속성이 다른 비-키 속성에 종속되는 경우, 이를 분리
    • → 회원, 주소, 우편번호로 생각해보자
  • 보이스-코드 정규형 (BCNF): 제 3정규형보다 엄격한 형태. 모든 결정자가 후보키
    • 이는 키가 아닌 속성이 다른 키가 아닌 속성을 결정하는 경우를 제거
      • 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니다.
      • BCNF 정규화를 만족하기 위해서는 위의 테이블을 분리해야 함.
  • 제 4정규형 (4NF): 다치 종속성 제거
    • 하나의 속성이 여러 값을 가질 수 있는 경우를 분리
    • 복합 키본키?
      • 데이터베이스 테이블에서 두 개 이상의 컬럼을 조합하여 하나의 기본 키로 사용하는 것
      • 여러 개의 컬럼을 묶어서 각 행을 고유하게 식별하는 역할.

https://mangkyu.tistory.com/110

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

여기 이미지를 참고하면 좀 더 쉽게 이해가 간다 !

실무 팁

김영한 선생님이 가르쳐주신 실무 팁~!

  • 테이블 별칭: AS 생략
  • 컬럼 별칭: AS 사용
SELECT salary * 12 annual_salary
SELECT salary * 12 AS annual_salary

문제

특정 기간 동안의 고객별 구매 내역

[문제]

INNER JOIN을 사용하여 orders, users, products 테이블을 연결하라.

2025년 6월 이후(2025-06-01 이후)에 주문한 고객들의 고객 이름, 상품명, 주문일자, 총 금액(=수량 * 가격)을 조회하라.

총 금액이 큰 순서대로 정렬하라.

[실행 결과] (중간 이후 생략)

user_name product_name order_date total_price
이순신 4K UHD 모니터 2025-06-15 11:30:00 350000
네이트 프리미엄 게이밍 마우스 2025-06-17 12:00:00 150000
네이트 기계식 키보드 2025-06-11 14:20:00 120000
프리미엄 게이밍 마우스 2025-06-10 10:00:00 75000
     

 

정답

SELECT
    u.name AS user_name,
    p.name AS product_name,
    o.order_date,
    (o.quantity * p.price) AS total_price
FROM
    orders o
JOIN
    users u ON o.user_id = u.user_id
JOIN
    products p ON o.product_id = p.product_id
WHERE
    o.order_date >= '2025-06-01'
ORDER BY
    total_price DESC;