반응형

관계형 데이터베이스 정규화 이론 완전 정복!

여러분 혹시, 엑셀처럼 막 복사해서 만든 테이블이 왜 문제가 되는지 고민해 본 적 있나요?
데이터가 반복되고 수정도 어렵고…
그거, 정규화로 해결할 수 있어요!

 

 

안녕하세요 😊

오늘은 관계형 데이터베이스(RDBMS)를 다룰 때 절대 빼놓을 수 없는 이론,

바로 정규화(Normalization)에 대해 제대로 파헤쳐 보려고 해요.

처음엔 조금 어려워 보여도, 한 번 개념이 잡히면 나중에 설계나 개발할 때 정말 큰 무기가 되거든요.

특히, 1NF → 2NF → 3NF의 흐름과 함께 직접 실습해보는 과정까지!

데이터가 어떻게 더 깔끔하고 효율적으로 변하는지 직접 확인할 수 있을 거예요.

그럼 같이 출발해 볼까요? 🚀

1. 정규화란 무엇인가요? 개념과 등장 배경 🔍

데이터베이스를 설계하다 보면, 데이터를 어떻게 분리하고 어떤 식으로 테이블을 나눠야 할지 고민될 때가 있어요.

바로 이때! 정규화(Normalization)라는 개념이 등장합니다.

정규화는 데이터 중복을 줄이고, 데이터 무결성을 높이기 위한 데이터베이스 설계 원칙이에요.

💡 정규화란?

정규화는 데이터를 체계적으로 분해해 논리적 구조로 만드는 과정입니다.

쉽게 말해,

"테이블 안에 들어 있는 정보들이 서로 충돌하거나 불필요하게 반복되지 않도록" 정리하는 거죠.

  • 데이터를 중복 없이 저장하고
  • 삽입, 수정, 삭제 시 오류가 없도록 만들고
  • 각 데이터가 '한 곳'에서만 관리되도록 하기 위해 존재합니다

📜 정규화의 등장 배경

정규화는 1970년대에 E.F. Codd라는 천재 수학자 겸 컴퓨터 과학자에 의해 제안되었습니다.

그는 관계형 데이터베이스의 개념을 처음 정의하면서, 데이터의 논리적 일관성유지 보수의 편의성을 위해 정규형(Normal Forms)을 도입했죠.

처음에는 단순한 규칙이었지만, 점점 데이터의 복잡도가 높아지면서 1NF, 2NF, 3NF, BCNF, 4NF, 5NF처럼 여러 단계로 발전하게 되었습니다.

이번 글에서는 그 중에서도 가장 핵심이 되는 1NF, 2NF, 3NF에 초점을 맞춰 소개할게요!

🎯 정규화의 핵심 목표

목표 설명
중복 최소화 같은 정보를 여러 번 저장하지 않도록 테이블을 나눔
무결성 유지 데이터 간 논리적 오류나 불일치 방지
유연한 구조 변경이 쉽게 가능한 설계로 확장성 향상

자, 이제 정규화의 개념과 역사, 목적까지 알아봤으니… 다음은 왜 이게 중요한지,

정규화를 하지 않았을 때 어떤 일이 벌어지는지 살펴볼 차례입니다!

 

 

2. 왜 정규화가 필요할까요? 비정규형의 문제점들 🤔

정규화가 중요한 이유를 한 문장으로 정리하자면, 데이터의 혼란을 방지하고 효율적으로 관리하기 위해서입니다.

비정규형 테이블은 언뜻 보면 한눈에 들어오고 관리가 쉬워 보일 수 있지만, 실제 운영에서는 심각한 문제를 야기합니다.

⚠️ 비정규형 테이블의 예시

예를 들어, 아래와 같은 학생 수강 테이블이 있다고 해볼게요.

학번 이름 수강과목
2023001 김지민 데이터베이스, 운영체제
2023002 이수현 프로그래밍언어

위처럼 수강과목을 쉼표로 나열하게 되면, 과목별로 검색하기가 어려워지고, 특정 과목을 삭제하거나 수정하려면 문자열 전체를 분석해야 하죠.

이게 바로 비정규형의 대표적인 문제입니다.

🧨 비정규형이 일으키는 대표적 문제들

  1. 📌 중복 발생 – 같은 정보가 여러 행에 중복 저장됨
  2. 📌 삽입 이상 – 특정 데이터를 삽입하려 해도 다른 정보가 필요함
  3. 📌 삭제 이상 – 하나의 데이터를 지우면 관련 없는 정보까지 삭제됨
  4. 📌 수정 이상 – 같은 데이터를 여러 곳에서 동시에 수정해야 함

즉, 정규화가 안 된 상태에서는 데이터의 일관성을 유지하기가 매우 어려워지고, 유지보수 비용도 급증합니다.

