9월3일(목)

Win Cha·2026년 9월 3일

기존에 a2 데이터베이스가 존재 한다면 삭제

DROP DATABASE IF EXISTS a2;

새 데이터베이스(a2) 생성

CREATE DATABASE a2;

새 데이터베이스(a2) 선택

USE a2;

article 테이블 생성(id, regDate, title, body)

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

CREATE TABLE article (
id INT,
regDate DATETIME,
title VARCHAR(100),
body TEXT
);

article 테이블 조회(*)

SELECT *
FROM article;

article 테이블에 data insert (regDate = NOW(), title = '제목', body = '내용')

INSERT INTO article
SET regDate = NOW(),
title = '제목',
body = '내용';

article 테이블에 data insert (regDate = NOW(), title = '제목', body = '내용')

INSERT INTO article
SET regDate = NOW(),
title = '제목',
body = '내용';

article 테이블 조회(*)

id가 NULL인 데이터 생성이 가능하네?

SELECT *
FROM article;

id 데이터는 꼭 필수 이기 때문에 NULL을 허용하지 않게 바꾼다.(alter table, not null)

기존의 NULL값 때문에 경고가 뜬다.

일부 환경에서는 아래와 같이 0으로 변경해줘야만 하는 경우도 있습니다.

UPDATE article SET id = 0;

기존의 NULL값이 0으로 바뀐다.

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article MODIFY id INT NOT NULL;

article 테이블 조회(*)

SELECT *
FROM article;

생각해 보니 모든 행(row)의 id 값은 유니크 해야한다.(ADD PRIMARY KEY(id))

오류가 난다. 왜냐하면 기존의 데이터 중에서 중복되는게 있기 때문에

ALTER TABLE article ADD PRIMARY KEY(id);

id가 0인 것 중에서 1개를 id 1로 바꾼다.

UPDATE article
SET id = 1
WHERE id = 0
LIMIT 1;

article 테이블 조회(*)

SELECT *
FROM article;

id가 0인것을 id 2로 바꾼다.

UPDATE article
SET id = 2
WHERE id = 0;

생각해 보니 모든 행(row)의 id 값은 유니크 해야한다.(ADD PRIMARY KEY(id))

이제 적용이 잘 된다.

ALTER TABLE article ADD PRIMARY KEY(id);

id 칼럼에 auto_increment 를 건다.

auto_increment 를 걸기전에 해당 칼럼은 무조건 key 여야 한다.

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

article 테이블 구조확인(desc)

DESC article;

나머지 칼럼 모두에도 not null을 적용해주세요.

ALTER TABLE article MODIFY COLUMN regDate DATETIME NOT NULL;
ALTER TABLE article MODIFY COLUMN title VARCHAR(100) NOT NULL;
ALTER TABLE article MODIFY COLUMN body TEXT NOT NULL;

id 칼럼에 UNSIGNED 속성을 추가하세요.

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article MODIFY COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT;
DESC article;

작성자(writer) 칼럼을 title 칼럼 다음에 추가해주세요.

ALTER TABLE article ADD COLUMN writer VARCHAR(100) NOT NULL AFTER title;

작성자(writer) 칼럼의 이름을 nickname 으로 변경해주세요.(ALTER TABLE article CHANGE oldName newName TYPE 조건)

ALTER TABLE article CHANGE writer nickname VARCHAR(100) NOT NULL;
DESC article;

nickname 칼럼의 위치를 body 밑으로 보내주세요.(MODIFY COLUMN nickname)

ALTER TABLE article MODIFY COLUMN nickname VARCHAR(100) NOT NULL AFTER body;
DESC article;

hit 조회수 칼럼 추가 한 후 삭제해주세요.

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article ADD COLUMN hit INT UNSIGNED NOT NULL AFTER nickname;
DESC article;
ALTER TABLE article DROP COLUMN hit;
DESC article;

hit 조회수 칼럼을 다시 추가

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article ADD COLUMN hit INT UNSIGNED NOT NULL AFTER nickname;
DESC article;

