EXISTS가 존재한다. 이에 대해 IN과 함께 비교하면서 알아보자 말 그대로 서브쿼리에서 반환하는 값이 존재하는지에 대한 여부를 판단해주는 역할을 한다.
true/false를 반환주로 EXISTS를 사용하는 것이 성능이 좋다.
종종 SELECT 1을 해주는데, 이유는 무슨 값을 넣어주던 상관 없기에 형식 상 1을 넣어준다
[ EXISTS ]
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
[ IN ]
SELECT *
FROM customers
WHERE id IN (
SELECT customer_id
FROM orders
);
먼저 모두 수행하고 나서 리스트로 만들고, 이후 외부 쿼리의 각 행이 포함되는지 비교한다.SELECT customer_id FROM orders 에서 예를 들어 {1, 2, 5, 7}이 나왔다면customers.id IN {1, 3, 4, 5, ...} 에서 고객들이 포함됐는지, 안됐는지 비교해서 반환을 해준다.존재 여부 만 보기 때문에 보다 효율적이라고 한다.| id | name | score |
|---|---|---|
| 1 | abc | 100 |
| 2 | def | null |
| 3 | ghi | null |
SELECT * FROM students WHERE score IN (100, null)UNKNOWN 으로 보아서 값 반환이 없는 것으로 보인다.