티스토리 뷰
NoSQL과 비교해서 보면 좋습니다.
SQL의 기본적인 문법에 대하여
SQL
SQL은 Structured Query Language의 약자로
관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 프로그래밍 언어입니다.
질의어지만 질의 기능뿐 아니라 데이터 구조의 정의, 데이터 조작, 데이터 제어 기능을 모두 가지고 있습니다.
SQL의 분류
SQL은 크게 3가지로 분류됩니다.
데이터 정의어 (DDL)
- Data Definition Language
- 스키마(SCHEMA), 도메인(DOMAIN), 테이블(TABLE), 뷰(VIEW), 인덱스(INDEX)를 정의하거나 변경 또는 제거할 때 사용.
- 데이터베이스의 구조, 데이터 형식, 접근 방식 등을 생성하거나 수정할 목적으로 사용하는 언어.
- ex. CREATE / ALTER / DROP
데이터 조작어 (DML) ⭐
- Data Manipulation Language
- 데이터베이스 사용자가 저장된 데이터를 처리할 때 사용.
- 데이터베이스 사용자와 데이터베이스 관리 시스템 간 인터페이스를 제공.
- ex. SELECT/ INSERT/ DELETE
데이터 제어어 (DCL)
- Data Control Language
- 데이터의 무결성, 보안 및 권한 제어, 회복 등을 하기 위해 사용.
- ex. COMMIT/ ROLLBACK/ GRANT / REVOKE
기본적인 SQL 구문
SQL의 명령어들은 보통 여러 속성들을 제공합니다.
속성을 이용해 사용자는 다채롭게 데이터들을 저장하고 조회할 수 있죠.
하지만 테이블의 관계가 복잡하거나, 원하는 결과를 얻기 위해서 조건을 걸다 보면 한없이 복잡한 SQL이 만들어질 수 있습니다.
이번글에서는 복잡한 SQL문 보다 간단한 DDL과 DML의 예시만 작성해보려고 합니다.
테이블을 생성하고 단순히 CRUD를 하기 위해서 필요한 쿼리들입니다.
테이블 생성하기
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
users라는 테이블을 만듭니다. CREATE 명령어를 사용합니다.
프로그래밍 언어와 같이 SQL에도 예약어가 있습니다.
예약어로 이미 선점된 것(ex. user)을 쓰는 경우 휴먼 에러의 원인이 되니 조심해야 합니다.
DB 설계에는 소문자 스네이크 케이스를 권장합니다!
최신 버전의 데이터베이스들과 달리 구 버전의 경우, 대소문자를 구별 못하는 경우가 간혹 있습니다.
따라서 테이블을 설계할 때는 소문자_스네이크_케이스로 작성하는 게 좋습니다.
데이터 삽입하기
INSERT INTO users (username, email) VALUES ('rimo', 'rimo@example.com');
users 테이블에 데이터를 저장합니다.
INSERT INTO users (username, email)
VALUES
('rimo_010', 'rimo1@example.com'),
('rimo_020', 'rimo2@example.com'),
('rimo_030', 'rimo3@example.com');
VALUES 뒤에 쉼표를 이어서 여러 개의 데이터를 한 번에 넣을 수가 있습니다.
서버 개발 시 ORM을 이용해 DB 접근하는 경우들이 있습니다.
삽입 속도가 느리다면, 한 번에 넣을 수 있는 데이터를 단 건으로 넣고 있는 경우일 수 있습니다.
대부분의 ORM은 이에 대한 메서드들을 구현해서 제공하고 있으니 알아보고 활용하는 게 좋습니다. ⭐
데이터 조회하기
SELECT * FROM users;
users 테이블의 모든 행을 조회합니다.
여기에 조건절(WHERE)을 붙이면 원하는 데이터들만을 골라 조회할 수 있죠.
SELECT * FROM users WHERE username = 'rimo';
username이 'rimo'인 행을 골라 조회합니다.
저장된 데이터가 많고, 칼럼이 복잡할수록 SELECT 성능은 떨어집니다.
이는 애플리케이션의 성능, 비용과 직결되는 문제죠.
SQL을 DB가 처리할 데이터 수를 줄일 수 있는 방향으로 작성해야 합니다.
데이터 업데이트하기
UPDATE users SET email = 'newemail@example.com' WHERE username = 'rimo';
데이터 삭제하기
DELETE FROM users WHERE username = 'rimo';
실제 서비스에서 데이터를 삭제하는 경우는 드물다고 해요.
softdelete 하고 사용자에게 노출시키지 않을 뿐이죠.
softdelete와 실무데이터 처리와 관련한 이슈 링크를 남겨둡니다!✌️
테이블 구조 변경하기 (열 추가)
ALTER TABLE users ADD COLUMN age INT;
칼럼을 새로 추가합니다.
테이블 삭제하기
DROP TABLE users;
이따금 실사용 테이블을 날렸다는 안타까운 이야기가 들리곤 합니다.
테이블의 구조를 변경하거나 삭제해야 때에는 서비스에 영향이 없도록 주의해야해요.
여기까지 간단한 SQL문과 서비스 적용 시 고려해야 할 몇 가지 점들을 작성해 보았습니다.
다음글은 인덱스(Index)에 대해 써보겠습니다.
감사합니다.
공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.
'DB' 카테고리의 다른 글
[DB] 정규형(Normal form) (0) | 2024.03.08 |
---|---|
[DB] 인덱스(Index) (0) | 2024.03.07 |
[DB] NoSQL과 레디스(Redis) (0) | 2023.12.07 |
[DB] 트랜잭션(Transaction)과 트랜잭션 격리 수준(Isolation Level) (0) | 2023.11.07 |
[DB] ORM(Object Relational Mapping)이란, 객체-관계 불일치 (0) | 2023.10.31 |