반응형
✅ 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() | 집계 함수 |
✨ 권장 학습 흐름
- SELECT + WHERE + ORDER BY
- JOIN 기본 → 다중 JOIN
- GROUP BY + 집계 함수
- 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 등의 명확한 활용 강조 |
반응형
'MySQL' 카테고리의 다른 글
Explain Current Statement 실수로 대량 데이터 삭제 갱신 방지 (1) | 2025.06.20 |
---|---|
SQL 중첩 질의 Subquery 조인 join 외래 키 제약조건 FOREIGN KEY 트랜잭션 start commit bollback (0) | 2025.06.20 |
MySQL 설치 가이드 Windows용 다운로드 (0) | 2025.06.11 |