기존의 비어있는 닉네임 채워넣기(무명)

UPDATE article
SET nickname = '무명'
WHERE nickname = '';

article 테이블에 데이터 추가(regDate = NOW(), title = '제목3', body = '내용3', nickname = '홍길순', hit = 10)

INSERT INTO article
SET regDate = NOW(),
title = '제목3',
body = '내용3',
nickname = '홍길순',
hit = 10;

article 테이블에 데이터 추가(regDate = NOW(), title = '제목4', body = '내용4', nickname = '홍길동', hit = 55)

INSERT INTO article
SET regDate = NOW(),
title = '제목4',
body = '내용4',
nickname = '홍길동',
hit = 55;

article 테이블에 데이터 추가(regDate = NOW(), title = '제목5', body = '내용5', nickname = '홍길동', hit = 10)

INSERT INTO article
SET regDate = NOW(),
title = '제목5',
body = '내용5',
nickname = '홍길동',
hit = 10;

article 테이블에 데이터 추가(regDate = NOW(), title = '제목6', body = '내용6', nickname = '임꺽정', hit = 100)

INSERT INTO article
SET regDate = NOW(),
title = '제목6',
body = '내용6',
nickname = '임꺽정',
hit = 100;

조회수 가장 많은 게시물 3개 만 보여주세요., 힌트 : ORDER BY, LIMIT

SELECT * FROM article ORDER BY hit DESC LIMIT 3;

작성자명이 '홍길'로 시작하는 게시물만 보여주세요., 힌트 : LIKE '홍길%'

SELECT * FROM article WHERE nickname LIKE '홍길%';

조회수가 10 이상 55 이하 인것만 보여주세요., 힌트 : WHERE 조건1 AND 조건2

SELECT * FROM article WHERE hit >= 10 AND hit <= 55;

작성자가 '무명'이 아니고 조회수가 50 이하인 것만 보여주세요., 힌트 : !=

SELECT * FROM article WHERE nickname != '무명' AND hit <= 50;

작성자가 '무명' 이거나 조회수가 55 이상인 게시물을 보여주세요. 힌트 : OR

SELECT * FROM article WHERE nickname = '무명' OR hit >= 55;

[MYSQL] 📚 테이블 제약 조건 정리
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4-%EC%A0%95%EB%A6%AC

전체 데이터베이스 리스팅

SHOW DATABASES;

mysql 데이터 베이스 선택

USE mysql;

테이블 리스팅

SHOW TABLES;

특정 테이블의 구조

DESC user;

test 데이터 베이스 선택

USE test;

테이블 리스팅

SHOW TABLES;

기존에 a1 데이터베이스가 존재 한다면 삭제

DROP DATABASE IF EXISTS a1;

새 데이터베이스(a1) 생성

CREATE DATABASE a1;

데이터베이스(a1) 선택

USE a1;

데이터베이스 추가 되었는지 확인

SHOW DATABASES;

테이블 확인

SHOW TABLES;

게시물 테이블 article(title, body)을 만듭니다.

VARCHAR(100) => 문자 100개 저장가능

text => 문자 많이 저장가능

CREATE TABLE article (
title VARCHAR(100),
body TEXT
);

잘 추가되었는지 확인, 리스팅과 구조까지 확인

SHOW TABLES;
DESC article;

데이터 하나 추가(title = 제목, body = 내용)

INSERT INTO article
SET title = '제목',
body = '내용';

데이터 조회(title 만)

SELECT title
FROM article;

데이터 조회(title, body)

SELECT title, body
FROM article;

데이터 조회(body, title)

SELECT body, title
FROM article;

데이터 조회(*) : 모두

SELECT *
FROM article;

데이터 또 하나 추가(title = 제목, body = 내용)

INSERT INTO article
SET title = '제목',
body = '내용';

데이터 조회(*, 어떤게 2번 게시물인지 알 수 없음)

SELECT *
FROM article;

테이블 구조 수정(id 칼럼 추가, first)

주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.

ALTER TABLE article ADD COLUMN id INT FIRST;

