본문 바로가기

Database

[ SQL ] WHERE EXISTS, NOT EXIST

두 테이블에서 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
;
  • 두 쿼리가 같은 데이터를 보여준다.