SQL & Database (2)

김우진·2026년 3월 8일

DataBase

목록 보기
2/3
post-thumbnail

SQL 기초 정리 2🗄️

DDL, 정규화, JOIN, INSERT/UPDATE/DELETE, UNION, VIEW


1. 테이블과 컬럼 생성 — DDL

DDL(Data Definition Language) : 데이터베이스 구조를 정의하는 SQL 문법

데이터베이스 생성 / 삭제

CREATE DATABASE 데이터베이스명;
DROP DATABASE 데이터베이스명;

테이블 생성 / 삭제

-- 테이블 생성
CREATE TABLE 데이터베이스명.테이블명 (
    id INT,
    이름 VARCHAR(100) DEFAULT '홍길동',  -- 값 미입력 시 '홍길동'으로 저장
    나이 INT
);

-- 테이블 삭제
DROP TABLE 테이블명;

컬럼 추가 / 수정 / 삭제 — ALTER TABLE

-- 컬럼 추가
ALTER TABLE 테이블명 ADD 성별 VARCHAR(10);

-- 컬럼 타입 수정
-- ⚠️ 이미 데이터가 저장되어 있으면 타입 변경 불가
ALTER TABLE 테이블명 MODIFY COLUMN 나이 VARCHAR(100);

-- 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

2. 제약 조건 — Constraints

컬럼에 잘못된 데이터가 들어오는 것을 방지하는 규칙

NOT NULL — NULL 입력 금지

CREATE TABLE 테이블명 (
    id INT NOT NULL,
    이름 VARCHAR(100),
    나이 INT
);

UNIQUE — 중복값 방지

-- 단일 컬럼
CREATE TABLE 테이블명 (
    id INT UNIQUE,
    이름 VARCHAR(100)
);

-- 복합 컬럼 (두 컬럼의 조합이 유일해야 함)
CREATE TABLE 테이블명 (
    id INT,
    이름 VARCHAR(100),
    UNIQUE(컬럼1, 컬럼2)
);

CHECK — 입력값 조건 검사

CREATE TABLE 테이블명 (
    id INT,
    나이 INT CHECK(나이 > 0)  -- 0 이하의 나이 입력 불가
);

PRIMARY KEY — 행 식별자

NOT NULL + UNIQUE 를 자동으로 포함

CREATE TABLE 테이블명 (
    id INT PRIMARY KEY,
    이름 VARCHAR(100)
);

AUTO_INCREMENT — 자동 증가

값을 직접 입력하지 않아도 1씩 자동 증가하는 정수를 넣어줌
주로 PRIMARY KEY와 함께 사용

CREATE TABLE 테이블명 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    이름 VARCHAR(100)
);

3. 정규화 — 1NF, 2NF, 3NF

제1정규화 (1NF)

"한 칸엔 하나의 데이터만"

  • 하나의 셀에 여러 값이 들어있으면 분리해야 함
  • 제1정규형 : 제1정규화가 완료된 테이블

제2정규화 (2NF)

"현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업"
= 복합 기본키의 일부에만 종속되는 컬럼 분리 (부분 함수 종속 제거)

  • 복합 기본키(Composite Primary Key) : 단일 컬럼으로 행을 식별할 수 없을 때 2개 이상의 컬럼을 합쳐 기본키로 사용
  • 기본키 설정 시 현재 데이터뿐 아니라 미래에 들어올 수 있는 데이터까지 고려해야 함

💡 종속관계 판단 팁
하나의 컬럼 값을 바꿨을 때 다른 컬럼도 따라서 바뀌어야 한다면 → 종속관계

제2정규형 : 제2정규화가 완료된 테이블

제3정규화 (3NF)

"기본키가 아닌 일반 컬럼에 종속되는 컬럼 분리" (이행 함수 종속 제거)

쉽게 이해하는 방법 : 기본키가 아닌 잔챙이 컬럼에 종속되는 컬럼을 분리

제3정규형 : 제3정규화가 완료된 테이블


4. Foreign Key (외래키)

다른 테이블의 Primary Key를 참조하는 컬럼

테이블을 쪼갤 때 유의사항
1. 첫 컬럼은 항상 PRIMARY KEY 넣는 게 좋음
2. 다른 테이블의 데이터를 사용할 때 해당 테이블의 PRIMARY KEY를 적기 (Foreign Key)

Foreign Key 장점

  • DBeaver에서 화살표 클릭으로 연결된 테이블 행 바로 확인 가능
  • 다른 테이블에서 참조 중인 데이터 실수로 삭제하는 것을 방지

⚠️ 단, 삭제/수정이 번거로워지고 테이블 구조 변경도 까다로워져서 등록하지 않는 곳도 있음

SQL로 Foreign Key 등록하기

-- 테이블 생성 시 인라인으로 등록
CREATE TABLE 테이블명 (
    id INT PRIMARY KEY,
    프로그램 VARCHAR(100),
    강사id INT REFERENCES 다른테이블명(참조할컬럼명)
);

-- CONSTRAINT 문법으로 등록
CREATE TABLE 테이블명 (
    id INT,
    프로그램 VARCHAR(100),
    강사id INT,
    CONSTRAINT pk_name PRIMARY KEY (id),
    CONSTRAINT fk_name FOREIGN KEY (강사id) REFERENCES 다른테이블명(참조할컬럼명)
);