💬 현실 속 사례

예전에 학사 시스템을 관리할 때, 수강신청 내역이 전부 하나의 테이블에 ‘CSV 문자열’로 저장되어 있었어요.

검색은 느리고, 수정을 잘못해서 다른 과목까지 삭제되는 사태도 발생했죠.

그 경험 이후, 정말 간절히 정규화의 필요성을 절감했습니다 😅

그럼 이제 정규화를 적용하면 구체적으로 어떻게 바뀌는지, 1NF부터 살펴보도록 할게요!

 

 

3. 제1정규형(1NF)의 개념과 예시 ✨

정규화의 첫 단계인 제1정규형(1NF)은 모든 정규화의 시작점이에요.

이 단계에서는 모든 컬럼이 원자값(Atomic Value)을 갖도록 만드는 것이 핵심입니다.

🔍 제1정규형(1NF)의 정의

  • 모든 컬럼이 **단일 값(Atomic Value)**만 가져야 함
  • 반복 그룹이나 리스트 형태로 저장된 값은 허용하지 않음

즉, 열마다 하나의 값만 존재하도록 테이블을 구성해야 한다는 뜻이에요.

📌 예시로 살펴보는 1NF 적용

앞서 등장했던 비정규형 테이블을 다시 불러와 볼게요:

학번 이름 수강과목
2023001 김홍도 데이터베이스, 운영체제

이 테이블은 1NF를 만족하지 못합니다.

이유는 수강과목이라는 컬럼에 두 개의 값이 들어있기 때문이에요.

이를 1NF로 바꾸면 아래처럼 각 과목을 분리한 행 단위로 나눠야 합니다:

학번 이름 수강과목
2023001 김홍도 데이터베이스
2023001 김홍도 운영체제

이제야 진정한 1NF 정규화 테이블이 되었죠?

이렇게 함으로써 검색, 필터링, 수정이 훨씬 쉬워지고, SQL 쿼리도 깔끔하게 동작합니다.

✅ 1NF의 핵심 요약

요소 설명
원자성 모든 컬럼 값은 더 이상 나눌 수 없는 원자값이어야 함
중복 제거 여러 개의 값을 하나의 셀에 저장하지 않음
정규화 시작점 2NF와 3NF를 위한 전제 조건

그럼 다음 단계인 2NF에서는 어떤 일이 벌어질까요?

여기서부터 본격적으로 ‘의미의 분리’가 시작됩니다!

 

 

4. 제2정규형(2NF)의 개념과 예시 🔄

제2정규형(2NF)은 1NF를 만족한 상태에서 부분 함수 종속을 제거하는 단계예요.

여기서 중요한 개념이 바로 ‘복합 기본키’와 ‘부분 종속성’입니다.

📌 제2정규형(2NF)의 조건

  • 테이블이 1NF를 만족해야 함
  • 기본키가 복합키인 경우, 부분적으로만 종속되는 속성을 제거해야 함

즉, 기본키 전체가 아닌 일부 컬럼에만 의존하는 데이터를 다른 테이블로 분리해야 해요.

📚 예시로 살펴보기

1NF를 만족한 아래의 테이블을 보세요. 기본키는 (학번, 과목명) 입니다.

학번 이름 과목명 성적
2023001 김지민 데이터베이스 A
2023001 김지민 운영체제 B+

여기서 이름은 과목과는 무관하게 학번에만 종속되죠?

이게 바로 부분 종속입니다.

🔧 2NF 적용 후 테이블 분리

이럴 땐 아래처럼 두 개의 테이블로 나누어야 해요:

[학생 테이블]

학번 이름
2023001 김지민

[성적 테이블]

학번 과목명 성적
2023001 데이터베이스 A
2023001 운영체제 B+

이렇게 나누면 부분 종속성이 제거되고, 하나의 데이터가 두 번 이상 등장하는 일이 줄어들게 됩니다.

📌 핵심 요약: 2NF

요소 설명
1NF 기반 1NF를 만족한 테이블만 2NF로 정규화 가능
부분 종속 제거 복합키의 일부에만 의존하는 속성 제거
테이블 분리 의미 단위별 테이블로 나누어 관리

자, 이제 2NF까지 잘 정리되었어요.

그럼 다음은 마지막 정규형 중 가장 많이 쓰이는 제3정규형(3NF)에 대해 알아볼 차례입니다!

 

 

5. 제3정규형(3NF)의 개념과 예시 🧹

드디어 도달했습니다.

정규화의 핵심 중 핵심, 바로 제3정규형(3NF)입니다.

이 단계에 도달하면 대부분의 테이블은 정상적인 관계형 구조로 볼 수 있어요.

