SQL
SQL (Structured Query Language)
1. 개요
SQL(Structured Query Language, 구조화 질의 언어)은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 조회하기 위해 설계된 표준 프로그래밍 언어이다.
SQL은 데이터베이스의 구조를 정의하고 데이터를 조작하는 표준화된 인터페이스를 제공하며, 이를 통해 사용자는 복잡한 물리적 저장 구조를 알지 못해도 논리적인 쿼리(Query, 질의)를 통해 원하는 데이터를 효율적으로 추출할 수 있다. ANSI(미국 국가 표준 협회)와 ISO(국제 표준화 기구)에서 표준을 정의하고 있으나, 실제 구현체인 각 DBMS(Database Management System)마다 고유의 확장 문법을 가지고 있다.
2. SQL의 기본 구조와 문법
SQL 쿼리는 기본적으로 선언적(Declarative) 언어의 특성을 가진다. 즉, '어떻게(How)' 데이터를 가져올 것인가보다 '무엇을(What)' 가져올 것인가에 집중하여 작성한다.
2.1 기본 쿼리 구조
가장 핵심이 되는 데이터 조회 문장은 다음과 같은 기본 구조를 가진다. - SELECT: 조회하고자 하는 컬럼(열)을 지정한다. - FROM: 데이터를 가져올 테이블을 지정한다. - WHERE: 특정 조건에 맞는 행(레코드)만 필터링한다. - GROUP BY: 특정 컬럼을 기준으로 데이터를 그룹화한다. - HAVING: 그룹화된 결과에 대해 필터링 조건을 적용한다. - ORDER BY: 결과 집합을 특정 컬럼 기준으로 정렬한다.
[SQL 문장의 논리적 실행 순서]
사용자는 SELECT부터 작성하지만, DBMS 내부에서는 다음과 같은 순서로 처리된다.
FROM $\rightarrow$ WHERE $\rightarrow$ GROUP BY $\rightarrow$ HAVING $\rightarrow$ SELECT $\rightarrow$ ORDER BY
2.2 주요 데이터 타입 및 연산자
| 구분 | 종류 | 설명 |
|---|---|---|
| 데이터 타입 | INT / INTEGER |
정수형 데이터 |
VARCHAR(n) / TEXT |
가변 길이 문자열 (n은 최대 길이) | |
DATE / DATETIME |
날짜 및 시간 정보 | |
DECIMAL(p,s) / FLOAT |
고정 소수점 및 부동 소수점 숫자 | |
| 비교 연산자 | =, <>, !=, <, >, <=, >= |
값의 일치 여부 및 크기 비교 |
| 논리 연산자 | AND, OR, NOT |
여러 조건을 결합하거나 부정함 |
| 특수 연산자 | BETWEEN, IN, LIKE, IS NULL |
범위, 집합, 패턴 매칭, NULL 값 확인 |
3. SQL 명령어 분류 (Sublanguages)
SQL은 사용 목적에 따라 크게 네 가지(또는 다섯 가지) 하위 언어로 분류된다.
| 분류 | 명칭 | 설명 | 주요 명령어 |
|---|---|---|---|
| DQL | 데이터 질의어 (Data Query Language) | 데이터베이스 내의 데이터를 조회 | SELECT |
| DDL | 데이터 정의어 (Data Definition Language) | 데이터베이스 구조(스키마)를 생성, 수정, 삭제 | CREATE, ALTER, DROP, TRUNCATE |
| DML | 데이터 조작어 (Data Manipulation Language) | 테이블 내의 데이터를 삽입, 수정, 삭제 | INSERT, UPDATE, DELETE |
| DCL | 데이터 제어어 (Data Control Language) | 데이터 접근 권한 부여 및 회수 | GRANT, REVOKE |
| TCL | 트랜잭션 제어어 (Transaction Control Language) | 트랜잭션의 논리적 단위 작업 제어 | COMMIT, ROLLBACK, SAVEPOINT |
4. 제약 조건 (Constraints)
제약 조건은 테이블에 저장될 데이터의 무결성(Integrity, 데이터의 정확성과 일관성)을 보장하기 위해 컬럼에 설정하는 규칙이다.
- NOT NULL: 해당 컬럼에
NULL(값이 없음)이 저장되는 것을 방지한다. - UNIQUE: 해당 컬럼에 중복된 값이 들어올 수 없도록 제한한다.
- PRIMARY KEY (기본키):
NOT NULL과UNIQUE의 특성을 동시에 가지며, 테이블 내의 각 행을 유일하게 식별하는 식별자로 사용된다. - FOREIGN KEY (외래키): 다른 테이블의 기본키를 참조하여 테이블 간의 관계를 정의하며, 참조 무결성을 유지한다.
- CHECK: 특정 조건(예:
age >= 0)을 만족하는 값만 입력되도록 제한한다. - DEFAULT: 값이 입력되지 않았을 때 기본적으로 들어갈 값을 지정한다.
5. 데이터 조작 및 고급 쿼리
5.1 JOIN (조인)
조인은 두 개 이상의 테이블을 특정 조건(주로 외래키)을 기준으로 결합하여 하나의 결과 집합으로 만드는 연산이다.
[JOIN 종류별 개념도] - INNER JOIN: $\text{Table A} \cap \text{Table B}$ (교집합: 양쪽 모두 매칭되는 데이터) - LEFT JOIN: $\text{Table A} \cup (\text{Table A} \cap \text{Table B})$ (A 전체 + B의 매칭 데이터) - RIGHT JOIN: $\text{Table B} \cup (\text{Table A} \cap \text{Table B})$ (B 전체 + A의 매칭 데이터) - FULL JOIN: $\text{Table A} \cup \text{Table B}$ (합집합: 양쪽 모든 데이터)
- INNER JOIN: 양쪽 테이블에 모두 매칭되는 데이터만 반환한다.
- LEFT (OUTER) JOIN: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 매칭되는 데이터를 반환하며, 매칭되지 않는 오른쪽 값은
NULL로 채운다. - RIGHT (OUTER) JOIN: 오른쪽 테이블 기준의 외부 조인이다.
- FULL (OUTER) JOIN: 양쪽 테이블의 모든 데이터를 반환하며, 매칭되지 않는 부분은 모두
NULL로 처리한다.
5.2 집계 함수 및 GROUP BY
데이터를 그룹화하여 통계치를 계산할 때 사용한다.
- 집계 함수: COUNT(), SUM(), AVG(), MAX(), MIN()
- GROUP BY: 특정 컬럼을 기준으로 행들을 그룹화한다.
- HAVING: 그룹화된 결과에 대해 필터링 조건을 적용한다. (WHERE는 그룹화 전, HAVING은 그룹화 후 적용)
5.3 서브쿼리 (Subquery)
쿼리 내부에 포함된 또 다른 쿼리를 의미하며, 메인 쿼리의 조건절이나 SELECT 절, FROM 절에서 활용된다.
5.4 코드 예제
-- 주문 테이블과 고객 테이블을 조인하여 고객별 총 주문 금액 계산
SELECT
c.customer_name,
SUM(o.order_amount) AS total_spent
FROM Customers c
JOIN Orders o
ON c.customer_id = o.customer_id
WHERE o.order_date >= '2023-01-01'
GROUP BY c.customer_name
HAVING SUM(o.order_amount) > 100000
ORDER BY total_spent DESC;
6. 윈도우 함수 (Window Function)
윈도우 함수는 행과 행 사이의 관계를 정의하여 계산을 수행하는 함수로, GROUP BY와 달리 결과 행의 수를 줄이지 않고 각 행에 계산 결과를 유지한다.
- 구문:
함수() OVER (PARTITION BY 컬럼 ORDER BY 컬럼) - 주요 함수:
- 순위 함수:
ROW_NUMBER()(고유 순위),RANK()(중복 순위 건너뜀),DENSE_RANK()(중복 순위 연속 부여) - 집계 함수:
SUM(),AVG()등을OVER절과 함께 사용하여 누적 합계나 이동 평균 계산 - 값 참조 함수:
LAG()(이전 행 값),LEAD()(다음 행 값)
- 순위 함수:
7. 트랜잭션 격리 수준 (Transaction Isolation Levels)
트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적 작업 단위이다. 여러 트랜잭션이 동시에 실행될 때 데이터 일관성을 유지하기 위해 격리 수준을 설정한다.
| 격리 수준 | 설명 | 발생 가능한 현상 |
|---|---|---|
| READ UNCOMMITTED | 커밋되지 않은 데이터도 읽을 수 있음 | Dirty Read |
| READ COMMITTED | 커밋된 데이터만 읽을 수 있음 (대부분의 DBMS 기본값) | Non-Repeatable Read |
| REPEATABLE READ | 트랜잭션 내에서 한 번 읽은 데이터는 반복해서 읽어도 동일함 | Phantom Read |
| SERIALIZABLE | 가장 엄격한 격리. 트랜잭션을 순차적으로 실행하는 효과 | 없음 (성능 저하 심함) |
- Dirty Read: 다른 트랜잭션이 수정 중인(커밋 전) 데이터를 읽는 현상.
- Non-Repeatable Read: 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 그 사이 다른 트랜잭션이 값을 수정하여 결과가 달라지는 현상.
- Phantom Read: 한 트랜잭션 내에서 범위 쿼리를 실행했을 때, 그 사이 다른 트랜잭션이 행을 삽입/삭제하여 결과 집합의 행 수가 달라지는 현상.
8. 데이터베이스 객체 및 최적화
8.1 주요 객체
- 인덱스 (Index): 데이터 검색 속도를 높이기 위해 생성하는 색인 구조이다. B-Tree 구조가 대표적이며, 조회 성능은 향상시키나 삽입/수정/삭제 성능은 저하시킨다.
- 뷰 (View): 하나 이상의 테이블로부터 유도된 가상 테이블이다. 복잡한 쿼리를 단순화하고 보안상 특정 컬럼만 노출할 때 사용한다.
- 저장 프로시저 (Stored Procedure): 일련의 SQL 쿼리를 하나의 함수처럼 저장하여 재사용하는 객체이다. 네트워크 트래픽을 줄이고 로직을 캡슐화할 수 있다.
- 트리거 (Trigger): 특정 테이블에 INSERT, UPDATE, DELETE 등의 이벤트가 발생했을 때 자동으로 실행되는 프로시저이다.
9. 주요 DBMS 및 SQL 변형 (Dialects)
9.1 주요 DBMS 목록
- MySQL / MariaDB: 오픈 소스 기반으로 웹 서비스에서 가장 널리 사용됨.
- PostgreSQL: 표준 준수율이 높고 고급 기능(JSON, 지리 정보 등)이 강력한 오픈 소스 DBMS.
- Oracle Database: 기업용 시장의 점유율이 높은 고성능 상용 DBMS.
- Microsoft SQL Server: Windows 환경과 통합이 뛰어난 MS사의 상용 DBMS.
- SQLite: 파일 기반의 경량 데이터베이스로 모바일 앱 및 임베디드 시스템에 주로 사용됨.
9.2 DBMS별 문법 차이
| 기능 | MySQL / MariaDB | PostgreSQL | Oracle | SQL Server (T-SQL) |
|---|---|---|---|---|
| 자동 증가 값 | AUTO_INCREMENT |
SERIAL |
SEQUENCE |
IDENTITY |
| 문자열 결합 | CONCAT() |
|| |
|| 또는 CONCAT() |
+ |
| 페이징 처리 | LIMIT offset, count |
LIMIT count OFFSET offset |
OFFSET...FETCH / ROWNUM |
OFFSET...FETCH / TOP |
| NULL 처리 | IFNULL() |
COALESCE() |
NVL() |
ISNULL() |
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.