최원종의 개발 블로그

SQL - DDL, DML, DCL -5 본문

MySQL

SQL - DDL, DML, DCL -5

chl6698 2026. 4. 2. 11:32

SQL의 세 가지 역할

DDL (Data Definition Language)  - 구조를 만든다
  도서관 설계자: 책장을 어디에 몇 개 놓을지 설계
  → CREATE, ALTER, DROP

DML (Data Manipulation Language) - 데이터를 다룬다
  도서관 사서: 책을 추가하고, 찾아주고, 교체하고, 폐기
  → INSERT, SELECT, UPDATE, DELETE

DCL (Data Control Language)      - 권한을 관리한다
  도서관 관리자: 누가 어떤 책을 볼 수 있는지 결정
  → GRANT, REVOKE

DDL(Data Definition Language)

  • 구조를 만드는 역
  • 테이블이나 데이터베이스 자체를 만들고 수정하고 삭제
-- 데이터베이스 생성
CREATE DATABASE school;
USE school;

-- 테이블 생성
CREATE TABLE student (
    student_id INT         PRIMARY KEY,
    name       VARCHAR(50) NOT NULL,
    grade      INT         NOT NULL,
    major      VARCHAR(50) NOT NULL,
    phone      VARCHAR(20)
);

-- 테이블 구조 확인
DESC student;

-- 컬럼 추가
ALTER TABLE student ADD COLUMN email VARCHAR(100);

-- 컬럼 삭제
ALTER TABLE student DROP COLUMN email;

-- 테이블 삭제
DROP TABLE student;

-- 데이터베이스 삭제
DROP DATABASE school;

DML (Data Manipulation Language)

  • 데이터를 다루는 역할
  • 가장 많이 사용하는 SQL
-- school DB 와 student 테이블이 있다고 가정

-- 데이터 추가 (INSERT)
INSERT INTO student (student_id, name, grade, major, phone)
VALUES (1001, '김철수', 2, '컴퓨터공학', '010-1234-5678');

-- 여러 건 한 번에
INSERT INTO student (student_id, name, grade, major, phone) VALUES
(1002, '이영희', 3, '경영학', '010-2345-6789'),
(1003, '박민준', 1, '전자공학', '010-3456-7890');

-- 데이터 조회 (SELECT)
SELECT * FROM student;
SELECT name, major FROM student WHERE grade = 2;

-- 데이터 수정 (UPDATE)
--  WHERE 없으면 전체 행이 수정됩니다!
UPDATE student SET grade = 3 WHERE student_id = 1001;

-- 데이터 삭제 (DELETE)
-- WHERE 없으면 전체 행이 삭제됩니다!
DELETE FROM student WHERE student_id = 1003;

 


DCL(Data Control Language)

  • 권한을 관리하는 역할
DCL 은 주로 DB 관리자(DBA)가 사용합니다.
개발자도 개념은 알아야 합니다.
-- 사용자 생성 (계정 관리 명령어 - DDL 에 가깝지만 DCL 과 함께 사용됨)
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123';

-- 조회 권한 부여 (DCL)
GRANT SELECT ON school.student TO 'user1'@'localhost';

-- 권한 회수 (DCL)
REVOKE SELECT ON school.student FROM 'user1'@'localhost';

권한 관리 실습 코드

-- DCL(Data Control Language) - 권한을 관리한다

-- 사용자 생성 (사람, 시스템에게 줄 수 있다) 
create user 'user1'@'localhost' identified by 'passowrd123';
-- localhost <--- 내 컴퓨터 안에서 접근하는 계정 
-- 외부 IP 에서 접근하게 하려면 ?? 찾아서 완성 해야 함. 

-- 조회 권한 부여 
grant SELECT on school.student to 'user1'@'localhost';

-- 권한 회수 
revoke select on school.student FROM 'user1'@'localhost'; 


-- 도전 문제 
-- 외부 사용자가 사용할 계정을 생성하고 조회 권한만 주고 접속 확인(계정을 받은 사람)  
-- IP 주소 확인 

-- 풀이 

-- 1. 로컬 접속 계정와 별개로 외부 접속용 계정 모두 만들어 줘야 한다. 필요없다면 로컬은 생성안해도 됨. 

create user 'tenco'@'localhost' identified by 'asd1234!';
create user 'tenco'@'%' identified by 'asd1234!';  -- 모든 IP 허용 

-- 2. 권한 부여 select, insert .. 추가 가능 하다. 모든 권한 부여 (ALL PRIVILEGES) 
grant all privileges on school.* to 'tenco'@'localhost';      -- *.*  RDBMS 안에 모든 db 모든 테이블
grant all privileges on school.* to 'tenco'@'%';

-- 권한 확인 
show grants for 'tenco'@'localhost';
show grants for 'tenco'@'%';

-- 참고, 추가된 권한이 바로 적용 안될 수 도 있음 
flush privileges;  -- 바로 적용 

-- 3. 권한 회수 
revoke ALL privileges on school.* from 'tenco'@'localhost';
revoke ALL privileges on school.* from 'tenco'@'%';

 

UPDATE / DELETE 안전 습관

실무에서 가장 많이 발생하는 실수:
   WHERE 없이 UPDATE 또는 DELETE 실행

나쁜 예:
  UPDATE student SET grade = 0;          -- 전체 학생 학년이 0 이 됨
  DELETE FROM student;                   -- 전체 학생 데이터 삭제

좋은 습관:
  UPDATE / DELETE 전에 항상 SELECT 로 먼저 확인

  -- 1. 먼저 확인
  SELECT * FROM student WHERE student_id = 1001;

  -- 2. 확인 후 수정
  UPDATE student SET grade = 3 WHERE student_id = 1001;

 


 

핵심 요약

DDL : CREATE(생성), ALTER(변경), DROP(삭제) → 구조 담당
DML : INSERT, SELECT, UPDATE, DELETE       → 데이터 담당
DCL : GRANT, REVOKE                        → 권한 담당

UPDATE / DELETE 에서 WHERE 필수
없으면 전체 행이 영향받음
실행 전 SELECT 로 대상 먼저 확인

'MySQL' 카테고리의 다른 글

INSERT 구문과 제약 조건 -7  (0) 2026.04.02
MySQL 데이터 타입 - 6  (0) 2026.04.02
데이터베이스 설계 시나리오  (0) 2026.04.02
데이터베이스란?  (0) 2026.04.02
데이터와 정보  (0) 2026.04.01