learn

SQL 표준과 플랫폼 방언 (Dialect)

SQL 표준과 플랫폼 방언 (Dialect)

SQL에는 ANSI SQL이라는 국제 표준이 있다. 기본적인 CRUD, 조인, 집계 등은 어떤 관계형 DB에서든 거의 동일하게 동작한다.

-- 어디서든 동일하게 동작하는 표준 SQL
SELECT * FROM users WHERE age > 20;
CREATE TABLE users (id INT, name VARCHAR(100));

플랫폼마다 다른 것들

표준을 벗어나는 영역에서 **방언(dialect)**이 생긴다.

자동 증가 ID

  • MySQL: AUTO_INCREMENT
  • PostgreSQL: SERIAL 또는 GENERATED ALWAYS AS IDENTITY
  • Oracle: 별도 SEQUENCE 생성

문자열 함수

  • MySQL/SQL Server: SUBSTRING(str, 1, 3)
  • Oracle: SUBSTR(str, 1, 3)

페이징

  • MySQL/PostgreSQL: LIMIT 10 OFFSET 20
  • Oracle (구버전): WHERE ROWNUM <= 10
  • SQL Server: FETCH FIRST 10 ROWS ONLY

고급 기능(JSON 처리, 윈도우 함수 세부 문법, 쿼리 힌트 등)으로 갈수록 플랫폼 간 차이가 커진다.

ORM과의 관계

what-is-orm|ORM이 "DB가 바뀌어도 코드를 거의 안 고쳐도 된다"는 장점을 제공하는 이유가 여기 있다. ORM은 내부적으로 각 플랫폼의 dialect를 알고, 메서드 호출을 해당 DB에 맞는 SQL로 번역해준다. Raw SQL을 직접 쓰면 DB를 교체할 때 방언 차이가 있는 쿼리들을 직접 수정해야 한다.