서브쿼리 vs. 전체 테이블, 연산 부하
distinct의 효과
*를 사용하는 것 vs. 컬럼명을 쓰는 것
3회차, 5회차 문제에 대한 풀이 진행
풀이 및 오답노트는 해당 게시글에 수정을 통해 추가하였음
(3일차 / 5일차)
SQL 문제를 풀 때는 가장 먼저 테이블과 그 데이터를 확인하고 시작해야 한다
SELECT *에 LIMIT라도 쓰든가
날짜 데이터 포맷도 보고 etc
그래서 어떤 테이블에 어떤 데이터가 담겨 있는지 확인을 하고 나야 문제를 풀 수 있다
기본적으로 서브쿼리는 만들면 만들수록 연산이 늘어나서 효율이 감소하게 된다
그런데 주니어 단계에서는 굳이 그걸 고려할 필요는 없다
대신 쿼리 작성이 숙달 될수록 서브쿼리가 불필요하다면 이를 줄여나간다면 좋을 것
내가 distinct에 대해 착각하고 있던 것이 있는데,
나는 distinct가 뒤의 컬럼 1개에 대해서만 적용되는 줄 알았었다
하지만 distinct는
1) 사용하는 순간 모든 컬럼에 영향을 주며
2) 가장 먼저 작성해야 하기에 컬럼명을 적은 후에 distinct를 적을 수 없다
즉 아래처럼 적더라도 distinct는 game_account_id, pay_amount, approved_at 컬럼 모두에 영향을 미치는 것이다.
SELECT
distinct game_account_id
, pay_amount
, approved_at
FROM basic.PAYMENT
WHERE pay_type = 'card'
;
그렇게 되면 distinct는 중복값을 제거하는 데,
이 제거하는 기준은 컬럼 전체이므로
game_account_id, pay_amount, approved_at의 값이 모두 일치해야 1개로 간주하는 것이다
만약 game_account_id는 같지만 pay_amount, approved_at가 다르다면 이는 distinct로 중복값 제거가 되지 않는 것!
쿼리문 안에 *를 쓸 떄와 정확한 컬럼명을 쓸 때
기본적으로 테이블 구성을 보기 위해서는 *을 쓰면 좋고, 테이블이 너무 크면 LIMIT을 걸어주면 좋다
다만 SELECT *은 연산을 많이 먹으므로, 찾고자 하는 값이 명확하다면 SELECT 컬럼명을 하는 게 좋다