ANSI SQL
DBMS(Oracle, My-SQL, DB2 등등)들에서 각기 다른 SQL를 사용하므로, 미국 표준 협회(American National Standards Institute)에서 이를 표준화하여 표준 SQL문을 정립 시켜 놓은 것이다.
어디서나 통용될 수 있는 공통적인 기준 이라고 볼 수 있다. 대표적으로 JOIN 구문에서 확인할 수 있다.
ANSI SQL 특징
표준 SQL문이기 때문에 DBMS의 종류에 제약을 받지 않는다. (MySQL, Oracle..)
즉, 특정 벤더에 종속적이지 않아 다른 벤더의 DBMS로 교체하더라도 빠르게 다른 벤더사를 이동할 수 있다.
특정 DBMS의 이탈이 가속되는 것도 ANSI SQL의 영향이 크다고 할 수 있다.
테이블간의 Join 관계가 FROM 에서 명시되기 때문에 WHERE 문에서 조건만 확인하면 된다.
즉, 가독성이 일반 Query문보다 좋다.
단, 각각 DBMS 내부의 함수를 사용하는 경우 ANSI 문법만으로는 쿼리 작성이 불가능한 경우가 있다.
ANSI가 표준이지만, ANSI가 자주 쓰이지 않는 이유
기본적인 데이터 조회 구문(JOIN)은 ANSI SQL로 작성 가능하나, ANSI를 벗어나게 되는 경우는 DBMS에서 제공하는 함수를 사용할 때 이다.
대부분 테이블에 저장된 데이터를 그대로 보지 않고 가공(문자열 잘라내기, 숫자 계산, 포맷 지정, 데이터 암 복호화 등)해서 보는 경우가 많다. 이러한 경우 내장된 함수 또는 별도로 개발한 함수 등을 이용해서 데이터를 가공하여 보여준다.
자주 사용되는 것은 윈도우 함수(분석 함수)이며 ORACLE에서 제일 많이 제공하고 있다.
대표적인 윈도우 함수
RANK, SUM, ROWNUM, MAX, MIN
Query 문 비교
Sample Data
create table TB1
(
num int,
name varchar(10)
)
insert into Test1 values ( 1, '삼성');
insert into Test1 values ( 2, '엘지');
insert into Test1 values ( 3, '애플');
insert into Test1 values ( 4, '레노버');
create table TB2
(
num int,
name varchar(20)
)
insert into Test2 values ( 1, '갤럭시 플립');
insert into Test2 values ( 2, '그램');
insert into Test2 values ( 3, '맥북 프로');
LEFT OUTER JOIN
종류 | 쿼리 | 설명 |
Oracle | SELECT TB1.*, TB2.NAME FROM TB1, TB2 WHERE TB1.NUM = TB2.NUM(+) |
|
ANSI SQL | SELECT TB1.*, TB2.NAME FROM TB1 LEFT OUTER JOIN TB2 ON TB1.NUM = TB2.NUM |
OUTER를 생략하고 LEFT JOIN을 명시해도 적용 된다. |
RIGHT OUTER JOIN
종류 | 쿼리 | 설명 |
Oracle | SELECT TB1.*, TB2.NAME FROM TB1, TB2 WHERE TB1.NUM(+) = TB2.NUM |
|
ANSI SQL | SELECT TB1.*, TB2.NAME FROM TB1 RIGHT OUTER JOIN TB2 ON TB1.NUM = TB2.NUM |
OUTER를 생략하고 RIGHT JOIN을 명시해도 적용 된다. |
FULL OUTER JOIN
ANSI에서만 지원하며, LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것으로, 양쪽 모두 조건이 일치하지 않는 것까지 모두 결합해 출력한다.
종류 | 쿼리 |
Oracle | SELECT TB1.*, TB2.NAME FROM TB1, TB2 WHERE TB1.NUM = TB2.NUM(+) |
ANSI SQL | SELECT TB1.*, TB2.NAME FROM TB1 FULL OUTER JOIN TB2 ON TB1.NUM = TB2.NUM |
INNER JOIN
종류 | 쿼리 |
Oracle | SELECT TB1.*, TB2.NAME FROM TB1, TB2 WHERE TB1.NUM = TB2.NUM |
ANSI SQL | SELECT TB1.*, TB2.NAME FROM TB1 INNER JOIN TB2 ON TB1.NUM = TB2.NUM |
참고 :
'개발 > DB' 카테고리의 다른 글
[Oracle] dual 테이블 (0) | 2023.03.17 |
---|---|
[Java] Java의 동작 원리 - Garbage Collection (0) | 2023.03.16 |
[DB] mybatis ibatis 비교 및 Dynamic Query (0) | 2023.03.09 |
[DB] RDS(Relational Database Service) (0) | 2023.03.09 |
[DB] rdb(관계형 데이터 베이스) (0) | 2023.02.21 |