데이터 CRUD란 데이터베이스의 데이터를 관리하기 위한 기본 동작으로
데이터를 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)하는 것을 말합니다.
데이터 CRUD는 DBMS의 필수 기능으로 SQL 명령을 통해 수행합니다.
❗️참고
쿼리(query)란 '문의하다', '질문하다'라는 뜻으로 데이터베이스에 사용자가 원하는 특정 데이터를 보여달라고 요청하는 것입니다.
쿼리는 SQL을 이용해 하나의 명령문으로 작성하며, 하나의 쿼리는 하나의;
(세미콜론)으로 구분합니다.
MySQL 서버에 저장된 데이터베이스 목록을 조회하는 쿼리는 다음과 같습니다.
SHOW DATABASES;
새로운 데이터베이스를 만들기 위한 쿼리 형식은 다음과 같습니다.
CREATE DATABASE 데이터베이스명;
새로 만든 데이터베이스에 진입하는 쿼리는 다음과 같습니다. 데이터베이스에 진입하는 것은 해당 데이터베이스를 사용하겠다는 의미이므로 USE
문을 사용합니다.
USE 데이터베이스명;
데이터베이스 진입 성공 여부는 다음 SQL 문을 통해 확인할 수 있습니다. 이를 실행하면 결과 창에 현재 사용 중인 데이터베이스 나타납니다.
SELECT DATABASE();
데이터베이스 자체를 삭제할 때는 DROP DATABASE
를 사용합니다.
-- 해당 데이터베이스 내부의 모든 테이블과 데이터가 영구적으로 삭제됨
DROP DATABASE 데이터베이스명;
만약 데이터베이스가 존재할 때만 삭제하고 싶다면 IF EXISTS
옵션을 사용할 수 있습니다.
-- 해당 데이터베이스가 존재할 때만 삭제됨
DROP DATABASE IF EXISTS 데이터베이스명;
SQL 코드에서도 주석을 사용하여 코드에 대한 설명을 추가할 수 있습니다.
주석이란 쿼리에 대한 설명을 메모로 작성한 것으로 주석은 쿼리 실행에 아무런 영향을 미치지 않습니다.
SQL 주석은 한 줄 주석과 블록 주석이 있습니다.
연속된 하이픈 두 개(--
)로 작성하며 해당 줄이 모두 주석 처리됩니다.
-- 이 코드는 데이터베이스를 생성합니다.
CREATE DATABSE mydb;
/*
로 열고 */
로 닫는 형식으로 작성합니다. 주석의 시작과 끝을 표시하기 때문에 여러 줄에 걸쳐 주석을 작성할 때 사용합니다.
/*
이 코드는 데이터베이스를 생성하고,
이후 해당 데이터베이스로 진입합니다.
*/
CREATE DATABASE mydb;
USE mydb;
데이터베이스를 만들었으니, 이제 테이블을 생성하고 데이터를 삽입, 조회하는 방법을 알아보겠습니다.
테이블을 생성하려면 CREATE TABLE
문을 사용합니다.
CREATE TABLE 테이블명 (
칼럼명1 자료형1,
칼럼명2 자료형2,
...
PRIMARY KEY (칼럼명)
);
CREATE TABLE
문에서 칼럼명은 칼럼의 이름을 말하고, 자료형은 칼럼의 데이터 유형을 말합니다. 데이터 유형은 크게 숫자형, 문자형, 날짜 및 시간형이 있습니다.
PRIMARY KEY
는 기본키를 설정하는 키워드입니다. 괄호 안에 기본키로 지정할 칼럼명을 작성하면 기본키로 설정됩니다.
기본키(Primary Key)는 중복되지 않으며 NULL을 허용하지 않는 고유한 값으로, 테이블의 각 행을 식별하는 칼럼입니다.
기본키는 PRIMARY KEY
키워드를 사용해 별도 행에 지정하는 방법이 있고, 다음과 같이 칼럼을 정의할 때 같이 지정하는 방법도 있습니다.
CREATE TABLE table (
id INTEGER PRIMARY KEY, -- 칼럼을 정의할 때 기본키 지정 가능
...
)
테이블의 구조(스키마)를 확인하려면 다음 명령어를 사용합니다. DESC
문은 조회하는 테이블의 구조를 표 형식으로 보여 줍니다.
DESC 테이블명;
테이블에 데이터를 삽입할 때는 INSERT INTO
문을 사용합니다.
다음과 같이 INSERT INTO
다음에 데이터를 삽입할 테이블명과 칼럼 목록을 작성하고, VALUES
다음에 괄호를 열고 칼럼 순서대로 실제 입력값을 작성합니다.
INSERT INTO 테이블명 (칼럼명1, 칼럼명2, ...)
VALUES (입력값1, 입력값2, ...);
INSERT INTO users (name, email)
VALUES ('홍길동', 'abc@example.com');
INSERT INTO users (name, email)
VALUES
('김김김', 'kim@example.com'),
('이이이', 'lee@example.com');
INSERT INTO users
VALUES (1, '박박박', 'park@example.com', NOW());
❗️주의
칼럼명을 생략하면 모든 칼럼 순서대로 값을 넣어야 합니다.
테이블의 데이터를 조회할 때는 SELECT
문을 사용합니다.
SELECT
다음에 조회할 칼럼명을 나열하고 FROM
뒤에 조회할 테이블명을 적습니다. 마지막으로 WHERE
절에는 조회하고 싶은 조건을 작성합니다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명
WHERE 조건;
테이블의 모든 데이터를 조회하고 싶다면 칼럼명 대신 *
(애스터리스크) 기호를 사용하고, WHERE
절은 생략합니다.
SELECT * FROM 테이블명;
SELECT * FROM users WHERE email = 'abc@example.com';
SELECT * FROM users WHERE age >= 30;
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-2-10';
SELECT * FROM users WHERE name LIKE '김%'; -- 이름이 '김'으로 시작하는 사람 조회
데이터를 정렬하여 조회할 수도 있습니다.
-- 이름을 오름차순으로 정렬
SELECT * FROM users ORDER BY name ASC;
-- 최근 가입한 사용자부터 내림차순으로 조회
SELECT * FROM users ORDER BY created_at DESC;
조회할 데이터 개수를 제한하여 조회할 수도 있습니다.
-- 상위 5개 데이터만 조회
SELECT * FROM users LIMIT 5;
-- 3번째 데이터부터 5개만 조회
SELECT * FROM users LIMIT 3, 5;
테이블의 데이터를 수정할 때는 UPDATE
문을 사용합니다.
UPDATE
문의 SET
절에는 수정할 칼럼명과 수정할 값을 입력하고, WHERE
절에는 수정할 대상을 찾기 위한 조건을 입력합니다. 조건이 없다면 WHERE
절은 생략할 수 있습니다.
UPDATE 테이블명
SET 칼럼명1 = 값1, 칼럼명2 = 값2, ...
WHERE 조건;
UPDATE users
SET email = 'honghong@example.com'
WHERE name = '홍길동';
UPDATE users
SET email = REPLACE(email, 'example.com', 'test.com');
MySQL은 실수로 대량의 데이터를 수정하는 것을 방지하기 위해 안전모드가 설정되어 있습니다. 안전모드를 해제하지 않고 수정하면 다음과 같은 에러가 발생합니다.
다음 명령으로 안전모드를 해제할 수 있습니다. 출력 창에 안전모드를 해제했다는 성공 표시가 뜹니다.
-- 안전모드 해제
SET SQL_SAFE_UPDATES = 0;
안전모드 해제는 권장사항이 아닙니다. 따라서 데이터 수정 작업이 끝나면 안전모드를 재설정하도록 합니다.
재설정 후 출력 창에 안전모드를 설정했다는 성공 표시가 뜨는지 확인합니다.
-- 안전모드 재설정
SET SQL_SAFE_UPDATES = 1;
테이블에서 특정 데이터를 삭제할 때는 DELETE
문을 사용합니다.
DELETE FROM 테이블명 WHERE 조건;
WHERE
절을 사용하지 않으면 테이블 자체의 구조만 남고 모든 데이터가 삭제됩니다.
DELETE FROM 테이블명;
테이블의 모든 데이터를 삭제할 때는 조건 없이(WHERE 없이) DELETE
를 사용할 수도 있지만, TRUNCATE
를 사용하는 것이 더 효율적입니다.
TRUNCATE는 테이블의 모든 데이터를 빠르게 삭제하고, 자동 증가값(AUTO_INCREMENT)을 초기화합니다.
-- users 테이블의 모든 행 삭제
DELETE FROM users;
-- 테이블의 모든 데이터를 삭제하고, 자동 증가값(AUTO_INCREMENT)을 초기화
TRUNCATE TABLE users;
테이블 자체를 삭제할 때는 DROP TABLE
을 사용합니다.
-- 테이블과 함께 모든 데이터가 영구적으로 삭제됨
DROP TABLE 테이블명;