본문 바로가기
개발/웹 개발

Day 29-30: SQL 기초와 심화 (CRUD와 JOIN)

1. 오늘의 학습 목표

학습 목표: 이번 통합 세션에서는 관계형 데이터베이스의 핵심 언어인 SQL을 기초부터 심화까지 다룹니다. 먼저, 테이블을 생성하고 데이터를 다루는 4가지 기본 연산 CRUD(CREATE, INSERT, SELECT, UPDATE, DELETE)를 익힙니다. 이어서, 여러 테이블에 분산된 데이터를 관계를 통해 연결하고 조합하는 강력한 기능인 JOIN의 개념과 사용법을 배웁니다.

 

핵심 요약: CRUD가 데이터베이스의 기본기를 다지는 것이라면, JOIN은 흩어져 있는 데이터 조각들을 모아 의미 있는 정보를 만드는 응용 기술입니다. 이 두 가지를 마스터하면 비로소 관계형 데이터베이스를 제대로 활용할 수 있게 됩니다.


Part 1. SQL 기초

2. 핵심 개념 파헤치기

2.1. SQL이란?

SQL은 관계형 데이터베이스(RDBMS)의 데이터를 정의, 조작, 제어를 위한 표준 언어입니

  • DDL (Data Definition Language): CREATE(생성), DROP(삭제) 등 데이터의 구조를 정의합니다.
  • DML (Data Manipulation Language): INSERT(추가), SELECT(조회), UPDATE(수정), DELETE(삭제) 등 실제 데이터를 관리합니다.

3. 코드로 배우기

3.1. [1단계: 테이블 생성 (CREATE)]

사용자 정보를 저장할 users 테이블을 생성합니다.

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,       -- 정수, 기본 키, 자동 증가
  name VARCHAR(50) NOT NULL,          -- 50자 이내 문자열, 필수값
  email VARCHAR(100) UNIQUE NOT NULL    -- 100자 이내 문자열, 고유값, 필수값
);

 

3.2. [2단계: 데이터 CRUD 연산]

INSERT, SELECT, UPDATE, DELETE를 사용하여 데이터를 관리합니다.

  -- Create: 데이터 추가
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');

  -- Read: 데이터 조회
SELECT * FROM users WHERE name = 'Alice';

  -- Update: 데이터 수정
UPDATE users SET email = 'bob.new@example.com' WHERE id = 2;

  -- Delete: 데이터 삭제
DELETE FROM users WHERE id = 1;

Part 2. SQL 심화 (JOIN을 활용한 테이블 관계)

4. 핵심 개념 파헤치기

4.1. 왜 JOIN이 필요한가?

관계형 데이터베이스는 데이터의 중복을 피하기 위해 정보를 여러 테이블에 나누어 저장합니다(정규화). 예를 들어, users 테이블과 posts 테이블을 따로 관리합니다. 이때, 'Alice'라는 사용자가 작성한 모든 게시글을 보고 싶다면, 이 두 테이블을 연결해야 하는데, 이 역할을 하는 것이 바로 JOIN입니다.

 

4.2. 관계의 핵심: 기본 키(PK)와 외래 키(FK)

  • 기본 키 (Primary Key, PK): 테이블의 각 행(row)을 고유하게 식별하는 값입니다. (users 테이블의 id)
  • 외래 키 (Foreign Key, FK): 다른 테이블의 기본 키를 참조하는 값입니다. 이 외래 키를 통해 두 테이블이 관계를 맺습니다. (posts 테이블의 user_id는 users 테이블의 id를 참조)

4.3. INNER JOIN

JOIN에는 여러 종류가 있지만 가장 기본적이고 널리 쓰이는 것은 INNER JOIN입니다. 두 테이블에서 연결고리가 있는(일치하는) 데이터만 가져옵니다.


5. 코드로 배우기

5.1. 구현 목표

users 테이블과 posts 테이블을 JOIN하여, 각 게시글의 제목과 그 글을 작성한 사용자의 이름을 함께 조회합니다.

 

5.2. [1단계: posts 테이블 생성 및 데이터 추가]

users 테이블의 id를 참조하는 user_id를 외래 키로 갖는 posts 테이블을 생성하고 데이터를 추가합니다.

-- posts 테이블 생성
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  user_id INT,
  FOREIGN KEY (user_id) REFERENCES users(id) -- 외래 키 설정
);

  -- posts 데이터 추가 (Bob(id=2)과 Charlie(id=3)가 글을 작성)
INSERT INTO posts (title, user_id) VALUES ('Bob''s first post', 2);
INSERT INTO posts (title, user_id) VALUES ('Charlie''s article', 3);
INSERT INTO posts (title, user_id) VALUES ('Bob''s second post', 2);

 

5.3. [2단계: INNER JOIN으로 데이터 조회하기]

INNER JOIN을 사용하여 users 테이블과 posts 테이블을 users.id와 posts.user_id가 같은 조건으로 연결합니다.

SELECT
  posts.title, -- posts 테이블의 title 열
  users.name   -- users 테이블의 name 열
FROM posts
INNER JOIN users ON posts.user_id = users.id;

실행 결과

| title                        | name    |

| ----------------------- | -------    |

| Bob's first post      | Bob      |

| Charlie's article    | Charlie |

| Bob's second post | Bob      |


6. 전체 코드

 

-- 1. 테이블 생성
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL
);
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  user_id INT,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 2. 데이터 추가
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO posts (title, user_id) VALUES
  ('Post by Bob', 2),
  ('Post by Charlie', 3),
  ('Another post by Bob', 2);

-- 3. JOIN을 이용한 최종 조회
-- "어떤 유저가 어떤 글을 썼는지 이름과 제목으로 보여줘"
SELECT
  u.name AS author_name, -- u는 users의 별칭, as로 열 이름 변경
  p.title AS post_title   -- p는 posts의 별칭
FROM users AS u
INNER JOIN posts AS p ON u.id = p.user_id;