SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 정의, 조작, 제어 및 트랜잭션을 관리하는 표준 언어입니다. 본 포스트에서는 SQL의 주요 문법을 정리하려고 합니다.



DDL (Data Definition Language)


DDL은 데이터베이스의 구조를 정의하는 SQL 문법입니다. 주로 테이블, 스키마, 인덱스 등을 생성하거나 변경할 때 사용됩니다.

CREATE TABLE

새로운 테이블을 생성하는 문법입니다.

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

ALTER TABLE

기존 테이블의 구조를 변경하는 문법입니다.

ALTER TABLE users ADD COLUMN age INT;

DROP TABLE

테이블을 삭제하는 문법입니다.

DROP TABLE users;


DML (Data Manipulation Language)


DML은 데이터베이스의 데이터를 조회, 삽입, 수정, 삭제하는 SQL 문법입니다.

INSERT

새로운 데이터를 삽입하는 문법입니다.

INSERT INTO users (name, email, age)
VALUES ('Alice', 'alice@example.com', 30);

UPDATE

기존 데이터를 수정하는 문법입니다.

UPDATE users SET age = 31 WHERE name = 'Alice';

DELETE

특정 데이터를 삭제하는 문법입니다.

DELETE FROM users WHERE name = 'Alice';

SELECT

데이터를 조회하는 문법입니다.

SELECT * FROM users;

JOIN (테이블 조인)

다른 테이블의 데이터를 결합할 때 사용합니다.

INNER JOIN

SELECT u.name, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

user_id가 일치하는 데이터만 출력됩니다.

LEFT JOIN

SELECT u.name, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

users의 모든 데이터가 출력되며, orders에 없는 경우 NULL이 반환됩니다.

서브쿼리 (Subquery)

서브쿼리는 하나의 SQL 문 안에서 또 다른 쿼리를 실행하는 방식입니다.

WHERE 절에서 사용

SELECT name
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE order_total > 100);

총 주문 금액이 100을 초과한 사용자만 조회합니다.

SELECT 절에서 사용

SELECT u.name, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_count
FROM users u;

각 사용자의 주문 횟수를 함께 출력합니다.

FROM 절에서 사용

SELECT sub.name, sub.order_count
FROM (
    SELECT u.name, COUNT(o.id) AS order_count
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    GROUP BY u.name
) AS sub
WHERE sub.order_count > 2;

사용자의 주문 횟수를 그룹화한 후, 2회 이상 주문한 사용자만 조회합니다.


DCL (Data Control Language)


DCL은 데이터베이스의 접근 권한을 관리하는 SQL 문법입니다.

GRANT

특정 사용자에게 권한을 부여하는 문법입니다.

GRANT SELECT, INSERT ON users TO user1;

REVOKE

기존에 부여된 권한을 회수하는 문법입니다.

REVOKE INSERT ON users FROM user1;


TCL (Transaction Control Language)


TCL은 데이터의 일관성과 무결성을 유지하기 위해 트랜잭션을 제어하는 SQL 문법입니다.

COMMIT

트랜잭션을 완료하고 변경 사항을 저장합니다.

BEGIN;
UPDATE users SET age = 35 WHERE name = 'Alice';
COMMIT;

ROLLBACK

트랜잭션을 취소하고 변경 사항을 되돌립니다.

BEGIN;
UPDATE users SET age = 30 WHERE name = 'Alice';
ROLLBACK;


FUNCTION (사용자 정의 함수)


사용자 정의 함수를 생성하여 특정 로직을 재사용할 수 있습니다.

기본적인 FUNCTION 예제

CREATE FUNCTION get_user_email(user_id INT) RETURNS VARCHAR AS $$
DECLARE email VARCHAR;
BEGIN
    SELECT u.email INTO email FROM users u WHERE u.id = user_id;
    RETURN email;
END;
$$ LANGUAGE plpgsql;

FUNCTION 사용 예시

SELECT get_user_email(1);

RETURNS 유형에 따른 반환 값

  • RETURNS INT: 정수를 반환
  • RETURNS VARCHAR: 문자열 반환
  • RETURNS TABLE(...): 테이블 형태의 데이터를 반환


TRIGGER (트리거)


트리거는 특정 이벤트가 발생할 때 자동으로 실행되는 프로시저입니다.

트리거 예제

사용자 삭제 시 로그 테이블에 기록하는 트리거 예제입니다.

CREATE TABLE user_logs (
    id SERIAL PRIMARY KEY,
    user_id INT,
    action VARCHAR(50),
    log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE FUNCTION log_user_deletion() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO user_logs (user_id, action) VALUES (OLD.id, 'DELETE');
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER delete_user_log
AFTER DELETE ON users
FOR EACH ROW EXECUTE FUNCTION log_user_deletion();

사용자가 삭제될 때 user_logs 테이블에 기록됩니다.

CREATE FUNCTION check_user_email() RETURNS TRIGGER AS $$
BEGIN
    IF NEW.email NOT LIKE '%@%' THEN
        RAISE EXCEPTION 'Invalid email format';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER validate_email
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION check_user_email();