Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

구조적 쿼리 언어(SQL)란? 개념부터 활용, 장단점까지 완벽 정리

SQL(Structured Query Language, 구조적 쿼리 언어)은 관계형 데이터베이스를 관리하고 데이터에 대해 다양한 연산을 수행하기 위해 표준화된 특수 목적 프로그래밍 언어입니다. 데이터베이스 테이블과 인덱스 구조를 수정하거나, 데이터 행을 추가·갱신·삭제하고, 트랜잭션 처리 및 분석 애플리케이션을 위해 데이터베이스에서 필요한 정보의 부분집합을 조회하는 등 폭넓게 활용됩니다.

SQL에서 사용되는 select, insert, update, delete, create, alter, truncate 같은 명령어들은 일반적으로 SQL 문(statement)이라고 불립니다.

관계형 데이터베이스와 SQL

1970년대 후반과 1980년대 초반 관계형 데이터베이스가 등장한 이후 SQL은 관계형 데이터베이스의 표준 프로그래밍 언어로 자리 잡았습니다. 흔히 SQL 데이터베이스라고 불리는 관계형 시스템은 테이블들의 집합으로 구성되며, 각 테이블은 행(row)과 열(column) 형태로 데이터를 저장합니다. 열은 고객 이름이나 주소처럼 특정 데이터 범주에 해당하고, 각 행에는 해당 열과 교차하는 지점의 데이터 값이 담깁니다.

SQL은 또한 관계형 데이터베이스 관리 시스템(RDBMS)에 저장된 데이터를 프로그래밍하고 설계하는 데 사용되는 도메인 특화 언어이기도 합니다. 특히 서로 다른 개체(entity)나 변수 간에 관계가 존재하는 구조화된 데이터를 다루는 데 매우 유용합니다.

SQL의 구성 요소

SQL은 원래 관계 대수(relational algebra)와 튜플 관계 해석(tuple relational calculus)에 기반을 두고 있으며, 여러 유형의 문장들로 구성됩니다.

  • DQL(데이터 질의어): 데이터를 조회합니다.
  • DDL(데이터 정의어): 스키마를 생성하고 수정합니다.
  • DCL(데이터 제어어): 데이터 접근 권한을 제어합니다.
  • DML(데이터 조작어): 데이터를 삽입, 갱신, 삭제합니다.

SQL의 적용 범위는 데이터 질의, 데이터 조작, 데이터 정의, 데이터 접근 제어를 모두 포함합니다. 또한 SQL은 절차적 요소도 일부 포함하고 있기 때문에 선언형 언어(4세대 언어, 4GL)로 분류됩니다.

SQL의 주요 활용 분야

  • 1. 데이터 통합 스크립트 작성: 데이터베이스 관리자와 개발자가 데이터 통합 스크립트를 작성할 때 SQL이 핵심적으로 사용됩니다.
  • 2. 분석 쿼리 실행: 데이터 분석가들이 정기적으로 분석 쿼리를 설정하고 실행하는 데 활용됩니다.
  • 3. 정보 조회: 분석 애플리케이션과 트랜잭션 처리를 위해 데이터베이스 내 필요한 정보의 부분집합을 조회하는 용도로 널리 쓰입니다. 가장 많이 사용되는 SQL 요소로는 select, insert, update, add, delete, create, truncate, alter가 있습니다.
  • 4. 기타 중요한 활용: 인덱스 구조와 데이터베이스 테이블을 수정하고, 사용자가 데이터 행을 추가·갱신·삭제하는 데에도 사용됩니다.

SQL 표준과 벤더별 확장

공식 SQL 표준은 1986년 미국 국립표준협회(ANSI)가 채택했고, 이후 1987년 국제표준화기구(ISO)도 이를 채택했습니다. SQL은 데이터베이스 관리자뿐 아니라 데이터 통합 스크립트를 작성하는 개발자, 분석 쿼리를 구축·실행하는 데이터 분석가들에게도 꾸준히 사용되고 있습니다.

SQL을 기반으로 하는 상용 및 오픈소스 관계형 데이터베이스 관리 시스템은 조직에서 자유롭게 선택해 사용할 수 있습니다. 대표적인 제품으로는 Microsoft SQL Server, Oracle Database, IBM DB2, SAP HANA, SAP Adaptive Server, MySQL(현재 Oracle 소유), PostgreSQL 등이 있습니다.

다만 이러한 데이터베이스 제품 대부분은 표준 SQL에 절차적 프로그래밍 등을 위한 자체 확장 기능을 추가해 제공합니다. 예를 들어 Microsoft는 Transact-SQL(T-SQL)이라는 확장을 제공하고, Oracle은 PL/SQL이라는 확장 버전을 제공합니다. 그 결과 벤더마다 제공하는 SQL 변종들은 서로 완전히 호환되지 않습니다.

SQL 명령어와 문법