데이터 조회(*, id 칼럼의 값은 NULL)

SELECT *
FROM article;

기존 데이터에 id값 추가(id = 1, id IS NULL)

UPDATE article
SET id = 1
WHERE id IS NULL;

데이터 조회(*, 둘다 수정되어 버림..)

미

기존 데이터 중 1개만 id를 2로 변경(LIMIT 1: 한개만)

UPDATE article
SET id = 2
LIMIT 1;

데이터 조회(*)

SELECT *
FROM article;

데이터 1개 추가(id = 3, title = 제목3, body = 내용3)

INSERT INTO article
SET id = 3,
title = '제목3',
body = '내용3';

데이터 조회(*)

SELECT *
FROM article;

2번 게시물, 데이터 삭제 => DELETE

DELETE FROM article
WHERE id = 2;

데이터 조회(*)

SELECT *
FROM article;

날짜 칼럼 추가 => regDate DATETIME

ALTER TABLE article ADD COLUMN regDate DATETIME AFTER id;

테이블 구조 확인

DESC article;

데이터 조회(*, 날짜 정보가 비어있음)

SELECT *
FROM article;

1번 게시물의 비어있는 날짜정보 채움(regDate = 2018-08-10 15:00:00)

UPDATE article
SET regDate = '2018-08-10 15:00:00'
WHERE id = 1;

데이터 조회(*, 이제 2번 게시물의 날짜 정보만 넣으면 됩니다.)

SELECT *
FROM article;

NOW() 함수 실행해보기

SELECT NOW();

3번 게시물의 비어있는 날짜정보 채움(NOW())

UPDATE article
SET regDate = NOW()
WHERE id = 3;

데이터 조회(*)

SELECT *
FROM article;

DBMS (MariaDB) 기본 구조 이해 (정리)

개발자로서 데이터베이스를 완벽히 장악하기 위해 반드시 거쳐야 할 필수 관문입니다. 이 4가지 카테고리가 데이터베이스 세상에서 어떤 역할을 수행하고 서로 어떻게 긴밀하게 상호작용하는지, 비전공자도 단번에 이해할 수 있는 일상생활의 비유와 논리적 도식화를 통해 이해하기


1. 🏗️ SQL 4대 카테고리 개념 및 비유 분석

우리가 "새로운 아파트 단지를 건설하고 사람들을 입주시키는 거대한 프로젝트"를 진행한다고 가정해 봅시다.

① DDL (Data Definition Language - 데이터 정의어)

  • 한 줄 정의: 데이터베이스나 테이블의 뼈대와 구조(Schema)를 생성, 변경, 삭제하는 언어입니다.
  • 🏠 아파트 비유: 아파트 단지 설계도를 그리고, 콘크리트를 타설하여 "건물의 방과 거실 구조(테이블)"를 짜는 과정입니다.
  • 핵심 명령어:
    • CREATE: 새로운 데이터베이스나 테이블 생성 (방 만들기)
    • ALTER: 기존 테이블의 구조를 변경 (방 확장하기, 기둥 추가하기)
    • DROP: 테이블을 완전히 폭파하여 영구 삭제 (건물 철거하기)
    • TRUNCATE: 테이블 구조는 남겨두고 안의 알맹이 데이터만 즉시 통째로 비우기

② DML (Data Manipulation Language - 데이터 조작어)

  • 한 줄 정의: DDL로 만든 테이블 내부에 실제 데이터(레코드)를 삽입, 조회, 수정, 삭제(CRUD)하는 언어입니다.
  • 🏠 아파트 비유: 다 지어진 아파트의 각 호실에 "사람(데이터)을 이사 시키고, 인적 사항을 변경하고, 조회하는 일상 활동"입니다.
  • 핵심 명령어:
    • INSERT: 새로운 데이터 추가 (새 입주민 전입신고)
    • SELECT: 조건에 맞는 데이터 찾아오기 (특정 호실의 주민 찾기)
    • UPDATE: 기존 데이터 내용 수정 (입주민 전화번호 변경)
    • DELETE: 조건에 맞는 데이터 삭제 (퇴거 및 이사 나가기)

