SQL 1회차 : SQL이 하는 일, RDB 기본 개념
한눈에 보는 요약
SQL은 데이터베이스에 “질문을 던지고, 데이터를 가져오거나 바꾸는 언어”입니다. 엑셀처럼 표 형태로 데이터를 관리하지만, 훨씬 안전하고 체계적으로 많은 데이터를 처리할 수 있도록 도와줍니다.
관계형 데이터베이스(RDB)는 데이터를 테이블(표) 단위로 관리하며, 각 테이블은 행(레코드)과 열(컬럼)로 구성됩니다. 이때 각 행을 유일하게 식별하는 기본키(PK)와 테이블 간 연결을 담당하는 외래키(FK)가 핵심입니다.
정규화는 데이터를 “중복 없이, 나누어 담는 설계 방식”입니다. 중복을 줄이면 저장 공간을 아끼고, 데이터 수정 시 실수를 줄일 수 있습니다. 이번 1회차에서는 개념을 이해하고, 샘플 DB에 접속해 테이블을 둘러본 뒤 간단한 SELECT 쿼리를 실행해 보게 됩니다.
과제로는 가장 자주 등장하는 예시인 “회원(Member) / 주문(Order)” 테이블의 관계를 말로 설명해 보면서, PK와 FK, 그리고 관계형 구조에 대한 감각을 익히게 됩니다.
목차
- 1. SQL은 어떤 일을 하는가
- 2. RDB와 테이블/행/열 구조 이해
- 3. 기본키(PK)와 외래키(FK)의 역할
- 4. 왜 중복이 문제인가? 정규화 감각
- 5. 실습: 샘플 DB 접속과 간단 SELECT
- 6. 코드 예시
- 7. 실행 단계
- 8. 과제: 회원/주문 테이블 관계 설명
- 9. 블로그 최적화 정보
핵심 포인트
- 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 예제에서는 전체 회원 목록을 일부만 조회해 보고, 특정 회원에 대한 주문만 조건을 걸어 조회하는 기본 패턴을 연습할 수 있습니다.
실행 단계
- 실습 환경 선택
브라우저에서 바로 실행 가능한 온라인 SQL 실습 사이트나, 간단하게 설치할 수 있는 SQLite·MySQL 등의 로컬 DB 환경 중 하나를 선택합니다. 처음에는 설치가 필요 없는 온라인 환경이 부담이 적습니다. - 샘플 데이터베이스 준비
제공된 샘플 DB(예: members, orders 테이블 포함)를 불러오거나, 위의CREATE TABLE예시를 그대로 실행해 직접 테이블을 생성합니다. 데이터가 없다면 간단한 회원·주문 데이터를 몇 건씩INSERT해 둡니다. - 테이블 목록 및 구조 확인
툴에서 테이블 목록을 열어보거나,SHOW TABLES;같은 명령으로 어떤 테이블이 있는지 확인합니다. 각 테이블을 클릭하거나DESCRIBE members;같은 명령으로 컬럼 이름, 타입, 기본키 여부를 체크합니다. - 간단한 SELECT 실행
SELECT * FROM members LIMIT 5;,SELECT * FROM orders LIMIT 5;처럼 단순 조회 쿼리를 실행합니다. 결과 화면에서 “행은 한 건의 데이터, 열은 속성”이라는 점을 눈으로 다시 한 번 확인합니다. - PK/FK 기준으로 관계 상상해 보기
주문 테이블의member_id값을 보면서, “이 주문은 어떤 회원이 한 것인지”를 회원 테이블에서 찾아봅니다. 조인(JOIN)을 아직 배우지 않았더라도, PK/FK 값을 매칭해 보면서 1:N 관계를 직관적으로 이해하는 것이 목표입니다. - 실습 내용 정리 및 과제 작성
오늘 본 테이블 구조, PK/FK, 정규화 아이디어를 간단히 노트에 정리합니다. 이어서 아래 과제 섹션을 참고해, “회원/주문 테이블의 관계”를 본인만의 문장으로 설명해 봅니다.
과제: “회원/주문” 테이블 관계를 말로 설명하기
이번 회차의 과제는 아주 단순하지만, 이후 모든 SQL 학습의 기반이 되는 중요한 내용입니다. 다음 질문에 스스로 답을 만들어 보시면 됩니다.
- 회원(member) 테이블과 주문(order) 테이블은 어떤 관계를 가지고 있는가?
- 각 테이블의 기본키(PK)는 무엇이고, 외래키(FK)는 무엇인가?
- 왜 주문 테이블에 회원 이름 대신
member_id만 저장하는 것이 좋을까?
예시 답안을 참고용으로 적어보면 다음과 같습니다.
“회원 테이블은 각 회원을 한 행으로 저장하며, member_id를 기본키로 사용한다. 주문 테이블은 개별 주문을 저장하는 테이블로, order_id를 기본키로 사용하고, 어떤 회원의 주문인지 나타내기 위해 외래키인 member_id를 함께 저장한다. 한 회원은 여러 건의 주문을 할 수 있으므로 회원과 주문은 1:N 관계이며, 회원 정보(이름, 연락처 등)는 회원 테이블에만 저장하고 주문 테이블에서는 회원 번호만 참조하도록 설계한다.”
과제를 작성하실 때는 위 문장을 그대로 따라 쓰기보다는, 본인이 이해한 표현으로 바꾸어 정리해 보시는 것을 추천드립니다. 그래야 SQL 도입부 개념이 머릿속에 자연스럽게 남습니다.
추가로 생각해볼 점
- 앞으로 배울
JOIN문장은 오늘 본 PK/FK 관계를 실제 쿼리로 이어주는 역할을 합니다. 오늘 구조를 충분히 이해해 두면 조인을 배울 때 훨씬 수월합니다. - 정규화를 지나치게 세분화하면 쿼리가 복잡해질 수 있습니다. 실무에서는 “중복을 줄이되, 자주 사용하는 조회는 너무 복잡하지 않게”라는 현실적인 균형을 맞추는 것이 중요합니다.
- 이번 1회차에서는 RDB를 기준으로 설명했지만, 이후에는 NoSQL, 키-값 저장소 등 다른 데이터베이스와의 차이도 함께 비교해 보면 선택과 설계에 도움이 됩니다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

0 댓글