SQL 1회차 : SQL이 하는 일, RDB 기본 개념


SQL 1회차 : SQL이 하는 일, RDB 기본 개념

한눈에 보는 요약

SQL은 데이터베이스에 “질문을 던지고, 데이터를 가져오거나 바꾸는 언어”입니다. 엑셀처럼 표 형태로 데이터를 관리하지만, 훨씬 안전하고 체계적으로 많은 데이터를 처리할 수 있도록 도와줍니다.

관계형 데이터베이스(RDB)는 데이터를 테이블(표) 단위로 관리하며, 각 테이블은 행(레코드)열(컬럼)로 구성됩니다. 이때 각 행을 유일하게 식별하는 기본키(PK)와 테이블 간 연결을 담당하는 외래키(FK)가 핵심입니다.

정규화는 데이터를 “중복 없이, 나누어 담는 설계 방식”입니다. 중복을 줄이면 저장 공간을 아끼고, 데이터 수정 시 실수를 줄일 수 있습니다. 이번 1회차에서는 개념을 이해하고, 샘플 DB에 접속해 테이블을 둘러본 뒤 간단한 SELECT 쿼리를 실행해 보게 됩니다.

과제로는 가장 자주 등장하는 예시인 “회원(Member) / 주문(Order)” 테이블의 관계를 말로 설명해 보면서, PK와 FK, 그리고 관계형 구조에 대한 감각을 익히게 됩니다.

목차


핵심 포인트

  • SQL은 데이터베이스에 “저장·조회·수정·삭제”를 요청하는 표준 언어이며, 대부분의 RDB에서 공통적으로 사용됩니다.
  • 관계형 데이터베이스(RDB)는 데이터를 테이블(표)로 관리하며, 하나의 행은 한 건의 데이터, 하나의 열은 데이터의 속성을 의미합니다.
  • 기본키(PK)는 각 행을 유일하게 식별하기 위한 값이며, 절대 중복되거나 비어 있으면 안 됩니다.
  • 외래키(FK)는 다른 테이블의 기본키를 참조하는 열로, 테이블 간 관계(예: 회원과 주문)를 안전하게 연결해 줍니다.
  • 정규화는 중복 데이터를 줄이는 설계 방식으로, 데이터 불일치와 업데이트 오류를 예방하는 데 매우 중요합니다.
  • 실습에서는 샘플 DB에 접속해 테이블 구조를 살펴보고, SELECT 문으로 몇 행을 조회하면서 개념을 몸으로 익힙니다.
  • 과제인 “회원/주문 테이블 관계 설명하기”를 통해 PK/FK와 1:N 관계 개념을 스스로 정리해 보는 것이 목표입니다.

상세 설명

1. SQL은 어떤 일을 하는가

SQL(Structured Query Language)은 말 그대로 “구조화된 질의 언어”입니다. 우리가 자연어로 “이번 달 주문 내역 보여줘”라고 말하듯, 데이터베이스에게는 SQL로 “이번 달 주문 데이터를 조회해 줘”라고 요청합니다.

SQL로 할 수 있는 일을 크게 나누면 다음과 같습니다.

  • 데이터 정의(DDL): 테이블을 만들고(CREATE TABLE), 수정하고(ALTER TABLE), 삭제(DROP TABLE)하는 작업
  • 데이터 조작(DML): 데이터를 조회(SELECT), 추가(INSERT), 수정(UPDATE), 삭제(DELETE)하는 작업
  • 권한·트랜잭션 관리 등: 누가 어떤 데이터에 접근할 수 있는지, 여러 변경을 하나의 작업 단위로 묶어 처리하는 기능 등

1회차에서는 이 중에서도 가장 자주 사용하게 될 조회(SELECT)를 중심으로, RDB 구조와 함께 큰 그림을 잡는 데 초점을 맞춥니다.

2. RDB와 테이블/행/열 구조 이해

관계형 데이터베이스(Relational Database, RDB)는 데이터를 “엑셀 표와 비슷한 구조”로 관리합니다. 하나의 데이터베이스 안에는 여러 개의 테이블이 있고, 각 테이블은 행과 열로 구성됩니다.

중요 용어를 한 번에 정리하면 다음과 같습니다.

테이블·행·열 용어 정리 표

아래 표는 RDB에서 자주 등장하는 기본 용어와 그 의미를 정리한 것입니다.

용어 영어 표기 설명 쉽게 이해하는 비유
테이블 Table 서로 관련된 데이터를 모아둔 표 단위 엑셀의 “시트” 한 개, 혹은 “회원 목록” 표 전체
Row / Record 테이블 안에서 한 사람, 한 주문 등 “한 건”을 나타내는 데이터 묶음 회원 목록에서 특정 회원 한 줄
Column / Field 데이터의 속성(이름, 이메일, 가입일 등)을 나타내는 항목 회원 목록에서 “이름” 열, “이메일” 열 등