SQL 명령어는 크게 데이터 조작어(DML), 데이터 정의어(DDL), 트랜잭션 제어, 보안 관련 문장 등 여러 유형으로 나뉩니다.

  • DML: 데이터를 조회하고 조작하는 데 사용됩니다.
  • DDL: 데이터베이스 구조를 정의하고 수정하는 데 사용됩니다.
  • 트랜잭션 제어: 트랜잭션 처리를 관리하여 오류나 문제 발생 시 트랜잭션이 완료되거나 롤백되도록 보장합니다.
  • 보안 문장: 데이터베이스 접근을 제어하고 사용자 역할과 권한을 생성하는 데 사용됩니다.

SQL 언어는 다음과 같은 여러 언어 요소로 세분화됩니다.

  • 절(Clauses): 문장과 쿼리를 구성하는 요소입니다.
  • 식(Expressions): 스칼라 값 또는 열과 행으로 이루어진 테이블을 산출할 수 있습니다.
  • 술어(Predicates): SQL 3치 논리(참/거짓/알 수 없음) 또는 불리언 값(참/거짓)으로 평가될 수 있는 조건을 지정하며, 문장과 쿼리의 효과를 제한하거나 프로그램 흐름을 변경하는 데 사용됩니다.
  • 쿼리(Queries): 특정 기준에 따라 데이터를 조회합니다.
  • 문장(Statements): 스키마와 데이터에 영구적인 영향을 미치거나, 트랜잭션·프로그램 흐름·연결·세션·진단을 제어할 수 있습니다.
  • SQL 문장은 세미콜론(";") 문장 종결자를 포함합니다.
  • SQL 문장과 쿼리에서 의미 없는 공백(whitespace)은 일반적으로 무시되므로, 가독성을 높이기 위해 코드를 자유롭게 정렬할 수 있습니다.

상호 운용성과 표준화의 한계

SQL 구현체는 벤더마다 호환되지 않으며 모든 표준을 따르지도 않습니다. 특히 날짜·시간 문법, 문자열 연결 방식, NULL 처리, 비교 시 대소문자 구분 등은 벤더마다 차이가 있습니다. 따라서 SQL 코드는 수정 없이 서로 다른 데이터베이스 시스템 간에 이식되는 경우가 드뭅니다.

데이터베이스 시스템 간 이식성 문제가 발생하는 주요 원인은 다음과 같습니다.

  • SQL 표준의 복잡성과 방대한 크기 때문에 대부분의 구현자가 표준 전체를 지원하지 않습니다.
  • 표준이 인덱스, 파일 저장 방식 등 여러 중요한 영역에서 데이터베이스 동작을 규정하지 않아 구현체가 스스로 결정하게 됩니다.
  • SQL 표준은 준수해야 할 문법은 정확히 규정하지만, 언어 구조의 의미론에 대한 규정은 덜 명확하여 모호성이 존재합니다.
  • 많은 데이터베이스 벤더가 기존 고객 기반을 보유하고 있어, 새로운 SQL 표준이 기존 데이터베이스 동작과 충돌할 경우 하위 호환성을 깨뜨리기를 꺼립니다.
  • 사용자가 데이터베이스 공급업체를 쉽게 변경할 수 있도록 만들 유인이 상업적으로 크지 않습니다(벤더 락인 참조).
  • 데이터베이스 소프트웨어를 평가하는 사용자들은 표준 준수보다 성능 같은 다른 요소를 더 우선시하는 경향이 있습니다.

SQL의 장점

  • SQL 쿼리를 사용하면 데이터베이스에서 대량의 레코드를 빠르고 효율적으로 조회할 수 있습니다.
  • 데이터를 객체에 저장하지 않고도 데이터를 조회할 수 있습니다.
  • 두 개 이상의 테이블을 조인(join)하여 하나의 객체처럼 사용자에게 보여줄 수 있습니다.
  • SQL 데이터베이스는 ANSI와 ISO가 채택한 오랜 역사의 표준을 따릅니다. 반면 NoSQL 데이터베이스는 명확한 표준을 따르지 않습니다.
  • 표준 SQL을 사용하면 방대한 코드를 작성하지 않고도 데이터베이스 시스템을 손쉽게 관리할 수 있습니다.
  • 테이블에 대한 접근을 제한하여 아무나 행을 삽입하지 못하도록 할 수 있습니다.
  • 과거에는 SQL 데이터베이스가 곧 관계형 데이터베이스를 의미했지만, 객체지향 DBMS의 등장으로 객체 저장 기능이 관계형 데이터베이스로 확장되었습니다.

SQL의 단점

  • SQL 데이터베이스와의 연동은 몇 줄의 코드를 추가하는 것보다 복잡합니다.
  • 테이블이 삭제되면 해당 테이블에 의존하던 뷰(view)가 비활성화됩니다.
  • ANSI와 ISO 표준을 준수하더라도 일부 데이터베이스는 벤더 락인을 위해 표준 SQL에 자체 확장을 추가합니다.
  • SQL은 객체이므로 저장 공간을 차지합니다.