-- 이미 생성된 테이블에 추가
ALTER TABLE 테이블명 ADD
CONSTRAINT fk_name FOREIGN KEY (강사id) REFERENCES teacher(id);

5. 테이블 합쳐서 출력 — JOIN

정규화로 쪼개놓은 테이블을 다시 합쳐서 출력할 때 사용

INNER JOIN

두 테이블에서 조건이 일치하는 행만 출력

SELECT * FROM program
INNER JOIN teacher
ON 강사id = teacher.id;

-- 3개 이상 테이블 붙이기
SELECT * FROM 테이블1
INNER JOIN 테이블2 ON 조건식
INNER JOIN 테이블3 ON 조건식;

CROSS JOIN

두 테이블의 모든 행의 조합 출력

SELECT * FROM program CROSS JOIN teacher;

LEFT JOIN / RIGHT JOIN

-- LEFT JOIN : INNER JOIN 결과 + 왼쪽 테이블의 모든 행
-- RIGHT JOIN : INNER JOIN 결과 + 오른쪽 테이블의 모든 행
SELECT * FROM program
RIGHT JOIN teacher
ON 강사id = teacher.id;

💡 활용 팁 : 접점이 없는 행(빵꾸)을 찾을 때 유용

-- teacher 테이블에 있지만 program 테이블에서 참조되지 않는 강사 찾기
SELECT * FROM program
RIGHT JOIN teacher
ON 강사id = teacher.id
WHERE 강사id IS NULL;

JOIN vs UNION 차이

JOINUNION
방향컬럼 방향으로 합침 (좌우)행 방향으로 합침 (위아래)
조건ON으로 연결 조건 지정컬럼 개수가 같아야 함

6. 데이터 삽입 — INSERT

-- 특정 컬럼에만 삽입
INSERT INTO stock(id, 상품명, 가격)
VALUES (1, '김치', 500);

-- 전체 컬럼에 삽입 (컬럼명 생략 가능)
INSERT INTO stock
VALUES (1, '김치', 500);

응용 — 테이블 간 데이터 복사

-- 기존 테이블에 다른 테이블 데이터 복사
INSERT INTO stock
SELECT * FROM stock2;

-- 새 테이블 생성과 동시에 복사
CREATE TABLE 새테이블명 SELECT * FROM 기존테이블명;

💡 테이블 복사는 언제?

  • 쿼리 결과를 잠깐 저장할 때
  • 테이블에 작업하기 전 테스트용으로 먼저 확인할 때

DB 접속 계정별 권한 설정 (MySQL Workbench)

삽입/수정/삭제는 위험한 작업이므로 계정별 권한을 제한할 수 있음

  1. MySQL Workbench 접속
  2. 상단 Server > Users and Privileges
  3. ID, PW 생성
  4. Administrative Roles에서 권한 설정 (예: SELECT, INSERT만 체크)
  5. Apply로 계정 생성
  6. 해당 계정으로 접속하면 설정한 권한만 사용 가능

7. 데이터 수정 / 삭제 — UPDATE / DELETE

UPDATE

UPDATE stock
SET 상품명 = '사과'
WHERE id = 2;

-- 여러 컬럼 동시 수정
UPDATE stock
SET 상품명 = '사과', 가격 = 가격 + 100
WHERE id = 2;

⚠️ WHERE 빠뜨리면 모든 행이 수정됨 — 반드시 확인!

DELETE

DELETE FROM stock
WHERE id = 100;

⚠️ WHERE 빠뜨리면 모든 행이 삭제됨 — 반드시 확인!
⚠️ 다른 테이블에서 Foreign Key로 참조 중인 행은 삭제 불가

JOIN한 테이블 수정 / 삭제

-- 수정
UPDATE a INNER JOIN b ON 조건식
SET 컬럼 =WHERE 조건식;

-- 삭제 (a만, b만, 또는 a,b 둘 다 삭제 가능)
DELETE a FROM a
INNER JOIN b ON 조건식
WHERE 조건식;

8. SELECT 결과 합치기 — UNION

-- 중복 제거하며 합치기
SELECT * FROM stock
UNION
SELECT * FROM stock2;

-- 중복 허용하며 합치기
SELECT * FROM stock
UNION ALL
SELECT * FROM stock2;

⚠️ 컬럼 개수가 다르면 실행 안 됨


9. 가상 테이블 — VIEW

자주 쓰는 SELECT 쿼리를 테이블처럼 저장해두고 재사용할 때 사용
실제 데이터를 저장하는 게 아닌 가상 테이블

CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2
FROM 테이블명
WHERE 조건식;

-- 이후 일반 테이블처럼 사용 가능
SELECT * FROM 뷰이름;

💡 VIEW를 쓰는 이유

  • 자주 쓰는 복잡한 쿼리를 매번 다시 짜지 않아도 됨
  • 실제 테이블로 저장하기엔 무겁고, 그냥 두기엔 매번 쿼리 짜기 번거로울 때 사용

📋 SQL 문법 실행 순서 요약

FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

0개의 댓글