예를 들어, “회원” 테이블이 있다면 각 행은 개별 회원을 의미하고, 열은 회원 번호, 이름, 이메일, 가입일 등을 나타냅니다. 이 구조를 이해하면 SQL로 어떤 데이터를 선택해서 가져올지, 어떤 열을 기준으로 조건을 줄지 자연스럽게 떠올릴 수 있습니다.

3. 기본키(PK)와 외래키(FK)의 역할

테이블 구조를 이해했다면 이제 “각 행을 어떻게 구분할 것인지”가 중요합니다. 바로 여기서 기본키(PK, Primary Key)외래키(FK, Foreign Key)가 등장합니다.

  • 기본키(PK): 한 행을 유일하게 식별하는 열(또는 열 조합). 중복되거나 비어 있을 수 없습니다.
  • 외래키(FK): 다른 테이블의 기본키를 참조하는 열. 테이블 간 관계를 표현하는 데 사용됩니다.

PK/FK 비교 표

아래 표는 기본키와 외래키의 차이와 역할을 비교한 것입니다.

구분 기본키(PK) 외래키(FK)
목적 행을 유일하게 식별 다른 테이블의 행을 참조
중복 허용 여부 중복 불가 중복 가능 (여러 행이 같은 회원을 참조할 수 있음)
NULL 허용 여부 NULL 불가가 일반적 비즈니스 규칙에 따라 허용/불가 결정
예시 회원 테이블의 member_id 주문 테이블의 member_id (회원 테이블의 PK를 참조)

“회원 1명이 여러 건의 주문을 할 수 있다”는 관계를 표현할 때, 회원 테이블의 member_id는 PK, 주문 테이블의 member_id는 FK가 됩니다. 이 구조 덕분에 “이 회원의 주문 목록을 보여줘”와 같은 질문을 SQL로 쉽게 표현할 수 있습니다.

4. 왜 중복이 문제인가? 정규화 감각

정규화(Normalization)는 데이터를 “적절히 나누어 중복을 줄이는 설계 방법”입니다. 초보 단계에서는 정규화의 여러 단계(1정규형, 2정규형 등)를 외우기보다, 왜 중복이 위험한지 감각을 잡는 것이 더 중요합니다.

예를 들어, 다음과 같은 “나쁜 설계”를 생각해 볼 수 있습니다.

  • 주문 테이블에 회원이름, 회원연락처를 계속 저장하는 경우
  • 같은 회원이 주문할 때마다 이름과 연락처가 반복해서 기록됨

문제는 이 회원의 연락처가 바뀌었을 때 발생합니다. 주문이 100건이라면, 100행을 모두 수정해야 합니다. 한두 개를 빼먹으면 데이터가 서로 다른 값을 가지게 되어 신뢰성이 떨어집니다.

반대로, 회원 정보는 회원 테이블에만 저장하고, 주문 테이블에는 member_id만 넣어두면 어떨까요? 연락처가 바뀌었을 때 회원 테이블의 한 행만 수정하면 되고, 주문 데이터는 그대로 유지해도 항상 최신 정보를 조회할 수 있습니다. 이것이 바로 정규화의 핵심 아이디어입니다.

5. 실습: 샘플 DB 접속과 간단 SELECT

이론만 보면 어렵게 느껴질 수 있기 때문에, 아주 가벼운 실습을 함께 진행하는 것이 좋습니다. 이번 회차에서는 “샘플 DB 접속 → 테이블 둘러보기 → 간단한 SELECT 실행” 순서로 실습을 구성합니다.

  • 온라인 SQL 실습 사이트나, 로컬에 설치한 간단한 DB 툴(예: SQLite, MySQL용 GUI 등)을 사용합니다.
  • members, orders 같은 이름의 샘플 테이블이 있는 데이터베이스를 사용하거나, 아래 코드 예시처럼 직접 테이블을 만들어도 좋습니다.
  • SELECT * FROM members LIMIT 10;처럼 간단한 쿼리로 데이터를 조회하고, 각 행이 어떤 의미인지 눈으로 확인해 봅니다.
  • 특정 회원의 주문만 보고 싶다면 WHERE 조건을 추가해 보는 것도 좋습니다.

실습의 목적은 “SQL 문법을 완벽히 암기하는 것”이 아니라, 테이블 구조와 PK/FK 관계를 실제 데이터로 체감하는 데 있습니다.

코드 예시

-- 회원 테이블 예시
CREATE TABLE members (
    member_id   INT PRIMARY KEY,
    name        VARCHAR(50) NOT NULL,
    email       VARCHAR(100) UNIQUE,
    created_at  DATETIME
);

-- 주문 테이블 예시
CREATE TABLE orders (
order_id    INT PRIMARY KEY,
member_id   INT NOT NULL,
order_date  DATETIME,
amount      DECIMAL(10, 2),
FOREIGN KEY (member_id) REFERENCES members(member_id)
);

-- 회원 목록 일부 조회
SELECT member_id, name, email
FROM members
LIMIT 10;

