본문 바로가기
MySQL

SELECT ORDER BY JOIN GROUP BY 조인 집계 함수 그룹별 HAVING

by 윤슬새벽 2025. 6. 13.
반응형

✅ 1. 기초 SELECT 문법 및 조건 검색

목적 SQL 예제 설명
전체 데이터 조회 SELECT * FROM book; 모든 컬럼 출력
특정 컬럼 조회 SELECT bookname, price FROM book; 필요한 열만 출력
조건 검색 WHERE price >= 20000
WHERE bookid = 1
가격 또는 ID 조건
부분 일치 검색 LIKE '축구%', LIKE '_구%' 문자열 패턴 검색
특정 범위 검색 BETWEEN 10000 AND 20000 가격 범위 지정
OR 조건 검색 publisher = '굿스포츠' OR publisher = '대한미디어' 여러 값 중 하나
 

✅ 2. 정렬 (ORDER BY)

목적 SQL 예제 설명
이름순 정렬 ORDER BY bookname ASC 알파벳/가나다순 정렬
가격 → 이름 정렬 ORDER BY price ASC, bookname ASC 다중 정렬 조건
가격 내림차순, 출판사 오름차순 ORDER BY price DESC, publisher ASC 혼합 정렬 가능
 

✅ 3. JOIN (다중 테이블 연결)

목적 SQL 예제 설명
고객 + 주문 연결 FROM customer, orders WHERE customer.custid = orders.custid INNER JOIN 형태
고객 + 주문 + 도서 FROM customer, orders, book WHERE custid=orders.custid AND bookid=orders.bookid 3테이블 조인
도서를 구매하지 않은 고객 포함 LEFT OUTER JOIN 비구매 고객까지 포함 가능
 

✅ 4. 실전 응용 쿼리

목적 SQL 예제 설명
박지성의 총 구매액 SELECT SUM(saleprice) ... WHERE name='박지성' 고객 특정 조건 활용
박지성의 구매 도서 수 COUNT(DISTINCT orderid) 중복 주문 제외
박지성이 구매한 출판사 수 COUNT(DISTINCT book.publisher) 조인으로 출판사 추출
박지성이 구매하지 않은 도서 (예시 누락) NOT IN 혹은 LEFT JOIN WHERE IS NULL 활용 가능
구매 도서 이름/가격/차액 (미완성) SELECT bookname, price, saleprice, (price - saleprice)
 

✅ 5. 집계 함수 + 그룹별 분석 (GROUP BY)

목적 SQL 예제 설명
고객별 총 판매액 SUM(saleprice) GROUP BY customer.name 집계 기본
평균/최저/최고가 포함 AVG(), MIN(), MAX() 다양한 통계 활용
도서 판매 건수 (오류) SUM(DISTINCT orderid) ❌ → COUNT(*)가 정확  
고객별 주문 수량/총액 COUNT(*), SUM(saleprice) 수량/금액 동시 분석
주문 도서 날짜 그룹 GROUP_CONCAT(orderdate) 날짜 문자열 합치기
조건부 그룹 필터 HAVING COUNT(*) >= 2 2권 이상 주문한 고객만 필터
 

🧠 핵심 키워드 요약

문법 설명
SELECT 데이터 조회
FROM 테이블 지정
WHERE 조건 필터
JOIN 테이블 연결
GROUP BY 그룹화 집계
HAVING 그룹 결과 조건 필터
ORDER BY 결과 정렬
DISTINCT 중복 제거
SUM(), AVG(), COUNT() 집계 함수
 

✨ 권장 학습 흐름

  1. SELECT + WHERE + ORDER BY
  2. JOIN 기본 → 다중 JOIN
  3. GROUP BY + 집계 함수
  4. HAVING + 서브쿼리 + OUTER JOIN

❗추가 팁

  • HAVING은 GROUP BY 이후 필터에만 사용됩니다.
  • JOIN 시에는 반드시 ON 조건 또는 WHERE로 관계를 명시해야 정확한 결과가 나옵니다.
  • COUNT(*)는 행 수를 셈, COUNT(DISTINCT)는 중복 제거된 값 수를 셉니다.

✅ 보완해야 할 부분 요약

🔹 1. 실전 쿼리 보완

박지성이 구매하지 않은 도서
SELECT bookname FROM book 
WHERE bookid NOT IN (
  SELECT bookid FROM orders 
  JOIN customer ON orders.custid = customer.custid 
  WHERE name = '박지성'
);

| → NOT IN, 또는 LEFT JOIN ... IS NULL 방식 가능 | |

| 구매 도서 이름/가격/차액 |

SELECT book.bookname, book.price, orders.saleprice, 
       (book.price - orders.saleprice) AS 가격차액
FROM customer, orders, book
WHERE customer.name = '박지성'
  AND customer.custid = orders.custid
  AND orders.bookid = book.bookid;
| → 단순한 산술 연산도 SELECT에 바로 활용 가능 |

🔹 2. 집계 오류 바로잡기

항목 수정 전 수정 후
도서 판매 건수 SUM(DISTINCT orderid) ❌ COUNT(*) 또는 COUNT(DISTINCT orderid) ✅
→ SUM(DISTINCT orderid)는 수치적 의미 없음    
 

🔹 3. 고급 서브쿼리 패턴 요약 추가

출판사별 평균 도서 가격보다 비싼 도서

SELECT bookname, price, publisher
FROM book b
WHERE price > (
  SELECT AVG(price) 
  FROM book 
  WHERE publisher = b.publisher
);

| → 상관 서브쿼리 (correlated subquery) |

| 고객별 평균 구매액 > 도서 평균 가격 |

SELECT custid, AVG(saleprice)
FROM orders
GROUP BY custid
HAVING AVG(saleprice) > (SELECT AVG(price) FROM book);
| → HAVING에 서브쿼리 포함 가능 |

🔹 4. 함수 및 문법 고급 정리

함수/문법 설명
GROUP_CONCAT() 그룹된 값을 쉼표로 묶어 문자열로 표시 (orderdate 등)
EXISTS, IN 존재 조건 필터링. EXISTS는 성능 우위일 수 있음
JOIN + ON vs JOIN + WHERE WHERE도 가능하지만, 명시적 ON이 가독성과 명확성에서 우수
 

✅ 기존 요약본과 달랐던 핵심 추가 항목

구분 보완 내용
실전 응용 NOT IN, (price - saleprice) 차액 계산
서브쿼리 상관 서브쿼리 패턴 보완
집계 정확성 SUM(DISTINCT orderid) → COUNT(*) 보정
고급 문법 EXISTS, GROUP_CONCAT, JOIN ON 등의 명확한 활용 강조

반응형