🧩 제3정규형(3NF)이란?

  • 테이블이 2NF를 만족해야 함
  • 이행적 함수 종속(Transitive Dependency)을 제거해야 함

좀 더 쉽게 말하면, 기본키가 아닌 다른 컬럼에 종속된 컬럼이 존재하면 안 된다는 뜻이에요.

📚 예제로 이해하는 3NF

다음 테이블을 살펴보세요. 기본키는 학번입니다.

학번 학생명 학과코드 학과명
2023001 김지민 CS101 컴퓨터공학과

여기서 학과명학번이 아니라 학과코드에 종속되어 있어요.

즉, 이행적 종속이 발생하고 있는 거죠!

🔧 3NF로 변환하기

이럴 땐 학과 테이블을 분리해서 종속성을 제거해야 합니다!

[학생 테이블]

학번 학생명 학과코드
2023001 김지민 CS101

[학과 테이블]

학과코드 학과명
CS101 컴퓨터공학과

이제 학생 테이블은 학과명에 대해 알지 못하고, 학과 테이블이 그 역할을 맡게 되었어요.

이게 바로 3NF의 핵심입니다

모든 비기본키 속성은 기본키에만 종속되어야 한다는 원칙!

📝 핵심 요약: 3NF

요소 설명
2NF 기반 3NF는 2NF를 만족한 테이블을 대상으로 함
이행 종속 제거 기본키가 아닌 컬럼이 다른 컬럼에 의존하지 않도록 분리
의미 단위 분리 테이블마다 명확한 의미와 책임을 갖도록 구조화

정규화는 여기까지가 실무에서 가장 자주 활용되는 단계예요.

이제 실제 테이블을 직접 정규화하는 실습으로 넘어가 볼까요? 😎

 

 

6. 실전! 비정규 테이블을 3NF까지 정규화하기 실습 💻

이제까지 배운 정규화 이론들을 바탕으로,

실제 예시 테이블을 1NF → 2NF → 3NF로 직접 정규화해보는 실습을 해볼게요.

이해를 위해 간단하면서도 실무에서 자주 나오는 학생-수업-학과 정보를 활용하겠습니다.

🧾 Step 0. 비정규 테이블 예시

학생ID 학생이름 학과명 수강과목 교수명
1001 홍길동 컴퓨터공학과 데이터베이스, 운영체제 김교수

문제가 무엇일까요?

수강과목이 여러 개로 원자값이 아님은 물론, 교수명도 과목별로 다를 수 있는데 하나의 셀에 통합되어 있어서 데이터 무결성에 위협이 됩니다.

✅ Step 1. 1NF 적용

수강과목을 각각 행으로 나누어 원자값을 만족시킵니다.

학생ID 학생이름 학과명 수강과목 교수명
1001 홍길동 컴퓨터공학과 데이터베이스 김교수
1001 홍길동 컴퓨터공학과 운영체제 김교수

✅ Step 2. 2NF 적용

기본키가 (학생ID, 수강과목)인 경우, 학과명은 학생ID에만 종속되므로 학생 정보를 별도의 테이블로 분리합니다.

[학생 테이블]

학생ID 학생이름 학과명
1001 홍길동 컴퓨터공학과

[수강 테이블]

학생ID 수강과목 교수명
1001 데이터베이스 김교수
1001 운영체제 김교수

✅ Step 3. 3NF 적용

교수명은 과목에 따라 결정되므로,

이행 종속을 없애기 위해 교수 정보를 분리합니다.

[교과목 테이블]

과목명 교수명
데이터베이스 김교수
운영체제 김교수

이제 테이블 간 종속성이 모두 제거되었고,

각 테이블은 하나의 주제와 역할만을 담당하게 되었어요.

이것이 바로 3NF 정규화의 완성입니다! 🎉

 

 

🎯 데이터 설계의 기초 체력!

정규화는 단순한 이론이 아니라, 모든 데이터베이스 설계의 근간입니다.

이번 글에서 1NF부터 3NF까지 개념을 정리하고, 실전 예제까지 적용해보면서 느끼셨겠지만, 정규화를 통해 데이터 구조를 '깔끔하고, 안전하게' 만들어두면 향후 유지보수, 검색 속도, 무결성 관리에서 엄청난 차이를 만들어냅니다.

 

데이터가 많은 시대, 정규화는 데이터 정리정돈의 첫걸음이에요.

하지만 때론 과한 정규화는 성능 저하를 부를 수도 있다는 점도 기억해두세요.

실전에서는 정규화와 비정규화(denormalization)를 적절히 병행하는 것이 핵심이랍니다.

 