-- 특정 회원의 주문 조회 예시 (member_id = 1인 회원)
SELECT order_id, member_id, order_date, amount
FROM orders
WHERE member_id = 1;

위 예시는 가장 기본적인 회원·주문 구조를 SQL로 정의한 것입니다. 첫 번째와 두 번째 CREATE TABLE 구문에서 member_id가 각각 PK와 FK로 사용되고 있음을 확인할 수 있습니다. 이후 SELECT 예제에서는 전체 회원 목록을 일부만 조회해 보고, 특정 회원에 대한 주문만 조건을 걸어 조회하는 기본 패턴을 연습할 수 있습니다.


실행 단계

  1. 실습 환경 선택
    브라우저에서 바로 실행 가능한 온라인 SQL 실습 사이트나, 간단하게 설치할 수 있는 SQLite·MySQL 등의 로컬 DB 환경 중 하나를 선택합니다. 처음에는 설치가 필요 없는 온라인 환경이 부담이 적습니다.
  2. 샘플 데이터베이스 준비
    제공된 샘플 DB(예: members, orders 테이블 포함)를 불러오거나, 위의 CREATE TABLE 예시를 그대로 실행해 직접 테이블을 생성합니다. 데이터가 없다면 간단한 회원·주문 데이터를 몇 건씩 INSERT 해 둡니다.
  3. 테이블 목록 및 구조 확인
    툴에서 테이블 목록을 열어보거나, SHOW TABLES; 같은 명령으로 어떤 테이블이 있는지 확인합니다. 각 테이블을 클릭하거나 DESCRIBE members; 같은 명령으로 컬럼 이름, 타입, 기본키 여부를 체크합니다.
  4. 간단한 SELECT 실행
    SELECT * FROM members LIMIT 5;, SELECT * FROM orders LIMIT 5;처럼 단순 조회 쿼리를 실행합니다. 결과 화면에서 “행은 한 건의 데이터, 열은 속성”이라는 점을 눈으로 다시 한 번 확인합니다.
  5. PK/FK 기준으로 관계 상상해 보기
    주문 테이블의 member_id 값을 보면서, “이 주문은 어떤 회원이 한 것인지”를 회원 테이블에서 찾아봅니다. 조인(JOIN)을 아직 배우지 않았더라도, PK/FK 값을 매칭해 보면서 1:N 관계를 직관적으로 이해하는 것이 목표입니다.
  6. 실습 내용 정리 및 과제 작성
    오늘 본 테이블 구조, PK/FK, 정규화 아이디어를 간단히 노트에 정리합니다. 이어서 아래 과제 섹션을 참고해, “회원/주문 테이블의 관계”를 본인만의 문장으로 설명해 봅니다.

과제: “회원/주문” 테이블 관계를 말로 설명하기

이번 회차의 과제는 아주 단순하지만, 이후 모든 SQL 학습의 기반이 되는 중요한 내용입니다. 다음 질문에 스스로 답을 만들어 보시면 됩니다.

  • 회원(member) 테이블과 주문(order) 테이블은 어떤 관계를 가지고 있는가?
  • 각 테이블의 기본키(PK)는 무엇이고, 외래키(FK)는 무엇인가?
  • 왜 주문 테이블에 회원 이름 대신 member_id만 저장하는 것이 좋을까?

예시 답안을 참고용으로 적어보면 다음과 같습니다.

“회원 테이블은 각 회원을 한 행으로 저장하며, member_id를 기본키로 사용한다. 주문 테이블은 개별 주문을 저장하는 테이블로, order_id를 기본키로 사용하고, 어떤 회원의 주문인지 나타내기 위해 외래키인 member_id를 함께 저장한다. 한 회원은 여러 건의 주문을 할 수 있으므로 회원과 주문은 1:N 관계이며, 회원 정보(이름, 연락처 등)는 회원 테이블에만 저장하고 주문 테이블에서는 회원 번호만 참조하도록 설계한다.”

과제를 작성하실 때는 위 문장을 그대로 따라 쓰기보다는, 본인이 이해한 표현으로 바꾸어 정리해 보시는 것을 추천드립니다. 그래야 SQL 도입부 개념이 머릿속에 자연스럽게 남습니다.

추가로 생각해볼 점

  • 앞으로 배울 JOIN 문장은 오늘 본 PK/FK 관계를 실제 쿼리로 이어주는 역할을 합니다. 오늘 구조를 충분히 이해해 두면 조인을 배울 때 훨씬 수월합니다.
  • 정규화를 지나치게 세분화하면 쿼리가 복잡해질 수 있습니다. 실무에서는 “중복을 줄이되, 자주 사용하는 조회는 너무 복잡하지 않게”라는 현실적인 균형을 맞추는 것이 중요합니다.
  • 이번 1회차에서는 RDB를 기준으로 설명했지만, 이후에는 NoSQL, 키-값 저장소 등 다른 데이터베이스와의 차이도 함께 비교해 보면 선택과 설계에 도움이 됩니다.


이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

Reactions

댓글 쓰기

0 댓글