데이터 분석/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) | 복잡한 조인을 논리 테이블로 저장해서 재사용 | 

반응형