오늘은 외래키와 JOIN, UNION에 대해 배웠다.
외래키를 배우면서 외래키에 대해 얼마나 가볍게만 알고 있었는지 생각하게 된 하루였던 것 같다.
그리고 터미널 보는게 눈이 너무 아파서 폰트 바꾸고 크기를 키우니까 좀 나아진 것 같다! 🤩
외래키 (FOREIGN KEY)
외래키는 한 테이블의 특정 컬럼이 다른 테이블의 기본 키를 참조하도록 설정하는 제약 조건이다. 이를 통해 데이터 무결성을 보장하고 참조 관계를 유지할 수 있다.
FOREIGN KEY (자식컬럼) REFERENCES 부모테이블(부모컬럼)
ex) FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
ON DELETE 옵션
외래 키에는 참조 무결성을 위해 부모 테이블의 데이터 삭제 시 자식 테이블의 동작을 정의하는 ON DELETE
옵션과 부모 테이블의 데이터 수정 시 자식 테이블의 동작을 정의하는 ON UPDATE
옵션이 있다.
ON DELETE CASCADE
부모 테이블의 행이 삭제되면 참조하는 자식 테이블의 행도 함께 삭제된다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);
고객 테이블에서 고객이 삭제되면 해당 고객의 주문도 자동으로 삭제된다.
ON DELETE SET NULL
부모 테이블의 행이 삭제되면 자식 테이블에서 해당 자식 컬럼이 NULL
로 변경된다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET NULL
);
고객 테이블에서 고객이 삭제되면 주문 내역 테이블의 customer_id
값이 NULL
로 변경된다.
ON DELETE SET DEFAULT
부모 테이블의 행이 삭제되면 자식 테이블에서 해당 자식 컬럼이 DEFAULT값으로 변경된다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT SET 0,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET DEFAULT
);
고객 테이블에서 고객이 삭제되면 주문 내역 테이블의 customer_id
값이 DEFAULT값으로 설정되어있는 0
으로 변경된다.
ON DELETE RESTRICT
부모 테이블의 행이 자식 테이블에서 참조 중이면 삭제를 제한한다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES Customers(customer_id) ON DELETE RESTRICT
);
고객 테이블에서 고객을 삭제하려 할 때 해당 고객에 대한 구매 내역이 있으면 삭제가 불가능하다.
JOIN
JOIN
은 여러 테이블의 데이터를 조합하여 원하는 정보를 조회할 때 사용한다.
유형 | 설명 |
---|---|
INNER JOIN |
두 테이블에서 일치하는 데이터만 조회한다. |
LEFT JOIN |
왼쪽 테이블을 기준으로 조회하며 일치하는 데이터가 없으면 NULL 을 반환한다. |
RIGHT JOIN |
오른쪽 테이블을 기준으로 조회하며 일치하는 데이터가 없으면 NULL 을 반환한다. |
SELECT s.student_id, s.name, s.grade, c.subject, c.teacher
FROM student s
INNER JOIN class c ON s.class_id = c.class_id;
SELECT s.student_id, s.name, s.grade, c.subject, c.teacher
FROM student s
LEFT JOIN class c ON s.class_id = c.class_id;
SELECT s.student_id, s.name, s.grade, c.subject, c.teacher
FROM student s
RIGHT JOIN class c ON s.class_id = c.class_id;
UNION
UNION
은 여러 개의 쿼리 결과를 동일한 컬럼 구조로 합쳐서 조회할 때 사용한다.
SELECT region, campaign_name, revenue FROM marketing_korea
UNION
SELECT region, campaign_name, revenue FROM marketing_usa
UNION
SELECT region, campaign_name, revenue FROM marketing_europe;
특징 | UNION |
UNION ALL |
---|---|---|
중복 데이터 | 중복을 제외하고 결과 반환 (DISTINCT) | 중복을 포함하여 모든 데이터 반환 |
속도 | 상대적으로 느림 | 상대적으로 빠름 |
사용 목적 | 중복 제거가 필요한 경우 | 중복을 허용하거나 성능을 중시할 때 사용 |
번외) 서브쿼리
서브쿼리는 말 그대로 쿼리 안의 쿼리를 말한다.
서브쿼리는 SELECT
, FROM
, WHERE
, HAVING
절에서 활용할 수 있다.
SELECT c.customer_id, c.name, c.email, p.total_spent
FROM customers c
INNER JOIN (
SELECT customer_id, SUM(amount) AS total_spent
FROM purchases
GROUP BY customer_id
) p ON c.customer_id = p.customer_id
WHERE p.total_spent > 100000;
위 예시처럼 FROM
절에서 하나의 테이블처럼 사용할수도 있고,SELECT
문에서는 하나의 컬럼처럼 사용할 수 있으며WHERE
절과 HAVING
절에서는 특정 조건을 필터링하기 위해 많이 사용한다.
WITH절
서브쿼리를 많이 사용하면 속도가 느려지고 가독성이 떨어진다.
이를 해결하기 위해 WITH
절을 사용하면 가독성이 개선되며 성능 향상에 도움이 되기도 한다.WITH
절은 서브쿼리를 가상의 테이블로 사용하게 해주는 기능이다.
WITH customer_spending AS (
SELECT customer_id, SUM(amount) AS total_spent
FROM purchases
GROUP BY customer_id
)
SELECT c.customer_id, c.name, c.email, cs.total_spent
FROM customers c
INNER JOIN customer_spending cs ON c.customer_id = cs.customer_id
WHERE p.total_spent > 100000;
마무리하며
오늘 수업도 실습을 반복하면서 시간이 후다닥 지나간 것 같다.
예전에 django는 다뤄봤는데 flask는 해본 적이 없어서 내일 flask를 이용해 웹 연동을 해보는 게 가장 기대가 된다!
내일도 즐겁게 배워봐요! 화이팅!!
참고
'회고' 카테고리의 다른 글
[멋쟁이사자처럼 그로스마케팅 부트캠프] 11일차 회고 (6) | 2025.02.17 |
---|---|
[멋쟁이사자처럼 그로스마케팅 부트캠프] 10일차 회고 (11) | 2025.02.14 |
[멋쟁이사자처럼 그로스마케팅 부트캠프] 9일차 회고 (4) | 2025.02.13 |
[멋쟁이사자처럼 그로스마케팅 부트캠프] 7일차 회고 (6) | 2025.02.11 |
멋쟁이사자처럼 그로스 마케팅 부트캠프 1주차 회고 (10) | 2025.02.07 |