2025/09/03 Database -2

김기훈·2025년 9월 3일

TIL

목록 보기
12/194

SQL(Structured Query Language)

  • 관계형 데이터베이스에서 데이터를 정의, 처리, 제어하는데 사용되는 표준화된 언어입니다.
  • SQL은 주로 데이터베이스 관리 시스템(DBMS)과의 상호 작용을 위해 설계되었습니다.

1. 데이터 정의 언어 (DDL - Data Definition Language)

  • 데이터베이스의 구조를 정의하고 관리하는데 사용됩니다.

    • CREATE: 데이터베이스 객체를 생성합니다. (CREATE TABLE, CREATE INDEX 등)
      • primary key 없으면, unique or not null 이 우선이 됨
    CREATE TABLE employees (
      employee_id INT PRIMARY KEY,
      first_name VARCHAR(50),
      last_name VARCHAR(50),
      hire_date DATE
    );
    • ALTER: 데이터베이스 객체를 수정합니다. (ALTER TABLE 등)
    ALTER TABLE employees
    ADD COLUMN department VARCHAR(50);
    • DROP: 데이터베이스 객체를 삭제합니다. (DROP TABLE 등)
    DROP TABLE employees;
    • TRUNCATE: 테이블의 모든 레코드를 삭제하지만 테이블은 유지합니다.
    TRUNCATE TABLE employees;

2. 데이터 처리 언어 (DML - Data Manipulation Language)

  • DML은 데이터베이스 내의 데이터를 처리하는데 사용
  • 검색, 삽입, 수정, 삭제하는 데 사용됩니다.
  • SELECT: 데이터베이스에서 정보를 검색합니다.
SELECT first_name, last_name FROM employees WHERE department = 'IT';
  • INSERT: 새로운 데이터를 테이블에 삽입합니다.
INSERT INTO employees (employee_id, first_name, last_name, hire_date, department)
VALUES (1, 'John', 'Doe', '2022-01-01', 'IT');
  • UPDATE: 테이블의 기존 데이터를 수정합니다.
UPDATE employees SET department = 'HR' WHERE employee_id = 1;
  • DELETE: 테이블에서 데이터를 삭제합니다.
DELETE FROM employees WHERE employee_id = 1;

3. 데이터 제어 언어 (DCL - Data Control Language)

  • 데이터베이스 사용자의 권한을 관리하고 데이터 접근을 제어하는데 사용
  • GRANT: 사용자에게 특정 작업을 수행할 권한을 부여합니다.
GRANT SELECT ON employees TO username;
  • REVOKE: 사용자로부터 특정 작업 수행 권한을 제거합니다.
REVOKE SELECT ON employees FROM username;

4. 데이터 관리 언어(TCL - Transaction Control Language)

  • 데이터베이스 내의 트랜잭션을 관리하는데 사용
    • COMMIT: 트랜잭션을 완료하고, 데이터베이스 변경사항을 영구적으로 저장
    • ROLLBACK: 트랜잭션을 취소하고, 마지막 COMMIT 이후의 모든 변경사항을 되돌림
    • SAVEPOINT: 트랜잭션 내 특정 지점을 마킹하여 필요시 그 지점으로 되돌릴 수 있음

MySQL User 데이터

관리자 권한: 유저와 관련된 작업을 수행하기 위해서는 MySQL에서 관리자(보통 root) 권한이 필요

  • mysql -u root -p : 유저 로그인

1. mysql 유저 확인

  • USE mysql;
  • select * from user;
    • 테이블에 있는 모든 행(row)과 모든 열(column)을 다 보여주는 명령어

2. mysql 유저 생성

  • USE mysql;
  • CREATE USER 'username'@'localhost' IDENTIFIED BY 'user_password';

3. 사용자 비밀번호 변경

  • SET PASSWORD FOR 'username'@'%' = '신규비밀번호';

4. 권한 부여 (모든 데이터베이스에 대한 권한 부여)

> GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
> FLUSH PRIVILEGES; # 변경된 권한 적용
> SHOW GRANTS FOR 'username'@'localhost'; # 부여된 권한 확인
> SHOW GRANTS; # 현재 로그인한 유저의 권한 확인

5. 사용자 삭제

  • USE mysql;
  • DROP USER 'username'@'%';

MySQL 데이터베이스 Schema 구성 (DDL)

PRIMARY KEY / AUTO_INCREMENT / NOT NULL / UNIQUE / DEFAULT / CHECK

  • DDL에서 테이블을 만들거나 수정할 때 자주 쓰는 제약 조건과 옵션

  • PRIMARY KEY(고유 식별자)

    • 테이블에서 행(row)을 유일하게 식별할 수 있는 키 / 자동으로 NOT NULL + UNIQUE 성질
  • AUTO_INCREMENT

    • 숫자 컬럼의 값을 자동으로 1씩 증가시켜줌
    • PRIMARY KEY와 함께 쓰여, 새로운 데이터가 들어올 때 자동으로 번호가 붙음
  • NOT NULL

    • 해당 컬럼에 NULL 값을 허용하지 않음 즉, 반드시 값이 있어야 함.
      INSERT INTO Users (username) VALUES (NULL); -- NULL은 불가
  • UNIQUE

    • 해당 컬럼의 값이 중복될 수 없음 단, NULL은 여러 번 허용됨(MySQL에서는 가능)
  • DEFAULT

    • 값을 입력하지 않았을 때 자동으로 들어가는 기본값.
  • CHECK

    • 해당 칼럼에 저장될 수 있는 값의 범위나 조건을 지정
    age INT DEFAULT 18 CHECK (age >= 0)
    
    # 실행
    INSERT INTO Users (username, email)
    VALUES ('김철수', 'kim@test.com');   -- age는 입력 안 했으므로 18로 자동

