가장 먼저 데이터를 저장할 공간을 만들고, 그 안에 데이터를 담을 표(테이블)의 뼈대를 세우는 과정이다.
CREATE DATABASE 이름;: 새로운 데이터베이스를 생성한다.DROP DATABASE IF EXISTS 이름;: 기존에 같은 이름의 데이터베이스가 있다면 충돌 방지를 위해 삭제한다.USE 이름;: 작업할 데이터베이스를 선택한다.CREATE TABLE) 및 컬럼 규칙INT UNSIGNED: 양수 전용 정수형 숫자.CHAR(100): 최대 100글자까지 들어가는 문자열.DATETIME: 날짜와 시간 정보.NOT NULL: 데이터 비어있음(NULL)을 허용하지 않는다. 필수 입력값.AUTO_INCREMENT: 데이터를 넣을 때마다 자동으로 1씩 증가하는 번호를 부여한다.UNIQUE: 중복된 값이 들어오는 것을 막는다.PRIMARY KEY: 해당 테이블에서 각 데이터를 고유하게 식별하는 핵심 기둥(기본키)으로 설정한다.[예시 코드]
CREATE TABLE dept(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
regDate DATETIME NOT NULL,
`name` CHAR(100) NOT NULL UNIQUE
);
만들어진 빈 테이블(표)에 실제로 가로줄(Row, 데이터 1건)을 추가하거나 고치는 과정이다.
INSERT INTO)NOW() 함수를 사용하면 현재 시스템의 날짜와 시간이 자동으로 입력된다.UPDATE)WHERE 조건을 빼먹으면 테이블의 모든 데이터가 수정되는 대참사가 발생하므로 반드시 확인해야 한다.[예시 코드]
-- 데이터 삽입
INSERT INTO dept SET regDate = NOW(), `name` = '홍보부서';
-- 데이터 수정 ('홍보부서'를 찾아 '마케팅부서'로 변경)
UPDATE dept SET `name` = '마케팅부서' WHERE `name` = '홍보부서';
테이블을 운영하다가 구조적 한계(문자열 중복 저장 등)를 느끼고 효율적으로 개선하는 과정이다. 데이터베이스에서는 중복 데이터를 최소화하기 위해 '이름' 대신 고유 '번호(ID)'로 연결하는 정규화 작업을 진행한다.
ALTER TABLE ... ADD COLUMN)ALTER TABLE ... DROP COLUMN)[예시 코드]
-- 사원 테이블에 부서 번호를 저장할 칸 추가
ALTER TABLE emp ADD COLUMN deptId INT UNSIGNED NOT NULL;
-- 부서 이름 문자열을 저장하던 칸은 삭제하여 정규화 완료
ALTER TABLE emp DROP COLUMN deptName;
정규화를 통해 쪼개진 테이블들(사원 테이블, 부서 테이블)을 보고서 작성을 위해 하나로 예쁘게 합쳐서 보여주는 과정이다.
AS)e, d)을 붙여 별명을 만들거나, 화면에 출력될 컬럼의 제목을 한글 등 보기 편한 이름으로 바꾼다.INNER JOIN ... ON ...)ON: 두 테이블을 합칠 때 사용하는 가장 중요한 연결 규칙이다. (예: 사원 테이블의 부서번호와 부서 테이블의 아이디가 같은 것끼리 연결해라)DATE())DATETIME 데이터에서 시간은 버리고 연-월-일만 깔끔하게 추출한다.[예시 코드]
SELECT
e.id AS `사원번호`,
DATE(e.regDate) AS `입사일`,
d.name AS `부서명`
FROM emp e
INNER JOIN dept d
ON e.deptId = d.id;
단순 조회를 넘어 조건에 맞게 숫자를 세고, 보기 좋게 줄을 세우는 과정이다.
COUNT(), GROUP BY)COUNT(): 조건에 맞는 데이터의 개수를 센다.GROUP BY: 특정 기준(예: 부서명)으로 데이터를 묶어서 통계를 낸다.ORDER BY)ASC (오름차순): 1, 2, 3 / 가, 나, 다 / 과거 -> 최신 순으로 커지게 정렬한다. (생략 시 기본값)DESC (내림차순): 3, 2, 1 / 다, 나, 가 / 최신 -> 과거 순으로 작아지게 정렬한다.[예시 코드]
-- 1. 부서별 사원 수 집계
SELECT d.name AS `부서명`, COUNT(e.id) AS `사원수`
FROM emp e
INNER JOIN dept d ON e.deptId = d.id
GROUP BY d.name;
-- 2. 부서명 가나다순, 입사일 최신순으로 명부 정렬
SELECT e.name, d.name, e.regDate
FROM emp e
INNER JOIN dept d ON e.deptId = d.id
ORDER BY d.name ASC, e.regDate DESC;