2021-03-02
- 정의
미국 국가표준 협회(American National Standards Institute, ANSI)는 미국에서 제품, 서비스, 과정, 시스템, 인력관리 분야에서 표준을 개발하는 것을 감독하는 비영리 민간 기구로서, 미국을 대표하여 국제 표준화 기구(ISO)에 가입하였다.[1] 이 협회는 미국의 제품이 전세계에서 사용될 수 있도록 미국의 표준을 국제표준에 맞추는 활동도 한다. 이 협회는 다른 표준화 기구나 정부 기관, 소비자 단체, 회사 등이 개발한 표준을 승인하기도 한다. 그럼으로써 용어를 통일하고, 제품의 특성, 성능, 테스트 방법 등에서 일관성을 유지한다. 이 협회는 제품이나 인력의 인증 기구가 국제표준에서 정의된 기준에 부합하는지에 대해 승인하기도 한다. 이 협회가 제정한 표준을 "ANSI"라고 부르기도 하는데, 미국 내 표준이지만, 국제 표준화 기구의 ISO 표준보다 먼저 제정되는 경우도 많으며, ANSI 표준이 ISO 표준이 되기도 한다.
(출처 : 위키백과)
위의 설명은 다소 길지만 줄여서 표현하면, " 어디서나 통용될 수 있는 공통적인 기준 " 이라고 볼 수 있다. 이러한 ANSI는 SQL에서도 찾아볼 수 있으며, 대표적으로 JOIN 구문에서 확인할 수 있다.
( 가장 대표적인 ANSI 표쥰은 ASCII 코드가 있다.)
- 예제
SEE_INFO 테이블 PK -> SEENUM / FK -> GRADE
SEE_GRADE 테이블 PK_GRADE
- INNER JOIN
기존의 오라클에서는 단순히 WHERE 절에서 조인조건을 표현하면 되지만, ANSI에서는 이를 조금 더 명시적으로 표현한다. 우선 기존의 이너조인으로 SEE_INFO 테이블의 NAME / GRADE 와 SEE_GRADE 의 GNAME을 동시 출력하는 코드를 보자.
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_INFO I, SEE_GRADE G
WHERE I.GRADE = G.GRADE;
위와 같이 WHERE 절에서 외래키와 이 외래키가 참조하는 기본키를 = 로 표현해주면 간단히 두테이블의 정보를 동시에 볼 수 가 있다. 이제 ANSI 구문을 살펴보자.
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_INFO I
INNER JOIN SEE_GRADE G
ON I.GRADE = G.GRADE;
ANSI 구문에서 FROM 절에 하나의 테이블과 조인하는 테이블을 나누어서 표현한다. 이후 WHERE 절의 조인 조건은 ON이라는 키워드로 변경하여, 조인을 진행하게 된다. 두 쿼리문 모두 동일한 결과를 가져온다.
- OUTER JOIN
우선 아우터 조인을 하기전에 SEE_INFO 에 GRADE가 NULL 값인 데이터를 추가적으로 넣어 주었다.
코드는 이전에 이너조인 코드를 그대로 사용하여 아우터 조인을 시도 하였다.
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_INFO I, SEE_GRADE G
WHERE I.GRADE = G.GRADE (+);
그러면 위와 같이 (+) 를 붙여준 쪽 테이블에 조인결과가 없는 데이터를 NULL 값으로 표현한 후 합쳐 보여준다. 이제 ANSI 구문으로 변경해서 살펴보자.
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_INFO I
LEFT OUTER JOIN SEE_GRADE G
ON I.GRADE = G.GRADE;
----------------------------------------------------
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_GRADE G
RIGHT OUTER JOIN SEE_INFO I
ON I.GRADE = G.GRADE;
ANSI 아우터조인에는 방향이 붙는다. 왼쪽과 오른쪽을 정할 수 있으며, LEFT 의 경우 OUTER JOIN 뒤의 테이블에 (+) 가 붙는다고 생각하고 RIGHT의 경우 FROM 에 명시된 테이블에 (+)가 붙는다고 생각하면, 조금 이해가 쉬울 것이다.
때문에 위의 두 OUTER JOIN 코드는 같은 결과가 출력된다.
- FULL OUTER JOIN
LEFT 와 RIGHT를 모두 포함하는 FULL OUTER JOIN도 존재하며, 이는 말그대로 양쪽 테이블 모두 NULL값에 상관없이 조인시켜 모든 컬럼을 보여준다.
SELECT I.NAME, I.GRADE, G.GNAME
FROM SEE_GRADE G
FULL OUTER JOIN SEE_INFO I
ON I.GRADE = G.GRADE;
메인 이미지 출처: Photo by Diane Serik on Unsplash