CREATE TABLE Users (
    id INT PRIMARY KEY AUTO_INCREMENT,       -- 고유번호, 자동 증가
    username VARCHAR(50) NOT NULL UNIQUE,    -- 이름은 중복 불가, NULL 불가
    # VARCHAR(50) → 최대 50글자까지 저장 가능 (0~50 글자).
    email VARCHAR(100) UNIQUE,               -- 이메일은 중복 불가 (NULL 허용 가능)
    age INT DEFAULT 18 CHECK (age >= 0),     -- 기본값은 18, 음수 불가
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 입력 안 하면 현재시간 자동
);

# 사용 예시

INSERT INTO Users (username, email, age)
VALUES ('홍길동', 'hong@test.com', 25);

INSERT INTO Users (username, email)
VALUES ('김철수', 'kim@test.com');   -- age는 입력 안 했으므로 18로 자동

MySQL 데이터 타입

분류타입특징/용도사용 예시
숫자형INT정수 (일반 범위, 약 –21억 ~ 21억)사용자 ID, 나이, 게시글 번호
BIGINT매우 큰 정수 (약 –9경 ~ 9경)유튜브 조회수, 은행 계좌 금액
DECIMAL정확한 소수 (금액, 환율 계산에 적합)상품 가격, 환율, 급여
FLOAT근사 소수 (빠름, 정밀도 낮음)온도, GPS 좌표, 과학 계산
문자형CHAR(n)고정 길이, 자리 부족하면 공백 채움주민등록번호 뒷자리, 국가 코드(“KR”)
VARCHAR(n)가변 길이, 실제 글자 수만 저장이름, 이메일, 주소
TEXT긴 문자열 (최대 4GB)게시글 본문, 댓글 내용
BLOB바이너리 데이터(파일 저장)프로필 사진, 첨부 파일
날짜/시간DATE날짜만 저장 (YYYY-MM-DD)생년월일, 행사일
DATETIME날짜+시간 (넓은 범위 기록 가능)주문일시, 예약 시간
TIMESTAMP날짜+시간 (자동 기록, 로그용)회원 가입 시간, 최근 수정 시간

사용자(User) 테이블 만들기

CREATE TABLE Users (
    id INT PRIMARY KEY AUTO_INCREMENT,    -- 회원 번호 (자동 증가)
    username VARCHAR(50) NOT NULL UNIQUE, -- 사용자 이름 (최대 50글자, 중복 불가)
    email VARCHAR(100) NOT NULL UNIQUE,   -- 이메일 (최대 100글자, 중복 불가)
    age INT,                              -- 나이 (정수)
    balance DECIMAL(10,2) DEFAULT 0.00,   -- 계좌 잔액 (소수점 2자리, 금액)
    profile_text TEXT,                    -- 자기소개 (긴 글 가능)
    profile_image BLOB,                   -- 프로필 이미지 (바이너리 저장)
    birth DATE,                           -- 생년월일 (날짜만)
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 가입 시간 (자동 기록)
);

데이터 삽입 예시

INSERT INTO Users (username, email, age, balance, profile_text, birth)
VALUES 
('honggildong', 'hong@test.com', 25, 15000.50, '안녕하세요, 홍길동입니다.', '2000-05-05');

INSERT INTO Users (username, email, age, balance, profile_text, birth)
VALUES 
('kimcs', 'kim@test.com', 30, 0.00, '여행을 좋아합니다.', '1995-10-10');

저장된 데이터 확인

SELECT id, username, email, age, balance, birth, created_at
FROM Users;
idusernameemailagebalancebirthcreated_at
1honggildonghong@test.com2515000.502000-05-052025-09-03 15:40:00
2kimcskim@test.com300.001995-10-102025-09-03 15:41:00

  • 이미 있으면 비밀번호만 변경
ALTER USER 'username'@'localhost' IDENTIFIED BY 'password';
  • 지우고 새로 만들기
DROP USER IF EXISTS 'username'@'localhost';

PRIMARY KEY

  • 테이블에서 행(row)을 유일하게 식별할 수 있는 키
    • 식별한다 : 이 행이 어떤 데이터인지 정확히 구분할 수 있다.
      • 중복 불가 (두 행이 같은 키 값을 가질 수 없음)
      • NULL 불가 (값이 비어 있으면 식별 불가능하니까)
CREATE TABLE users (
    user_id INT PRIMARY KEY,   -- 식별자
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);
  • 예를 들어 name만 보면? → "철수"가 2명이라서 헷갈림 ❌
  • age만 보면? → 25살도 2명이 있어서 중복 ❌
  • 그런데 user_id는? → 1, 2, 3 전부 고유한 값이라 절대 중복 없음 ⭕
    • user_id는 각 행을 고유하게 식별(identify)할 수 있는 값

FOREIGN KEY

  • FOREIGN KEY: 다른 테이블의 PRIMARY KEY(또는 UNIQUE KEY)를 참조하는 키.
    • 데이터 무결성 보장 : 존재하지 않는 값을 막음.
profile
안녕하세요.

0개의 댓글