SQL

[SQL] ANSI SQL

허몽구 2024. 2. 28. 22:12

회사에서 쿼리를 짜다가 해당 쿼리를 ANSI SQL문으로 고치라는 피드백을 받았다.

ANSI SQL을 처음 듣다보니...ㅠㅠ 구글링하면서 찾아보다가 알게 된 개념을 정리해보려고 한다.

 

1. ANSI SQL이란?

ANSI SQL은 "American National Standards Institute Structured Query Language"의 약자로,

관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 조작하고 관리하기 위한 표준화된 쿼리 언어이다.

ANSI SQL은 SQL의 표준을 정의하는 미국 표준화 기구인 ANSI에 의해 관리된다.

이 표준을 준수하면 DBMS의 제약을 받지 않기 때문에, 여러 데이터베이스 시스템에서도 동일한 SQL문을 사용할 수 있다.

 

2. ANSI SQL 특징

1) 데이터 정의 언어(DDL) 

데이터베이스 구조를 정의하는데 사용된다. 예를 들어 테이블 CREATE, ALTER, DROP 등의 작업을 수행한다.

 

2) 데이터 조작 언어(DML)

데이터베이스에서 데이터를 SELECT, INSERT, UPDATE, DELETE 하는 데 사용된다.

 

3) 데이터 제어 언어(DCL)

데이터베이스에 대한 접근 권한을 관리하는 데 사용된다. 예를 들어 권한 GRANT, REVOKE 등의 작업을 수행한다.

 

4) 트랜잭션 제어(TCL)

데이터베이스의 트랜잭션을 관리하는 데 사용된다. 이는 트랜잭션의 시작, COMMIT, Rollback 등을 관리한다.

 

따라서, ANSI SQL 표준을 따르는 것은 데이터베이스 시스템 간의 호환성을 보장하고, SQL 사용을 표준화하는 데 도움이 된다.

 

3. ANSI SQL 장점

1) 표준화

표준 SQL 문법이기 때문에, 다양한 데이터베이스 시스템에서 호환 가능하며, 다른 DBMS로의 전환 또는 다중 DBMS 환경에서 작업 시 유용하다.

 

2) 이식성

SQL 쿼리와 문법이 일관되기 때문에, 코드를 변경하지 않고 다른 DBMS에서 작동 가능하다.

 

3) 직관성

JOIN과 WHERE절이 분리되어 더욱 직관적인 쿼리 분석이 가능하다.

 

실제로 회사에서도 여러 DBMS를 사용하기 때문에 표준화와 이식성의 장점을 높게 사 ANSI SQL문을 표준 개발로 잡고 있다!(고 들었다.)

 

4. ANSI SQL 단점

1) 호환성 문제

모든 데이터베이스 시스템이 완벽하게 ANSI SQL 표준을 준수하지 않기 때문에 한 시스템에서는 쿼리가 작동하지만, 다른 시스템에서는 작동하지 않을 수 있다.

 

2) 기능의 제한적 문제

DBMS 내부의 함수를 사용하는 경우, ANSI 문법만으로 쿼리 작성이 불가능한 경우가 있다.

 

5. ANSI SQL 사용 예시

-- ORACLE
SELECT U1.NAME,
       C1.NAME
FROM USER U1,
     COMPANY C1
WHERE U1.ID = C1.ID

-- ANSI SQL
SELECT a.NAME,
       b.NAME
FROM USER U1 JOIN COMPANY C1
      ON U1.ID = C1.ID

 

ORACLE로 작성한 쿼리는 한 줄이라 까다롭진 않지만, FROM절에 많은 테이블이 작성되면 JOIN 관계를 파악하기 까다롭다.

하지만 ANSI SQL문으로 작성하면 어떤 테이블끼리 JOIN 관계인지 직관적으로 파악이 가능하다.

 

-- ORACLE
SELECT U1.NAME,
       U1.AGE, 
       U1.SEX,
       C1.NAME,
       C1.AGE,
       C1.SEX
FROM USER U1,
     COMPANY C1
WHERE U1.ID = C1.ID (+)

-- ANSI SQL
SELECT U1.NAME,
       U1.AGE, 
       U1.SEX,
       C1.NAME,
       C1.AGE,
       C1.SEX
FROM USER U1
LEFT OUTER JOIN C1 ON U1.ID = C1.ID

 

(+) 로 연결되는 쿼리의 경우 LEFT OUTER JOIN을 사용하여 ANSI SQL문으로 작성할 수 있다.

 

-- ORACLE
SELECT U1.NAME,
       U1.AGE, 
       U1.SEX,
       C1.NAME,
       C1.AGE,
       C1.SEX
FROM USER U1,
     COMPANY C1
WHERE U1.ID = C1.ID

-- ANSI SQL
SELECT U1.NAME,
       U1.AGE, 
       U1.SEX,
       C1.NAME,
       C1.AGE,
       C1.SEX
FROM USER U1
INNER JOIN C1 ON U1.ID = C1.ID

 

오라클 쿼리에서는 WHERE 절에서 JOIN 조건을 표현하면 되지만, ANSI에서는 JOIN을 명시하여 더욱 직관적인 코드를 제공한다.

이 경우, INNER를 생략하고 JOIN만 작성하여도 INNER JOIN으로 인식되어 INNER JOIN을 실행한다.

 


 

내 작업은 기존 쿼리에서 테이블 추가와 컬럼 추가만 이뤄졌어서 단순하게 생각했는데, 직접 ANSI SQL문으로 바꿔보니 기존 쿼리보다 더욱 직관적으로 알아볼 수 있어서 좋은 시간이었던 것 같다!

 

앞으로는 ANSI SQL문으로 작성해서... 여기저기 써먹을 수 있는 코드로 작성해야겠다 ㅎㅎㅎ