
두 테이블에서 SELECT 문을 사용하여 한 테이블에 데이터와 다른 한 테이블에 데이터를 비교하여 있거나 없는 데이터를 보고 싶을 때 두 테이블의 관계가 일대다 일경우, SELECT 문을 사용할 때 LEFT JOIN 혹은 RIGHT JOIN 으로 해결할 수 있다. 그러나 두 테이블의 관계가 다대다일 경우, JOIN 하여 SELECT 하기 쉽지 않을 것이다.
WHERE EXISTS

CREATE TABLE A_TABLE
(
A_ID CHAR(4) PRIMARY KEY,
A_NAME VARCHAR(30) NOT NULL
);
INSERT INTO A_TABLE VALUES ('A001', '홍길동');
INSERT INTO A_TABLE VALUES ('A002', '전우치');
-- COMMIT;
SELECT * FROM A_TABLE;

CREATE TABLE B_TABLE
(
B_ID CHAR(4) PRIMARY KEY,
B_NAME VARCHAR(30) NOT NULL
)
;
INSERT INTO B_TABLE VALUES (A001', '홍길동');
-- COMMIT;
SELECT * FROM B_TABLE;
예제 1

SELECT *
FROM A_TABLE T1
WHERE EXISTS
(
SELECT 1 FROM B_TABLE
WHERE B_ID = T1.A_ID
)
;
- SELECT 절에 컬럼은 불필요하기 때문에 의미없는 1을 적어준다.
- WHERE EXIST 는 인라인 뷰의 WHERE 절의 조건이 B_TABLE에 존재하는 A_TABLE의 데이터만을 보여준다.
- B_TABLE에 존재하는 A_ID의 데이터를 A_TABLE에서 보여준다.

SELECT T1.A_ID, T1.A_NAME
FROM A_TABLE T1, B_TABLE T2
WHERE T1.A_ID = T2.B_ID
;
- 두 쿼리가 같은 데이터를 보여준다.
예제 2

SELECT *
FROM A_TABLE T1
WHERE NOT EXISTS
(
SELECT 1 FROM B_TABLE
WHERE B_ID = T1.A_ID
)
;
- WHERE NOT EXISTS는 인라인 뷰의 WHERE 절의 조건이 B_TABLE에 존재하지 않는 A_TABLE의 데이터만을 보여준다.
- B_TABLE에서 존재하지 않는 A_ID의 데이터를 A_TABLE에서 보여준다.

SELECT T1.A_ID, T1.A_NAME
FROM A_TABLE T1, B_TABLE T2
WHERE T1.A_ID = T2.B_ID(+)
AND T2.B_ID IS NULL
;
- 두 쿼리가 같은 데이터를 보여준다.
'Database' 카테고리의 다른 글
[ SQL ] PROCEDURE(프로시져), PACKAGE(패키지) (0) | 2021.05.02 |
---|---|
[ SQL ] FUNCTION(함수) (0) | 2021.05.01 |
[ SQL ] EXCEPTION - 예외 처리 (0) | 2021.04.30 |
[ SQL ] VIEW - 메모리 상에 존재하는 테이블 (0) | 2021.04.30 |
[ SQL ] 시퀀스 (SEQUENCE) - 자동 증가 값 (0) | 2021.04.30 |