SQL

기술노트
Admin (토론 | 기여)님의 2025년 9월 11일 (목) 16:50 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

SQL (Structured Query Language)

SQL(Structured Query Language)은 관계형 데이터베이스 관리 시스템(RDBMS)에 저장된 데이터를 관리하고 조작하기 위해 설계된 도메인 특화 언어입니다. SQL은 무엇(What)을 원하는지만 명시하는 선언적 언어(Declarative Language)로, 어떻게 데이터를 가져올지는 RDBMS의 옵티마이저가 결정합니다.


⌨️ SQL의 주요 명령어 종류

  • DDL (Data Definition Language, 데이터 정의어) : 테이블이나 데이터베이스의 구조를 정의합니다.

> * `CREATE`: 데이터베이스, 테이블 등을 생성합니다. > * `ALTER`: 테이블의 구조를 변경합니다. > * `DROP`: 데이터베이스, 테이블 등을 삭제합니다. > * `TRUNCATE`: 테이블의 모든 데이터를 빠르게 삭제합니다. (로그를 남기지 않아 `DELETE`보다 빠름)

  • DML (Data Manipulation Language, 데이터 조작어) : 데이터를 추가, 수정, 삭제, 조회(CRUD)합니다.

> * `SELECT`: 데이터를 조회합니다. > * `INSERT`: 데이터를 삽입합니다. > * `UPDATE`: 데이터를 수정합니다. > * `DELETE`: 데이터를 삭제합니다.

  • DCL (Data Control Language, 데이터 제어어) : 데이터에 대한 접근 권한을 제어합니다.

> * `GRANT`: 사용자에게 특정 권한을 부여합니다. > * `REVOKE`: 사용자로부터 특정 권한을 회수합니다.

  • TCL (Transaction Control Language, 트랜잭션 제어어) : 논리적인 작업 단위인 트랜잭션을 제어합니다.

> * `COMMIT`: 트랜잭션의 모든 작업을 영구적으로 저장합니다. > * `ROLLBACK`: 트랜잭션의 모든 작업을 취소하고 이전 상태로 되돌립니다. > * `SAVEPOINT`: 트랜잭션 내에 임시 저장점을 만들어 특정 지점까지만 롤백할 수 있도록 합니다.


🔗 JOIN: 테이블 연결의 핵심

JOIN은 두 개 이상의 테이블에 나뉘어 저장된 데이터를, 공통된 컬럼(보통 기본키-외래키 관계)을 기준으로 연결하여 하나의 결과 집합으로 조회하는 핵심적인 연산입니다.

  • INNER JOIN : 두 테이블에 모두 일치하는 행만 반환합니다. (가장 일반적인 조인)
  • LEFT (OUTER) JOIN : 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블은 일치하는 행만 반환합니다. (일치하는 행이 없으면 `NULL`로 표시)
  • RIGHT (OUTER) JOIN : 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블은 일치하는 행만 반환합니다.
  • FULL (OUTER) JOIN : 양쪽 테이블의 모든 행을 반환합니다. 일치하지 않는 부분은 `NULL`로 표시합니다.
  • SELF JOIN : 하나의 테이블을 자기 자신과 조인합니다. (예: 직원의 관리자 정보를 찾을 때)

💡 개발자 핵심 Point

  • SQL Injection : 사용자의 입력을 제대로 검증하지 않고 SQL 쿼리의 일부로 만들 때 발생하는 보안 취약점입니다. 공격자가 악의적인 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작할 수 있습니다. 이를 방지하기 위해 Prepared Statement (매개변수화된 쿼리)를 사용해야 합니다.
  • N+1 문제 : ORM(Object-Relational Mapping) 사용 시 자주 발생하는 성능 문제입니다. 하나의 쿼리로 N개의 결과를 가져온 후, 각 결과에 대해 관련된 데이터를 얻기 위해 N번의 추가 쿼리가 발생하는 현상입니다. `JOIN FETCH`나 `Batch Size` 조정을 통해 해결할 수 있습니다.
  • 인덱스(Index)와 실행 계획(Execution Plan) : 복잡한 쿼리의 성능을 최적화하기 위해서는 `JOIN` 순서, `WHERE` 절의 조건 등을 고려하여 인덱스를 효과적으로 설계하고, 실행 계획을 분석하여 쿼리가 인덱스를 잘 활용하는지 확인하는 능력이 중요합니다.
  • SQL vs NoSQL : SQL은 정형화된 데이터를 다루는 관계형 데이터베이스(RDBMS)를 위한 언어입니다. 반면, NoSQL 데이터베이스는 비정형 데이터를 다루며, 각 시스템마다 고유한 쿼리 방식을 사용합니다. (e.g., MongoDB의 Document Query)