[LeetCode Database] #183 Customers Who Never Order
leetcode.com/problems/customers-who-never-order/
Customers Who Never Order - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제 내용 :
주문 테이블, 고객 테이블을 참조해서 주문 이력이 없는 고객의 이력만 출력
정답인 쿼리와 오답인 쿼리간의 차이점에 대해 고민을 많이 했다.
< 오답 >
1
2
3
4
5
6
7
|
SELECT A.Name AS Customers
FROM (
SELECT DISTINCT B.CustomerId
FROM Orders B
) AA,
Customers A
WHERE A.Id not in AA.CustomerId
|
cs |
<정담>
1
2
3
4
5
6
7
|
SELECT A.Name AS Customers
FROM Customers A
WHERE A.Id not in (
SELECT DISTINCT B.CustomerId
FROM Orders B
)
ORDER BY A.Id
|
cs |
두 쿼리 모두 not in 문법을 사용한 쿼리이다.
그러나 첫번째 쿼리는 중복된 값들이 출력되고, 두 번째 쿼리는 정답만을 출력한다.
이렇게 쿼리를 잘못 작성하는 원인이 쿼리의 실행 순서를 모르기 때문이다.
쿼리는
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 이 순서로 실행된다.
위의 오답 쿼리에서 from 문에서 두 row의 데이터가 선택되었다. (문제의 sql 스키마 참조)
두개의 row를 각각 읽으면서 where절의 조건에 부합하는 데이터들은 선택하므로, 첫 row에서 선택된 CustomerId가 Not in 인 데이터 n개 + 두 번째 row에서 선택된 CustomerId가 Not in인 데이터 n개 이렇게 해서 필요보다 많은 개수의 데이터가 출력된 것이다.
정답 쿼리에서는 정확히 where절에서 서브쿼리를 사용했기 때문에 정확한 결과가 나왔다.
쿼리 짤 때 실행 순서 꼭 생각하면서 짜기