database (JOIN, ALIAS, DISTINCT)

김현희·2026년 4월 21일

1. JOIN 이란? (JOIN이 필요한 이유)

  • SQL에서 JOIN은 서로 다른 테이블의 데이터를 특정 기준(공통 컬럼)에 따라 결합하여 하나의 결과로 보여주는 기능
  • 즉, 흩어져 있는 테이블들을 하나로 엮어주는 기술
  • 하나의 SQL에서 여러 번 사용 가능
  • 환자 / 방문 / 검사 / 처방 / 진단은 각각 다른 엔티티로 JOIN이 없으면 환자 스토리를 잇지 못함
  • 데이터를 합치는 기준 : PK와 FK

  • patients 테이블 안에 'patient_id' --> PK
  • admissions 테이블 안에 'patient_id' --> FK
  • 따라서 공통되는 patient_id를 기준으로 join하게 됨

1-1. 주요 JOIN의 종류

a. INNER JOIN (내부 조인)

  • 두 테이블에서 공통된 값이 있는 데이터만 가져옴 (두 집합의 교집합)

    SELECT ... FROM table_A INNER JOIN table_B ON A.key = B.key

  • FROM: 기준이 되는 첫 번째 테이블
  • INNER JOIN: 붙이고 싶은 두 번째 테이블
    * ON: 두 테이블을 연결할 고리(조건식)

b. LEFT (OUTER) JOIN (외부 조인)

  • 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에서 일치하는 데이터가 있으면 연결
  • 일치하는게 없으면 오른쪽 데이터는 NULL로 표시
  • 용도: "주문을 한 번도 안 한 회원까지 포함해서 전체 명단을 보고 싶을 때" 사용

    SELECT A.col1, A.col2, B.col3 FROM table_A LEFT JOIN table_B ON A.key = B.key

c. RIGHT (OUTER) JOIN

  • LEFT JOIN의 반대
  • 오른쪽 테이블의 모든 데이터를 기준으로 가져옴
  • 결과물이 조금 다르게 나오는 경향이 있기 때문에 LEFT JOIN을 위주로 사용하기!

    SELECT * FROM A RIGHT JOIN B ON A.비교대상 = B.비교대상;

d. FULL (OUTER) JOIN

  • 양쪽 테이블의 모든 데이터를 가져와서 일치하는 데이터가 있든 없든 전부 합쳐서 보여줌. (두 집합의 합집합)

SELECT * FROM A FULL JOIN B ON A.비교대상 = B.비교대상;

‼️"데이터를 관리하기 편하게 쪼개놓는 것은 정규화, 필요할 때 다시 합쳐서 보는 것은 JOIN"!

1-2. JOIN + WHERE

  • 순서가 어긋나면 데이터 누락이 나올 수도 있음
  • 특히 WHERE안에 JOIN 조건을 사용하면 데이터가 잘리는 경우가 많음

SELECT A.col1, A.col2, B.col3 FROM table_A
INNER/LEFT JOIN table_B ON A.key = B.key
WHERE 조건


2. ALIAS(별칭)

  • 테이블이나 컬럼이름을 일시적으로 짧거나 읽기 쉬운 다른 이름으로 바꾸어 부르는 것
  • AS 키워드를 사용하여 설정
  • 실제 데이터베이스의 이름이 바뀌는 것이 아니라 해당 쿼리가 실행되는 동안에만 유효한 별명이 생기는 것
  • 이름 줄이고 가독성 높임 + 쿼리 간소화 (테이블 별칭) + 결과 컬럼 이름 보기 좋게 만들려고 사용
  • ⭐️ alias는 다른 SELECT에서 재사용 안됨.
  • ⭐️ 동일한 쿼리 내의 WHEREGROUP BY에서는 사용할 수 없음.(대부분 DB 기준) --> 실행순서 때문 :SELECT에서 alias가 생성되는데 WHERE는 SELECT보다 먼저 실행됨.

WHERE는 SELECT보다 먼저 실행됨

실행 순서:
FROM
WHERE
GROUP BY
HAVING
SELECT ← 여기서 alias 생성됨
ORDER BY

ALIAS
SELECT * From patients as p;
SELECT visitors2025 as vis25,
visitors2026 as vis26 from patients;
SELECT visitors2025 + visitors2026 AS total fron patients;
.
-> patients 테이블의 이름이 p로 변경됨 (쿼리 안에서만 변경됨, 실제 테이블 이름은 안 바뀜)
-> 컬럼들의 이름이 vis25, vis26으로 변경됨
-> 위에 처럼 단순 계산 시 → alias 필요 없으나, 복잡한 쿼리를 사용할 때 alias 없으면 지옥됨.

  1. AS 생략 가능
    SELECT a.name, b.name
    FROM employees a
    JOIN employees b
    ON a.manager_id = b.id;

3. DISTINCT

  • 조회 결과 중 중복된 행(Row)을 제거하고 고유한(Unique) 값만 남기고 싶을 때 사용하는 키워드
  • 예) %%병원에 한 번이라도 내원한 적이 있는 고객들의 명단이 필요 -> DISTINCT를 사용하면 중복을 제거하고 내원환자 명단을 출력할 수 있음.
  • SELECT 키워드 바로 뒤에 작성 (SELECT name, DISTINCT age 처럼 중간에 쓸 수 없음!!)
    *정렬/비교 과정이 필요해서 데이터 양이 많을 때(특히 컬럼 많을수록)는 속도가 조금 느려질 수 있음
  • DISTINCT는 NULL 값도 하나의 고유한 값으로 인정하기 때문에 데이터에 NULL이 여러 개 있다면 결과에는 하나만 표시됨.


SELECT DISTINCT 환자명 FROM 환자정보;

SELECT DISTINCT 지역, 성별 FROM 환자정보;

  • 여러 개의 컬럼을 적으면, 모든 컬럼의 값이 동일한 행을 하나로 취급
  • DISTINCT 지역, 성별은 "지역이 같고 성별까지 같아야" 똑같은 데이터로 취급
    -> (서울, 남성)과 (서울, 여성)은 서로 다른 데이터로 인식되어 둘 다 출력

SELECT COUNT(DISTINCT 진료과) FROM 진료예약내역;

  • ⭐️COUNT(컬럼명) 함수는 기본적으로 NULL을 무시하고 숫자를 셉니다.
    -> SELECT COUNT(category) → 5개 (입력된 row의 갯수)
    -> SELECT DISTINCT category → 과일, 가전, NULL (3줄)
    -> SELECT COUNT(DISTINCT category) → 2 (NULL은 개수에서 제외함)
profile
AI 헬스케어 공부하는 간호사

0개의 댓글