🧠 앞으로 데이터베이스를 설계하거나 테이블을 만들 때, 정규화의 관점에서 구조를 한 번 더 점검해보세요.

      여러분의 데이터가 훨씬 더 강력해질 거예요!

반응형
반응형

ORDER BY와 LIMIT 사용법 완벽 정리
: 정렬과 데이터 추출의 핵심

여러분, SQL에서 데이터를
"예쁘게" 정렬하고,
필요한 "딱 몇 개"만 뽑아내고 싶었던 적 없으셨나요?
이 두 가지, 생각보다 엄청 자주 쓰입니다!

 

 

안녕하세요, 데이터베이스를 배우는 우리 초보 개발자 여러분!

오늘은 SQL 쿼리 중에서도 실무에서 정말 자주 쓰이는 핵심 문법 두 가지, ORDER BYLIMIT에 대해 자세히 알아보려 해요.

게시판 글을 최신순으로 정렬한다든지, 인기 상품 상위 10개만 뽑는다든지 하는 아주 흔한 상황에서 이 문법들이 사용됩니다.

실제 실습 예제도 준비했으니, 끝까지 따라오시면 확실히 익히실 수 있어요.

그럼 지금 바로 시작해볼까요? 😎

1. ORDER BY 기본 개념 🧭

SQL에서 데이터를 조회할 때, 무작위로 나열된 결과는 종종 불편하죠.

예를 들어 게시판에서 최근 글이 위에 뜨지 않는다면 얼마나 불편할까요?

그래서 등장한 게 바로 ORDER BY 구문입니다.

 

ORDER BY는 조회한 데이터 결과를 정렬할 수 있게 해주는 구문이에요.

기본적으로 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있어요.

기본 문법 구조

SELECT * FROM 테이블명
ORDER BY 컬럼명 [ASC | DESC];

✔ 예시로 이해하기

SELECT * FROM posts
ORDER BY created_at DESC;

 

위 쿼리는 posts라는 테이블에서 데이터를 조회하면서 created_at 컬럼 기준으로 내림차순(DESC),

즉 가장 최신 글부터 정렬하는 예입니다.

ORDER BY를 쓸 때 꼭 알아야 할 3가지

  • 기본 정렬은 오름차순(ASC)이며, 생략하면 ASC가 기본값입니다.
  • 여러 개의 컬럼을 쉼표로 나열하면 순차적으로 정렬됩니다.
  • NULL 값은 보통 가장 뒤로 정렬되지만 DB에 따라 다를 수 있어요.

📝 TIP: 컬럼 별칭으로도 정렬 가능해요!

SELECT id, title, created_at AS date
FROM posts
ORDER BY date DESC;

 

AS로 만든 별칭(date)으로도 ORDER BY를 사용할 수 있어요. 보기 편한 이름으로 바꾸면 유지보수에도 좋습니다.

정리 테이블 🧩

문법 설명 예시
ORDER BY 컬럼명 ASC 오름차순 정렬 나이 적은 순서, 등록일 빠른 순
ORDER BY 컬럼명 DESC 내림차순 정렬 최근 글 순, 점수 높은 순

2. 최신순 vs 오래된순 정렬 실습 📅

정렬의 진짜 실전은 바로 여기서 시작돼요.

우리는 게시판에서 글을 볼 때 최신글이 위로 올라오길 기대하죠.

반대로, 글 작성 순서대로 오래된 글부터 보고 싶을 때도 있어요.

이럴 때 사용하는 게 ORDER BY created_at DESC / ASC입니다.

🧪 실습 1: 게시판 글을 최신순으로 정렬

SELECT id, title, created_at
FROM board
ORDER BY created_at DESC;

 

위 쿼리는 board 테이블에서 글 목록을 조회하면서 created_at을 기준으로 최신순(DESC)으로 정렬합니다. 게시판처럼 최신글을 위에 보여주는 경우에 딱입니다.

🧪 실습 2: 게시판 글을 오래된 순으로 정렬

SELECT id, title, created_at
FROM board
ORDER BY created_at ASC;

 

이번에는 ASC를 사용해서 오래된 순서로 정렬했어요. 일반적으로 고객 문의 내역, 댓글 기록 등 처음부터 순서대로 보여줘야 하는 경우에 활용됩니다.

📋 DESC vs ASC 비교 테이블

옵션 의미 사용 예시
DESC 내림차순 (큰 값 → 작은 값) 최신 게시글, 점수 높은 순, 가격 높은 순
ASC 오름차순 (작은 값 → 큰 값) 오래된 게시글, 점수 낮은 순, 가격 낮은 순

💡 정렬 기준이 숫자일 경우

숫자 컬럼도 똑같이 ORDER BY에 사용 가능합니다.

