데이터베이스/SQL

[SQL] 여러 개의 테이블 사용하기(기본키, 외래키, JOIN)

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

학습 내용


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

 

 

 


🛠 기본키 PK: primary key

  • PK는 하나의 컬럼이 지정되어 있으며, 해당 컬럼이 데이터는 테이블 내 유일성을 보장한다.
  • 유일성을 보장해야 하니까 NULL값은 허용되지 않는다.

 

 

🛠 외래키 FK: foreign key

  • 다른 테이블과 관계를 맺는 경우, 다른 테이블의 기본키를 참조하는 컬럼
  • 기본키를 참조하기 때문에 외래키 값은 참조하는 기본키의 값과 동일하거나 null값이다. 
  • 🔥즉, 외래키는 기본키와 동일한 값의 종류와 범위를 가진다.

 

 

 


🛠 JOIN ⭐⭐⭐

  • 관계형 데이터베이스의 핵심
  • 조인 유형을 지정하지 않으면 기본적으로 내부 조인(INNER JOIN)을 실행한다.
  • 두 테이블을 조인할 때, 사용한 열의 이름이 동일할 경우, ON대신 USING을 사용할 수 있다.

 

 

2개의 테이블 JOIN

mysql("""

SELECT *
FROM orders AS o
JOIN customers AS c
ON o.customerId = c.customerId

""")

ON 에 두 테이블을 합치는 기준을 작성한다.

 

 

SELECT orderId, customerId, orderDate, name 
FROM orders  
JOIN customers  
USING (customerId);

🔍 USING을 사용한 이유?

  • orders 테이블과 customers 테이블에 customerId 라는 동일한 열이 존재한다고 가정.
  • ON orders.customerId = customers.customerId 대신 USING (customerId) 를 사용하면 중복된 열을 한 번만 표시할 수 있다.
  • 🔥즉, customerId는 결과에서 한 번만 출력됨.

👉 USING은 동일한 열 이름을 기준으로 조인할 때 깔끔하게 사용할 수 있다.🚀

 

 

 

3개의 테이블 JOIN

mysql("""

SELECT *
FROM orders AS o
JOIN customers AS c
ON o.customerId = c.customerId
JOIN employees AS e
ON c.employeesId = e.employeesId

""")

먼저 2개의 테이블을 JOIN하고 그 결과를 확인한 후

나머지 1개의 테이블을 JOIN해야 실수를 줄일 수 있다.

 

 

🔍JOIN문의 실행 순서는 어떻게 되지?❓

👉 SQL의 JOIN 문은 왼쪽에서 오른쪽으로 순차적으로 실행된다.

따라서 2개의 테이블 조인 결과에 나머지 1개 테이블을 조인한 결과가 출력된다.🚀

 

 

 

🛠 JOIN의 종류

  • 🛠 INNER JOIN (INNER생략 가능) : 공통된 부분 기준
  • OUTER JOIN
    • LEFT JOIN: 왼쪽 테이블 기준, 현업에서 많이 쓰는 방식
    • RIGHT JOIN: 오른쪽 테이블 기준, 현업에서 거의 쓰지 않음

 

 

  • ON절의 조건을 만족하는 데이터만 가져온다.
  • 테이블에 일치하는 행이 있으면 가져오고, 일치하는게 없으면 가져오지 않는다.

 

 

🛠 OUTER JOIN(LEFT JOIN, RIGHT JOIN)

  • 조건을 만족하지 않은 행도 모두 출력하기 위한 조인 기법
  • INNER JOIN 조건을 만족하지 못해서 누락되는 행을 출력하기 위해 사용
    • 일치하지 않는 데이터를 출력하고자 할 때 유용
  • LEFT (OUTER) JOIN으로 사용하며, OUTER는 생략

 

 

 

mysql("""

SELECT *
FROM orders AS o  
LEFT JOIN customers AS c
ON o.customerId = c.customerId
ORDER BY o.customerId

""")

테이블 orders 의 모든 행을 기준으로, customerId가 같은 것이 테이블에 있으면 합치고, 없으면 customers쪽 컬럼들은 NULL로 채워서 출력한다.

 

 

👉 pandasql에서는 RIGHT JOIN을 사용하면 에러가 뜨므로, 개념 정리에서는 다루지 않을거다.

 

 

 

 

 


다음 포스팅에 UNION이랑 서브쿼리 다뤄야겠다.

 

반응형