MySQL
SQL 중첩 질의 Subquery 조인 join 외래 키 제약조건 FOREIGN KEY 트랜잭션 start commit bollback
윤슬새벽
2025. 6. 20. 12:55
반응형
🔹 1. 중첩 질의 (Subquery)
📌 서브쿼리란?
- 쿼리 안에 포함된 또 다른 SELECT 문
- 주로 WHERE, FROM, SELECT, HAVING 절에 사용
📊 WHERE 절에서의 중첩 질의 종류 (정리표)
술어 유형 | 연산자 예 | 반환 행 | 반환 열 | 상관 쿼리 가능 | 설명 |
비교 | =, <, > | 1행 | 1열 | 가능 | 단일 값과 비교 |
집합 | IN, NOT IN | 여러 행 | 1열 | 가능 | 포함 여부 판단 |
한정 | ANY, ALL | 여러 행 | 1열 | 가능 | 여러 값 중 일부/전체 비교 |
존재 | EXISTS, NOT EXISTS | 무관 | 무관 | 반드시 필요 | 결과 존재 여부 판단 |
✅ 대표 예시: 고객별 평균보다 높은 주문 찾기
SELECT orderid, saleprice
FROM orders o1
WHERE saleprice >= (
SELECT AVG(saleprice)
FROM orders o2
WHERE o2.custid = o1.custid
);
🔹 2. 외래 키 제약조건 (FOREIGN KEY)
✅ 외래 키 연결 방법
ALTER TABLE cart
ADD CONSTRAINT fk_cart_customer
FOREIGN KEY (custid)
REFERENCES customer(custid);
💡 cart 테이블은 customer와 book 테이블의 자식
🔹 3. 트랜잭션 (Transaction)
✅ 기본 흐름
START TRANSACTION;
DELETE FROM book WHERE bookid = 7;
ROLLBACK; -- 되돌리기
- START TRANSACTION: 트랜잭션 시작
- COMMIT: 확정
- ROLLBACK: 취소
🔹 4. 조인 & 집계 활용
✅ 고객별 판매액 구하기
SELECT c.name, SUM(o.saleprice)
FROM customer c
JOIN orders o ON c.custid = o.custid
GROUP BY c.name;
✅ 주문 없는 고객도 포함하려면
SELECT c.name, IFNULL(SUM(o.saleprice), 0)
FROM customer c
LEFT OUTER JOIN orders o ON c.custid = o.custid
GROUP BY c.name;
🔹 5. 뷰(View) 생성 및 조회
✅ 복잡한 조인 결과를 뷰로 저장
CREATE VIEW vw_order_summary AS
SELECT b.bookname, o.orderid, c.name, o.saleprice
FROM book b, orders o, customer c
WHERE b.bookid = o.bookid AND o.custid = c.custid;
✅ 뷰에서 간단하게 조회
SELECT * FROM vw_order_summary;
🔹 핵심 정리 한 줄 요약
주제 | 핵심 요약 |
중첩 질의 | 비교 연산자는 단일값, IN은 다중값, EXISTS는 존재 여부 판단 |
트랜잭션 | START → COMMIT 또는 ROLLBACK으로 데이터 무결성 보장 |
외래 키 | 부모 테이블 참조 제약, ON DELETE 옵션 중요 |
LEFT JOIN | 주문이 없는 고객도 포함하여 0원 처리 가능 |
뷰(View) | 복잡한 조인을 논리 테이블로 저장해서 재사용 |
반응형