예를 들어 조회수 높은 글부터 보고 싶다면 ORDER BY view_count DESC처럼 쓰면 됩니다.

 

 

3. LIMIT으로 원하는 개수만 추출하기 🎯

SQL로 데이터를 조회할 때, 모든 데이터를 다 가져올 필요는 없죠.

게시판에서 상위 5개 글만, 인기 상품 중 상위 10개만 보여주고 싶을 때도 있어요.

이럴 때 LIMIT 구문을 사용합니다.

 

LIMIT은 말 그대로 가져올 행(Row)의 수를 제한하는 역할을 해요.

특히 데이터가 많은 테이블에서 쿼리 성능을 올릴 때도 유용하죠.

기본 문법 구조

SELECT 컬럼명 FROM 테이블명
LIMIT 개수;

 

예를 들어 최근 등록된 글 5개만 보고 싶다면 이렇게 쓸 수 있어요:

SELECT * FROM board
ORDER BY created_at DESC
LIMIT 5;

 

여기서 ORDER BY와 LIMIT을 같이 쓴 게 핵심이에요.

정렬 먼저 한 다음, 위에서부터 5개만 보여주는 거죠.

LIMIT과 OFFSET 같이 쓰기

OFFSET은 LIMIT과 함께 쓰이면 몇 번째 행부터 보여줄지 정할 수 있어요.

페이지네이션(Pagination)에서 자주 사용됩니다.

SELECT * FROM board
ORDER BY created_at DESC
LIMIT 5 OFFSET 5;

 

위 쿼리는 6번째부터 5개의 데이터를 보여줍니다.

즉, 첫 페이지가 LIMIT 5, 두 번째 페이지는 OFFSET 5, LIMIT 5 이렇게 되는 구조죠.

LIMIT 사용 시 주의사항 🔍

  • 정렬 없이 LIMIT만 쓰면, 어떤 기준으로 잘렸는지 예측 불가예요.
  • OFFSET은 데이터가 많아질수록 성능에 영향이 큽니다. 인덱스 최적화 고려해야 해요.
  • LIMIT만 단독으로 쓰면 랜덤 정렬처럼 보여질 수 있어요. ORDER BY필수로 붙여주세요!

💡 예시 테이블 요약

쿼리 설명
LIMIT 10 앞에서 10개만 가져옴
LIMIT 5 OFFSET 10 11번째부터 5개 가져옴
ORDER BY price DESC LIMIT 3 가격 높은 순으로 3개 상품 추출

4. 상위 10개 상품 추출 실습 🛒

이번에는 실무에서 정말 자주 나오는 실습을 해볼게요!

예를 들어 쇼핑몰이나 포털에서 "인기 상품 TOP 10" 목록을 보여줘야 할 때 어떻게 할까요?

바로 ORDER BYLIMIT의 조합이 필요한 순간입니다.

📊 실습: 판매량 기준 상위 10개 상품 조회

SELECT id, product_name, sales_count
FROM products
ORDER BY sales_count DESC
LIMIT 10;

 

이 쿼리는 products 테이블에서 sales_count가 많은 순서대로 상위 10개 상품을 추출합니다.

마케팅 페이지나 홈화면 인기 상품 영역에 쓰기 딱 좋은 쿼리죠!

🎯 실전 팁: 다양한 기준으로 정렬할 수 있어요

  • 별점 높은 순: ORDER BY rating DESC
  • 가격 낮은 순: ORDER BY price ASC
  • 리뷰 수 기준 정렬: ORDER BY review_count DESC

📋 다양한 정렬 조합 예시 테이블

쿼리 설명
ORDER BY price DESC LIMIT 10 가장 비싼 상품 10개
ORDER BY created_at DESC LIMIT 10 최근 등록된 상품 10개
ORDER BY rating DESC LIMIT 10 별점이 가장 높은 TOP10

⚠️ 순위 정보가 필요할 땐?

MySQL 기준으로는 ROW_NUMBER()RANK() 같은 윈도우 함수와 함께 LIMIT을 쓰면 순위 기반 추천 시스템도 구현할 수 있습니다.

 

 

5. ORDER BY와 LIMIT 함께 쓰기 꿀팁 🧪

지금까지 배운 ORDER BYLIMIT을 제대로 쓰기 위해선 둘을 같이 사용하는 패턴에 익숙해져야 합니다.

생각보다 조합이 중요하거든요!

📐 패턴 1: 정렬 후 제한

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 5;

 

이 패턴은 정렬이 먼저, 제한은 그 다음이에요.

최신순으로 정렬된 결과에서 상위 5개만 가져오는 방식이죠.

실무에선 이 구조가 기본이에요!

🧭 패턴 2: 여러 컬럼 정렬 + LIMIT

