DDL, 정규화, JOIN, INSERT/UPDATE/DELETE, UNION, VIEW
DDL(Data Definition Language) : 데이터베이스 구조를 정의하는 SQL 문법
CREATE DATABASE 데이터베이스명;
DROP DATABASE 데이터베이스명;
-- 테이블 생성
CREATE TABLE 데이터베이스명.테이블명 (
id INT,
이름 VARCHAR(100) DEFAULT '홍길동', -- 값 미입력 시 '홍길동'으로 저장
나이 INT
);
-- 테이블 삭제
DROP TABLE 테이블명;
-- 컬럼 추가
ALTER TABLE 테이블명 ADD 성별 VARCHAR(10);
-- 컬럼 타입 수정
-- ⚠️ 이미 데이터가 저장되어 있으면 타입 변경 불가
ALTER TABLE 테이블명 MODIFY COLUMN 나이 VARCHAR(100);
-- 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
컬럼에 잘못된 데이터가 들어오는 것을 방지하는 규칙
CREATE TABLE 테이블명 (
id INT NOT NULL,
이름 VARCHAR(100),
나이 INT
);
-- 단일 컬럼
CREATE TABLE 테이블명 (
id INT UNIQUE,
이름 VARCHAR(100)
);
-- 복합 컬럼 (두 컬럼의 조합이 유일해야 함)
CREATE TABLE 테이블명 (
id INT,
이름 VARCHAR(100),
UNIQUE(컬럼1, 컬럼2)
);
CREATE TABLE 테이블명 (
id INT,
나이 INT CHECK(나이 > 0) -- 0 이하의 나이 입력 불가
);
NOT NULL + UNIQUE 를 자동으로 포함
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
이름 VARCHAR(100)
);
값을 직접 입력하지 않아도 1씩 자동 증가하는 정수를 넣어줌
주로 PRIMARY KEY와 함께 사용
CREATE TABLE 테이블명 (
id INT AUTO_INCREMENT PRIMARY KEY,
이름 VARCHAR(100)
);
"한 칸엔 하나의 데이터만"
"현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업"
= 복합 기본키의 일부에만 종속되는 컬럼 분리 (부분 함수 종속 제거)
💡 종속관계 판단 팁
하나의 컬럼 값을 바꿨을 때 다른 컬럼도 따라서 바뀌어야 한다면 → 종속관계
제2정규형 : 제2정규화가 완료된 테이블
"기본키가 아닌 일반 컬럼에 종속되는 컬럼 분리" (이행 함수 종속 제거)
쉽게 이해하는 방법 : 기본키가 아닌 잔챙이 컬럼에 종속되는 컬럼을 분리
제3정규형 : 제3정규화가 완료된 테이블
다른 테이블의 Primary Key를 참조하는 컬럼
테이블을 쪼갤 때 유의사항
1. 첫 컬럼은 항상 PRIMARY KEY 넣는 게 좋음
2. 다른 테이블의 데이터를 사용할 때 해당 테이블의 PRIMARY KEY를 적기 (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);
정규화로 쪼개놓은 테이블을 다시 합쳐서 출력할 때 사용
두 테이블에서 조건이 일치하는 행만 출력
SELECT * FROM program
INNER JOIN teacher
ON 강사id = teacher.id;
-- 3개 이상 테이블 붙이기
SELECT * FROM 테이블1
INNER JOIN 테이블2 ON 조건식
INNER JOIN 테이블3 ON 조건식;
두 테이블의 모든 행의 조합 출력
SELECT * FROM program CROSS JOIN teacher;
-- 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 | UNION | |
|---|---|---|
| 방향 | 컬럼 방향으로 합침 (좌우) | 행 방향으로 합침 (위아래) |
| 조건 | ON으로 연결 조건 지정 | 컬럼 개수가 같아야 함 |
-- 특정 컬럼에만 삽입
INSERT INTO stock(id, 상품명, 가격)
VALUES (1, '김치', 500);
-- 전체 컬럼에 삽입 (컬럼명 생략 가능)
INSERT INTO stock
VALUES (1, '김치', 500);
-- 기존 테이블에 다른 테이블 데이터 복사
INSERT INTO stock
SELECT * FROM stock2;
-- 새 테이블 생성과 동시에 복사
CREATE TABLE 새테이블명 SELECT * FROM 기존테이블명;
💡 테이블 복사는 언제?
- 쿼리 결과를 잠깐 저장할 때
- 테이블에 작업하기 전 테스트용으로 먼저 확인할 때
삽입/수정/삭제는 위험한 작업이므로 계정별 권한을 제한할 수 있음
Server > Users and PrivilegesAdministrative Roles에서 권한 설정 (예: SELECT, INSERT만 체크)Apply로 계정 생성UPDATE stock
SET 상품명 = '사과'
WHERE id = 2;
-- 여러 컬럼 동시 수정
UPDATE stock
SET 상품명 = '사과', 가격 = 가격 + 100
WHERE id = 2;
⚠️ WHERE 빠뜨리면 모든 행이 수정됨 — 반드시 확인!
DELETE FROM stock
WHERE id = 100;
⚠️ WHERE 빠뜨리면 모든 행이 삭제됨 — 반드시 확인!
⚠️ 다른 테이블에서 Foreign Key로 참조 중인 행은 삭제 불가
-- 수정
UPDATE a INNER JOIN b ON 조건식
SET 컬럼 = 값
WHERE 조건식;
-- 삭제 (a만, b만, 또는 a,b 둘 다 삭제 가능)
DELETE a FROM a
INNER JOIN b ON 조건식
WHERE 조건식;
-- 중복 제거하며 합치기
SELECT * FROM stock
UNION
SELECT * FROM stock2;
-- 중복 허용하며 합치기
SELECT * FROM stock
UNION ALL
SELECT * FROM stock2;
⚠️ 컬럼 개수가 다르면 실행 안 됨
자주 쓰는 SELECT 쿼리를 테이블처럼 저장해두고 재사용할 때 사용
실제 데이터를 저장하는 게 아닌 가상 테이블
CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2
FROM 테이블명
WHERE 조건식;
-- 이후 일반 테이블처럼 사용 가능
SELECT * FROM 뷰이름;
💡 VIEW를 쓰는 이유
- 자주 쓰는 복잡한 쿼리를 매번 다시 짜지 않아도 됨
- 실제 테이블로 저장하기엔 무겁고, 그냥 두기엔 매번 쿼리 짜기 번거로울 때 사용
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT