처음으로 SQL 프로그래머스 문제들을 풀어보기 시작했다.
정보처리기사 공부할 때 DML, DCL, DDL 공부를 하면서 잠시 쿼리문을 작성하는 것을 해보았지만 이렇게 직접 예시문제를 풀다보니 실력이 훨씬 더 빨리 느는것 같았다.
근데 이렇게 문제를 풀다가 보니 구글링하면서 배운 함수들이나 방식들은 엄청 다양해서 한 문제를 푸는 방법에도 다양한 방법이 있다는 사실을 알게 되었다. 그래서 이런 쉬운 문제를 풀때도 방식마다 장단점이 어떤게 있는지 리뷰해보려고 한다.
1. AND 나열과 YEAR()
SELECT COUNT(*) USERS
FROM USER_INFO
WHERE
AGE >= 20 AND AGE <= 29
AND YEAR(JOINED) = '2021';
처음에 내가 접근했던 방식이다. 처음에 20세 이상 29세 이하를 어떻게 표현해야하지 하다가 그냥 범위 AND문으로 묶었고, JOINED에 있는 DATE문에서 년도만 추출해 올 수 있는 방식이 뭘까 고민을 했다. 원래는 string으로 접근할까 하다가 구글에 추출하는 방식을 찾아보았고 YEAR() 메소드를 사용하면 가능하다길래 사용해 보았다.
2. BETWEEN 사용
SELECT COUNT(*) USERS
FROM USER_INFO
WHERE
AGE BETWEEN 20 AND 29
AND YEAR(JOINED) = '2021';
범위조건을 좀 더 간단하게 표현할 수 있는 BETWEEN이라는 문법을 사용해서 좀 더 직관적으로 범위를 표현하였다.
3. 불필요한 메소드 제거
SELECT COUNT(*) USERS
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29
AND JOINED BETWEEN '2021-01-01' AND '2021-12-31';
그래서 좀 더 효율적인 방법이 무엇이 있을까 생각하다가 YEAR 함수가 은근 많은 비용을 차지한다는 것을 알아내었다.
YEAR(JOINED)는 모든 행에서 JOINED 값을 변환해야 하므로, 인덱스를 사용할 수 없게 만든다. 그래서 JONIED의 범위를 직접 입력하면서 SELECT를 할 때, index를 이용하면서 좀 더 효율적으로 원하는 값에 잘 접근할 수 있도록 만들 수 있다.
물론 데이터값이 적거나 쿼리문을 작성할 때, 가독성있도록 작성하고 싶을때는 YEAR()을 사용하는 것이 좋지만 검색속도를 빠르게 활용하고 싶으면 저렇게 범위를 지정해놓고 다른 메소드를 사용하지 않는것이 좋다고 한다.
'DATABASE' 카테고리의 다른 글
[JPA] 영속성 관리(Entity Manager, Entity Factory, Persistence Context) (0) | 2025.02.16 |
---|---|
[SQL] JPA란 무엇인가? (2) | 2025.02.12 |