SELECT * FROM products
ORDER BY category ASC, sales_count DESC
LIMIT 10;

 

카테고리별로 정렬한 뒤, 각 카테고리 내에서 판매량 높은 순으로 정렬한 결과 중 상위 10개를 출력하는 예시입니다.

복합 정렬에도 LIMIT은 잘 작동합니다!

💡 만약 정렬을 생략한다면?

LIMIT만 사용하면 데이터베이스 엔진의 내부 처리 순서에 따라 무작위처럼 보이는 결과를 보여줄 수 있어요.

이건 매우 위험합니다.

정렬 없이 LIMIT 쓰는 건 금물!

📋 ORDER BY + LIMIT 활용 예시 모음

목적 SQL 예시
최신 게시글 3개 ORDER BY created_at DESC LIMIT 3
조회수 높은 글 1개 ORDER BY views DESC LIMIT 1
카테고리별 인기 상품 상위 5개 ORDER BY category, sales DESC LIMIT 5

🎁 보너스 팁: LIMIT 없이 정렬만 할 수도 있어요

꼭 LIMIT을 써야 하는 건 아니에요.

ORDER BY만으로도 결과를 보기 좋게 정렬할 수 있답니다.

하지만 화면에 딱 필요한 수만 보여주려면 LIMIT은 필수죠!

 

 

6. 실수하기 쉬운 포인트와 정리 ✍️

ORDER BY와 LIMIT은 간단해 보이지만, 초보자들이 자주 실수하는 포인트도 많아요.

특히 정렬 기준 없이 LIMIT만 쓰거나, 컬럼 타입을 착각해서 엉뚱한 결과를 얻는 경우도 많습니다.

여기에서 중요한 부분을 다시 정리해볼게요!

❌ 자주 하는 실수

  • 정렬 없이 LIMIT만 사용 → 결과가 매번 달라질 수 있어요!
  • ORDER BY할 때 컬럼명이 잘못되면 오류 발생 → 오타 조심!
  • OFFSET을 너무 크게 주면 성능 저하 → 페이징 처리 최적화 필요

📌 핵심 요약

  1. ORDER BY는 정렬 기준을 지정할 때 사용 (ASC: 오름차순, DESC: 내림차순)
  2. LIMIT은 조회할 행의 개수를 제한
  3. 두 문법은 함께 사용하는 것이 일반적
  4. OFFSET으로 페이징 구현 가능
  5. 정렬 기준 없이 LIMIT만 쓰는 건 위험!

🔚 마무리하며…

지금까지 SQL에서 ORDER BYLIMIT을 어떻게 활용하는지 배워봤어요.

정렬과 출력 개수 제한은 거의 모든 실무에서 필요한 기본 중의 기본입니다.

게시판, 상품 리스트, 페이징, 추천 리스트 등 정말 다양하게 쓰여요.

 

이제 여러분도 직접 실습해보면서 감을 익혀보세요.

꼭 한두 번 삽질(?)해보는 것도 실력 향상에 도움이 된답니다 😉

 

다음엔 RANK()GROUP BY 같은 조금 더 복잡한 쿼리로 또 만나요!

반응형
반응형

조건문과 연산자 실습예제 🧪 실무 데이터로 배우는 SQL 조건 활용법

"조건문을 제대로 쓰면 데이터도 내 맘대로 조작 가능!"
실제 회원과 상품 데이터를 대상으로 실습하며 조건문을 마스터해봅시다.

 

 

안녕하세요! 😊

이번 시간에는 SQL의 핵심 기능 중 하나인 조건문과 연산자를 직접 실습 예제로 배워볼 거예요.

단순한 WHERE 절은 물론이고, 실제 많이 쓰이는 회원 테이블, 상품 테이블 데이터를 기반으로, 조건을 걸어 원하는 데이터를 조회하고 수정해보는 경험을 할 수 있어요.

 

특히 이 글에서는 두 가지 핵심 실습을 진행합니다:

1. 회원 테이블에서 다양한 조건으로 회원 조회

2. 상품 테이블에서 조건에 따라 가격 일괄 변경

 

SQL 초보자도 이해할 수 있도록 차근차근 설명하고, 실습용 SQL도 바로 복사해 쓸 수 있게 정리했어요.

함께 시작해볼까요?

1. 실습에 사용할 테이블 구조 소개 🗂️

이번 실습에서는 회원 테이블(member)상품 테이블(product)을 사용합니다.

이 두 테이블은 실제 쇼핑몰이나 회원관리 시스템에서 자주 쓰이는 구조로, 실무 감각을 익히기에 딱 좋아요!

👤 member (회원 테이블)

컬럼명 데이터 타입 설명
id INT 회원 고유 ID
name VARCHAR(50) 회원 이름
age INT 나이
gender CHAR(1) 성별 (M/F)
join_date DATE 가입일

