궁금증 발동
무심코 쿼리문을 살펴보다가 아래와 같이 JOIN 키워드 없이 여러 개의 테이블에서 조회하는 것과
JOIN 키워드를 이용해 조회하는 것의 차이가 궁금해졌다.
*두개의 테이블 정보
SELECT * FROM DMS_ADMIN; -- 행(= 레코드 또는 튜플) : 39 개
SELECT * FROM PSM_ADMIN; -- 행(= 레코드 또는 튜플) : 58 개
JOIN 없이 조회 예)
SELECT D.ADMIN_ID AS D_ID, // 구분을 위해 D_ID, P_ID D_ROLE, P_ROLE 로 이름 바꿔주기
D.ADMIN_ROLE AS D_ROLE,
P.ADMIN_ID AS P_ID,
P.ADMIN_ROLE AS P_ROLE
FROM DMS_ADMIN D, PSM_ADMIN P
WHERE D.ADMIN_ID = P.ADMIN_ID;
JOIN을 사용한 조회)
SELECT D.ADMIN_ID AS D_ID, // 구분을 위해 D_ID, P_ID D_ROLE, P_ROLE 로 이름 바꿔주기
D.ADMIN_ROLE AS D_ROLE,
P.ADMIN_ID AS P_ID,
P.ADMIN_ROLE AS P_ROLE
FROM DMS_ADMIN D
JOIN PSM_ADMIN P
ON D.ADMIN_ID = P.ADMIN_ID;
JOIN을 사용하지 않고 실행
실행 쿼리
SELECT D.ADMIN_ID AS D_ID,
D.ADMIN_ROLE AS D_ROLE,
P.ADMIN_ID AS P_ID,
P.ADMIN_ROLE AS P_ROLE
FROM DMS_ADMIN D, PSM_ADMIN P
WHERE D.ADMIN_ID = P.ADMIN_ID;
실행 결과
FROM 절 뒤에서는 가장 먼저 나온 테이블이 기준 테이블이 된다.
첫 번째 테이블(DMS_ADMIN)이 기준 테이블이 되므로, 가장 좌측 상단 (0행 0열) 부터 표기되었고
두 번째 테이블(PSM_ADMIN)에서 조건에 맞는 데이터를 가져와 기준 테이블 오른쪽에 붙어서 표기된다.
세 번째 테이블이 있다고 하면 두 번째 테이블 뒤에 붙어서 나온다.
만약 FROM 절 뒤에 첫 번째 테이블(DMS_ADMIN)과 두 번째 테이블(PSM_ADMIN)의 순서를 바꿔서 실행하면
두 번째 테이블(PSM_ADMIN)이 기준 테이블이 되어 좌측 상단에 위치하고,
첫 번째 테이블(DMS_ADMIN)이 오른쪽에 붙게 된다.
일반적으로 아스타리스크 (*)를 사용한 조회에서만 적용되고, 특정 칼럼만 조회하는 경우에는 적용되지 않는다.
실행 쿼리
SELECT *
FROM PSM_ADMIN P, DMS_ADMIN D
WHERE D.ADMIN_ID = P.ADMIN_ID;
실행 결과 : FROM 바로 뒤에 적어준 테이블이 기준 테이블이 되어 좌측에 위치하게 된다.
JOIN 없이 테이블 명을 나열해 SELECT 한 경우
나열한 테이블을 모두 조회하고, 조건에 맞는 데이터들만 뽑아낸 다음 기준 테이블 오른쪽에 붙이는 동작이었다.
JOIN 을 사용해 실행
실행 쿼리 : D 테이블에 P 테이블 [ JOIN ]
SELECT D.ADMIN_ID AS D_ID,
D.ADMIN_ROLE AS D_ROLE,
P.ADMIN_ID AS P_ID,
P.ADMIN_ROLE AS P_ROLE
FROM DMS_ADMIN D
JOIN PSM_ADMIN P
ON D.ADMIN_ID = P.ADMIN_ID;
실행 결과 : 위에 JOIN 하지 않고 조회한 거랑 결과가 똑같다...??
Chat GPT 선생님께 도움 요청
당신이 제공한 쿼리는 `JOIN` 키워드를 사용하지 않고,
구식의 조인 표기법인 "Implicit Join"을 사용하여 두 테이블을 조인하고 있습니다.
`FROM` 절에서 테이블을 쉼표(,)로 구분하여 나열한 경우, 이는 "Implicit Join"을 의미합니다.
이러한 표기법에서는 `WHERE` 절에 조인 조건을 명시하여 테이블을 조인합니다.
즉, `DMS_ADMIN` 테이블과 `PSM_ADMIN` 테이블은 `D.ADMIN_ID = P.ADMIN_ID` 조건에 따라 조인됩니다.
이러한 표기법은 오래된 방식이며,
최근에는 `JOIN` 키워드를 사용하여 명시적으로 조인하는 것이 권장되고 있습니다.
따라서 쿼리를 명시적으로 작성하는 것이 더 가독성이 좋고, 유지보수에 용이합니다.
명시적인 `JOIN` 키워드를 사용하여 동일한 쿼리를 작성하면 다음과 같습니다:
```sql
SELECT D.ADMIN_ID AS D_ID,
D.ADMIN_ROLE AS D_ROLE,
P.ADMIN_ID AS P_ID,
P.ADMIN_ROLE AS P_ROLE
FROM DMS_ADMIN D
JOIN PSM_ADMIN P ON D.ADMIN_ID = P.ADMIN_ID;
```
위의 쿼리와 동일한 결과가 나옵니다.
이제 명시적인 `JOIN` 키워드를 사용하는 방식으로 쿼리를 작성하는 것을 권장드립니다.
정리
JOIN 키워드 없이 여러 개의 테이블을 명시하고 데이터를 조회하는 SQL 쿼리문의 정체는
바로 Implicit Join 이라는, JOIN 키워드가 없는 클래식한 고전(?) JOIN 쿼리문 이란다.
위에서 실험했던 2가지 쿼리문은 모두 조인된 결과였던 것이다..
Implicit JOIN : 고전적인 JOIN 방법으로, JOIN 키워드가 명시되어 있지 않다.
SELECT D.ADMIN_ID
D.ADMIN_ROLE
P.ADMIN_ID
P.ADMIN_ROLE
FROM DMS_ADMIN D, PSM_ADMIN P -- FROM 절 뒤에 콤마로 구분해 여러 테이블을 명시
WHERE D.ADMIN_ID = P.ADMIN_ID; -- WHERE 절 뒤에 조건을 명시
JOIN
SELECT D.ADMIN_ID,
D.ADMIN_ROLE,
P.ADMIN_ID,
P.ADMIN_ROLE
FROM DMS_ADMIN D
JOIN PSM_ADMIN P -- JOIN 키워드로 JOIN할 테이블 명시
ON D.ADMIN_ID = P.ADMIN_ID; -- ON 키워드 뒤에 조건을 명시
운영중인 기존 시스템에 Implicit JOIN으로 작성된 쿼리문이 굉장히 많다.
나 또한 편리하기도 하고, 무지해서 많이 사용해 왔던 것 같다.
가독성과 유지 보수 측면에서 용이하고,
명시적인 JOIN 키워드는 ANSI SQL 표준을 준수하는 방식으로 조인을 수행한다고 하니
앞으로는 JOIN 키워드를 사용하는 습관을 들여야 겠다.
'Database' 카테고리의 다른 글
[DBeaver] 5초 만에 Auto-Commit 해제 방법 (0) | 2023.08.03 |
---|---|
[Oracle] LEFT JOIN과 LEFT OUTER JOIN은 뭐가 다를까? (0) | 2023.08.02 |
[Oracle] JOIN과 INNER JOIN은 뭐가 다를까? (0) | 2023.08.02 |
[Oracle] Mybatis #{ } 와 ${ } 어떻게 쓸까? (0) | 2023.03.16 |
Mac에서 Oracle11g 사용하는 방법 (Docker + DBeaver) (0) | 2021.12.29 |
댓글