2018. 1. 25. 23:54ㆍDB
먼저 JOIN을 사용한 쿼리를 보기전에,
SQL ( Structured Query Language : 구조화 질의어 ) 의 종류에 대해서 알아보겠습니다.
* ANSI ( ANSI 표준 위원회 : 표준 SQL )
* PL ( Oracle : Procedural Language )
* T ( MicroSoft : Transact )
보통 처음 데이터베이스를 학습할 때 ANSI 기준으로 배웁니다. 저도 마찬가지구요
간단한 예제를 통해 세 가지의 SQL 을 확인해보겠습니다.
먼저 테이블 구조입니다.
T, PL
select * from test1, test2 where test1.number=test2.number; // 결과 : 3
ANSI
select * from test1 join test2 on test1.number = test2.number; // 결과 : 3
뭔가 달라짐을 느끼십니까?
제가 조사한 바로는 보통 프로젝트에서는 ANSI를 사용하며
그 이유로는,
1. 표준 SQL 이므로 다양한 DBMS에서 인식할 수 있습니다.
2. 테이블간 join 관계가 from 절에서 모두 기술되고 where 절에선 체크 조건만 나오므로 가독성이 좋습니다.
3. 다른 업체와 협업시 DB의 호환성 ( 쿼리 구문이 동일합니다 ) 때문입니다.
ANSI 형태의 sql 문으로 JOIN 쿼리를 살펴보겠습니다.
첫 번째로, INNER JOIN : 교집합
select test1.number from test1 join test2 on test1.number = test2.number;
- 결과 : 3
- test1 과 test2 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 test1.number 컬럼의 중첩 값만 출력한다.
두 번째로, LEFT JOIN : 왼쪽 기준
select test1.number from test1 left join test2 on test1.number = test2.number;
- 결과 : 3 2 1
- test1(왼) 과 test2(오) 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 왼쪽 테이블(test1)의 number 컬럼의 값을 출력한다.
세 번째로, RIGHT JOIN : 오른쪽 기준
① test1.number 컬럼을 출력하는 경우 select test1.number from test1 right join test2 on test1.number = test2.number; ② test2.number 컬럼을 출력하는 경우 select test2.number from test1 right join test2 on test1.number = test2.number;
- 결과1 : 3 null null
- 결과2 : 3 4 5
- left join 과 마찬가지로 중첩되는 값을 기준으로 오른쪽 테이블의 number 컬럼 값을 출력한다.
네 번째로, OUTER JOIN : 매칭되는 값이 없어도 출력
select test1.*, test2.number from test1 left outer join test2 on test1.number = test2.number;
- 결과 : 3 c 3 / 2 b null / 1 a null ( 3line )
- 조건에 부합하지 않는 test2.number (test1.number 가 1, 2 일때 해당 테이블의 값은 null 이지만 null로 출력되게끔 join됨 )
* OUTER JOIN 에도 LEFT, RIGHT, FULL 가 있는데 이는 INNER JOIN과 마찬가지로 왼쪽, 오른쪽 기준 매칭되는 값이 없어도 모두 출력함
'DB' 카테고리의 다른 글
xml : CDATA? 그게 뭔데? (0) | 2018.02.24 |
---|---|
oracle : ORA-00911 문자가 부적합합니다. (0) | 2018.02.13 |
mysql : 비어있는 자릿수 0으로 채우기 (0) | 2018.01.26 |
database : auto_increment 초기화 (mysql) (0) | 2018.01.02 |