🛍️ product (상품 테이블)

컬럼명 데이터 타입 설명
id INT 상품 고유 ID
name VARCHAR(100) 상품명
price INT 가격
stock INT 재고 수량
category VARCHAR(30) 카테고리

이제 실습 준비는 끝났습니다!

다음부터는 이 테이블들을 활용해서, 조건문을 직접 사용해보는 실습을 진행할 거예요.

먼저 회원 테이블에서 조건에 맞는 회원 조회 실습부터 시작해볼게요! 😊

 

 

2. 회원 테이블에서 조건에 맞는 회원 조회하기 👤

회원 정보를 조회할 때는 다양한 조건을 사용할 수 있어요.

성별, 나이, 가입일, 이름 포함 여부 등 여러 조건을 조합하면 원하는 회원 데이터를 정확히 골라낼 수 있답니다.

✅ 예제 1. 나이가 30세 이상인 회원 조회

SELECT * FROM member WHERE age >= 30;

✅ 예제 2. 여성(F) 회원 중 20대만 조회

SELECT * FROM member
WHERE gender = 'F'
AND age BETWEEN 20 AND 29;

✅ 예제 3. 이름에 '김'이 들어가는 회원 조회

SELECT * FROM member
WHERE name LIKE '%김%';

 

%와일드카드로, 앞뒤 어떤 문자도 가능하다는 의미예요.

✅ 예제 4. 최근 1개월 이내 가입한 회원

SELECT * FROM member
WHERE join_date >= CURDATE() - INTERVAL 1 MONTH;

 

CURDATE()는 오늘 날짜를 반환하고, INTERVAL로 기간을 조절할 수 있어요. 주로 신규 회원 분석에 유용하죠.

📌 실전 팁

  • 조건이 많아질수록 AND, OR, 괄호를 적절히 사용하세요.
  • LIKE는 인덱스를 타지 않을 수 있으니 성능 유의!
  • 날짜 비교 시 INTERVAL 활용은 매우 유용합니다.

다음 파트에서는 상품 테이블을 조건에 따라 업데이트하는 실습을 진행해볼게요! 😎

 

 

3. 상품 테이블에서 특정 조건으로 가격 변경하기 💸

이번에는 product 테이블에서 조건에 맞는 상품들의 가격을 일괄 수정하는 실습을 진행할 거예요.

이건 마케팅이나 세일 적용 시 아주 흔하게 사용되는 기능이에요.

✅ 예제 1. 재고가 0인 상품 가격을 0으로 변경

UPDATE product
SET price = 0
WHERE stock = 0;

 

재고가 없는 상품은 판매 중지 처리의 의미로 가격을 0으로 설정하는 방식이에요.

✅ 예제 2. 카테고리가 ‘전자제품’이고, 가격이 50,000원 이상이면 10% 할인

UPDATE product
SET price = price * 0.9
WHERE category = '전자제품'
AND price >= 50000;

 

조건부 할인 이벤트에 자주 사용되는 패턴입니다.

AND 조건으로 범위를 제한해 안전하게 가격을 변경할 수 있어요.

✅ 예제 3. 특정 상품만 수동으로 가격 변경 (IN 활용)

UPDATE product
SET price = 19900
WHERE name IN ('USB 허브', '충전기');

 

IN 조건은 특정 상품 이름 목록을 직접 지정할 때 매우 유용합니다.

⚠️ UPDATE 쿼리 실행 전 주의할 점

  • WHERE 조건을 명확히 지정하세요. 실수로 전체 데이터 변경될 수 있어요.
  • SELECT 쿼리로 먼저 결과 확인 후 UPDATE 실행하는 습관을 들이세요.
  • 필요시 트랜잭션(START TRANSACTION → COMMIT/ROLLBACK)으로 보호

자, 이렇게 상품 테이블도 상황에 맞게 업데이트할 수 있다는 걸 확인했어요.

다음은 AND, OR, NOT 조합을 통한 조건문 활용 심화 실습으로 넘어갑니다! 😊

 

 

4. 복합 조건 조합 실습 AND/OR/NOT 활용하기 🔗

SQL 조건문은 단일 조건보다 여러 조건을 논리적으로 조합했을 때 진짜 위력을 발휘합니다.

AND, OR, NOT 같은 논리 연산자를 활용하면 복잡한 조건도 손쉽게 처리할 수 있어요.

자주 쓰이는 패턴을 예제로 살펴볼게요!

✅ 예제 1. 남성 중 30대 또는 40대 회원 조회

SELECT * FROM member
WHERE gender = 'M'
AND (age BETWEEN 30 AND 39 OR age BETWEEN 40 AND 49);

 

