exists

codakcodak·2024년 2월 20일
0

Mysql

목록 보기
3/11

Exists

  • exists 뒤에는 서브쿼리 구분이 따라온다.(다른 테이블의 행을 참조하는 correlated subquery가 될 수도 있다.)
  • 서브쿼리에서 적어도 하나의 행이 리턴되면, 메인쿼리의 조건문은 true을 반환하고, 서브쿼리에서 어떠한 행도 리턴하지 못하면 메인쿼리 조건문은 false를 리턴한다.(null이라는 행이 나와도 true로 반환한다.)
  • 실제 데이터를 select하는 것보단 특정 조건을 만족시키는 것이 존재하는지 자체를 확인하는 목적이 강해 select 1처럼 특정 상수를 select하는 것으로도 쓰인다.

Not exists

  • Exists와 반대되는 개념으로 적어도 하나의 행이 리턴되면 false,그렇지 않으면 true가 반환된다.

예시

reservation 테이블

조건

접근

  • ID가 3번인 예약이 유효환지 확인하려면 1~2번예약까지 확인해봐야한다.(=>subquery를 통해 매번 자신의 ID보다 작은 예약까지 확인)
  • 자신보다 작은 ID를 비교했을 때 겹치는 것이 존재하지 않는 것만 select(=>not exists(자신보다 작은 ID예약들을 비교하며 겹치는 것이 존재하는지 확인하는 subquery))
  • 정렬(order by)

해답

SELECT R1.ID, R1.START_TIME, R1.END_TIME
FROM RESERVATION R1
WHERE NOT EXISTS  --아래의 조건을 만족하는 예약이 존재하면 안된다!
(
    SELECT 1  --데이터자체보단 존재자체가 필요하기에 더미데이터인 1로 select
    FROM RESERVATION R2  --현재의 예약과 겹치는 것이 존재하는지 확인
    WHERE R2.START_TIME < R1.END_TIME -- R2의 예약이 R1의 예약보다 빨리 시작되면
      AND R2.END_TIME > R1.START_TIME -- R2의 예약이 R1의 예약보다 늦게 종료되면
      AND R2.ID < R1.ID
)
ORDER BY R1.START_TIME
profile
숲을 보는 코더

0개의 댓글