③ DCL (Data Control Language - 데이터 제어어)

  • 한 줄 정의: 데이터베이스에 접근하고 데이터를 제어할 수 있는 보안 권한을 설정하는 언어입니다.
  • 🏠 아파트 비유: 아파트 보안팀이 입주민에게 "현관 출입 카드키를 발급(GRANT)"해 주거나, 외부인의 "무단출입을 제한 및 회수(REVOKE)"하는 보안 통제 과정입니다.
  • 핵심 명령어:
    • GRANT: 특정 사용자에게 특정 DB 작업 권한을 부여
    • REVOKE: 부여했던 권한을 다시 회수

④ TCL (Transaction Control Language - 트랜잭션 제어어)

  • 한 줄 정의: DML(데이터 조작)로 수행한 작업들이 안전하게 처리되도록 트랜잭션(하나의 작업 단위)을 최종 확정하거나 취소하는 안전장치 언어입니다.
  • 🏠 아파트 비유: 계약금을 입금하고 입주 서류를 제출하는 등 "이사의 모든 프로세스가 완벽히 끝나야 열쇠를 건네주고 계약을 확정(COMMIT)"하거나, 중간에 하나라도 서류가 누락되면 "계약 이전 상태로 완벽히 원상복구(ROLLBACK)"시키는 계약 안전 메커니즘입니다.
  • 핵심 명령어:
    • COMMIT: 임시 저장된 변경 사항을 디스크에 영구적으로 반영
    • ROLLBACK: 마지막 COMMIT 이후의 모든 작업 내용을 전부 취소하고 되돌림
    • SAVEPOINT: 롤백할 때 특정 지점까지만 되돌릴 수 있도록 북마크를 지정

2. 🗺️ 한눈에 이해하는 SQL 4대 카테고리의 관계 도식화

이 4가지 언어들은 따로 놀지 않고, 아래와 같이 유기적인 선후 관계와 파이프라인을 그리며 작동합니다.

[ 🔑 DCL (보안/권한 제어) ]  ── 권한이 있어야 입장 가능!
      │
      ▼ (권한 부여: GRANT)
      │
[ 🏗️ DDL (공간/뼈대 정의) ]  ── 구조가 세워져야 데이터가 저장 가능!
      │
      ▼ (테이블 생성: CREATE TABLE)
      │
[ ✍️ DML (실제 데이터 조작) ] ── 가상의 데이터들이 메모리상에 임시 배치됨
      │
      ├─► [ 101호 김철수 이사 전입 ] (INSERT)
      ├─► [ 102호 이영희 정보 수정 ] (UPDATE)
      │
      ▼ (안전성 검증: 트랜잭션)
      │
[ 🛡️ TCL (트랜잭션/안전성 제어) ]
      │
      ├── [ 에러/네트워크 끊김 없음? ] ──► (COMMIT) ──► 하드디스크에 영구 저장! 🎉
      │
      └── [ 입력 도중 예외나 장애 발생? ] ──► (ROLLBACK) ─► 작업 전 상태로 전원 퇴거! ↩️

###실무용 핵심 요약 팁

  1. 동작의 무게감 차이:
    • DDL은 하드디스크의 물리적 공간 구조 자체를 건드리는 무거운 작업이므로 자동 커밋(Auto Commit)이 일어납니다. (되돌리기(ROLLBACK)가 불가능하므로 실무에서는 치명적입니다!)
    • DML은 메모리 공간에서 임시로 조작하기 때문에, 마음에 들지 않거나 실수를 했다면 TCL(ROLLBACK)을 사용해 언제든지 과거로 시간을 되돌릴 수 있습니다.
  2. 권한 기반의 조율:
    • 일반적인 백엔드 서비스 계정은 해킹 위협을 방지하기 위해 DDL이나 DCL 권한은 주지 않고, 오직 DML(조회, 삽입, 수정 등)과 TCL 권한만 부여하는 것이 엔지니어링 업계의 표준 보안 수칙입니다.

0개의 댓글