괄호 없이 작성하면 논리 우선순위에 따라 예상과 다른 결과가 나올 수 있으므로 괄호로 묶는 습관을 들이세요!

✅ 예제 2. ‘가전’ 카테고리 중 가격이 3만 이상 또는 재고 100 이상인 상품

SELECT * FROM product
WHERE category = '가전'
AND (price >= 30000 OR stock >= 100);

 

이 조건은 가전 카테고리 + 추가 조건을 조합한 예입니다.

OR 조건은 결과 범위를 넓히는 데 효과적이에요.

✅ 예제 3. 여성 회원 중, 이름에 ‘김’이 없고 40세 이상인 사람

SELECT * FROM member
WHERE gender = 'F'
AND NOT name LIKE '%김%'
AND age >= 40;

 

NOT 연산자는 부정 조건을 만들 때 유용합니다. 특정 조건을 제외하고 싶을 때 사용하세요.

📌 실무 팁: 논리 연산자 우선순위 정리

연산자 우선순위 설명
NOT 1순위 조건을 부정
AND 2순위 모두 참일 때
OR 3순위 하나라도 참이면

정리하자면,

조건이 복잡할수록 괄호로 조건을 묶는 습관을 들이면 실수 없이 쿼리를 작성할 수 있어요! 😊

 

다음은 마지막으로 실무에서 자주 쓰이는 조건 조합 예제들을 모아볼게요.

 

 

5. 다양한 실무 패턴 예제 모음 🎯

실무에서는 WHERE 절의 조건을 단순히 쓰는 것이 아니라, 특정 패턴에 따라 반복적으로 사용되는 경우가 많아요.

이런 실전 패턴을 익혀두면 문제를 빠르게 해결하고, 효율적인 쿼리 작성을 할 수 있습니다.

아래에 대표적인 실무 패턴 예제를 정리해보았어요!

📌 회원 관련 자주 쓰는 조건문

목적 예시 쿼리
성별별 회원 수 확인 SELECT gender, COUNT(*) FROM member GROUP BY gender;
가입일 기준 최근 회원 10명 SELECT * FROM member ORDER BY join_date DESC LIMIT 10;
40대 여성 회원만 추출 SELECT * FROM member WHERE gender = 'F' AND age BETWEEN 40 AND 49;

📌 상품 관련 자주 쓰는 조건문

목적 예시 쿼리
가격 상위 5개 상품 SELECT * FROM product ORDER BY price DESC LIMIT 5;
재고가 0인 상품 조회 SELECT * FROM product WHERE stock = 0;
카테고리별 상품 평균 가격 SELECT category, AVG(price) FROM product GROUP BY category;

🧠 조건문 작성 실전 팁

  • WHERE 조건은 많을수록 가독성 확보가 중요 — 줄바꿈, 괄호 적극 활용
  • IN, BETWEEN, LIKE은 실무에서 정말 자주 쓰이는 필수 연산자
  • 먼저 SELECT로 조건을 테스트한 후, UPDATEDELETE 적용은 실수 방지 핵심!

자, 이제 실무에서도 쓸 수 있는 수준으로 조건문을 익히셨습니다!

 

 

6. 마무리 📌

이번 포스팅에서는 SQL 조건문과 연산자를 활용한 다양한 실습 예제를 통해 데이터를 선택하고, 수정하는 방법을 실전 위주로 배워보았습니다.

단순히 문법만 이해하는 것이 아니라, 실무에서 바로 사용할 수 있는 패턴까지 익히셨다면 훌륭하게 마스터하신 거예요! 👏

🎯 오늘 배운 핵심 요약

  • WHERE 조건문은 데이터를 추출하거나 수정할 때 반드시 사용
  • 비교 연산자(=, <>, >, <, BETWEEN, LIKE)로 조건 세분화
  • 논리 연산자(AND, OR, NOT) 조합으로 복잡한 조건 처리
  • 괄호()로 조건 우선순위 명확히 하여 오류 방지
  • UPDATE 조건문은 반드시 WHERE 확인 필수!

💡 실전 활용 팁

  • 조건문 테스트는 SELECT 쿼리로 먼저 확인하고 실행하세요.
  • BETWEENLIKE는 범위·문자열 검색에 유용하지만 성능에 주의!
  • 실무에서는 재고 기반 할인, 신규 회원 필터 같은 패턴이 반복됩니다.
  • 꼭 필요한 경우가 아니라면 DELETE, UPDATE는 백업 후 진행이 안전해요.

이제 여러분도 단순한 쿼리를 넘어서, 조건 조합으로 실무형 쿼리를 작성할 수 있는 단계에 오르셨습니다.🚀

반응형

+ Recent posts