프로그래머스 LV 2. 131115 가격이 제일 비싼 식품의 정보 출력하기 MySQL

https://school.programmers.co.kr/learn/courses/30/lessons/131115

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT 
ORDER BY PRICE DESC
LIMIT 1;

 

일단 이 문제의 분류가, SUM, MAX, MIN 에 있는데, 내가 알고있는 기억이 나는방법이 위처럼 가격 기준으로 내림차순으로 정렬해서 LIMIT 1을 통해서 가장 위에 있는 것만 보여주는 형태라 그렇게 작성했다. 

그 이후에 아마 MAX 라는걸 이용하면 해결이 가능한 경우일 것 같다는 생각이 들어서 이와 관련된 코드를 찾아보았다. 

 

SELECT *
FROM FOOD_PRODUCT 
WHERE PRICE = (SELECT MAX(PRICE)
              FROM FOOD_PRODUCT)

 위와 같이 작성해서 해결할 수 있었고, 이런 형태를 서브쿼리 라고 한다. 

그리고 SELECT * 라고 쓴 것은 전부 가져오겠다는 의미이다. 이 문제에서 요구하는 형태가 전부를 나타내므로 이렇게 사용할 수 있다. 맨 위에 내가 작성한 쿼리문도 SELECT * 형태로 수정해서 정상적으로 동작할 수 있다. 

 

성능면에서 어느것이 더 우위에 있을지에 대한 궁금증이 있어서 GPT에 검색해보았다. 

두 쿼리문 간의 성능 차이는 데이터베이스 엔진에 따라 다를 수 있습니다. 그러나 일반적으로는 첫 번째 쿼리문이 더 효율적일 가능성이 높습니다. 이는 몇 가지 이유로 인해 발생할 수 있습니다:

1. **인덱스 활용:** 첫 번째 쿼리문은 특정 열인 `PRICE`에 대해 정렬된 결과를 가져오고 있습니다. 만약 `PRICE` 열에 인덱스가 있다면, 데이터베이스 엔진은 이 인덱스를 사용하여 더 효율적으로 정렬된 결과를 생성할 수 있습니다. 반면 두 번째 쿼리문은 서브쿼리와 비교 연산을 수행하므로 인덱스를 활용하기 어려울 수 있습니다.

2. **데이터 양:** 두 번째 쿼리문은 서브쿼리를 사용하여 최대값을 계산하고, 이 값을 기반으로 원본 테이블을 필터링합니다. 이는 두 번의 쿼리 실행을 필요로 하며, 데이터 양이 많을수록 성능에 부담을 줄 수 있습니다.

3. **가독성 및 유지보수성:** 첫 번째 쿼리문은 명시적으로 필요한 열을 선택하고 있어 가독성이 좋습니다. 또한, 필요한 열만을 선택하므로 불필요한 데이터를 가져오지 않습니다. 이는 쿼리문의 유지보수성을 높일 수 있습니다.

따라서 대부분의 경우에는 첫 번째 쿼리문이 더 효율적이고 성능이 좋을 것입니다. 그러나 최적의 성능을 얻기 위해서는 실제 데이터베이스 엔진의 실행 계획을 확인해보고, 필요에 따라 인덱스를 적절하게 설정하는 것이 중요합니다.

결론적으로, 첫 번째 쿼리문이 가독성이 좋고 성능이 우수하므로 바람직한 선택으로 여겨집니다.

위와 가은 답을 기반으로, 두가지의 방향으로 모두 작성할 수 있도록 이해는 하고 있으면서, 이러한 형태가 필요하면 내가 작성했던 것처럼 쿼리문을 작성하도록 하자. 

그래도 MAX의 활용에 대해서 잘 이해하자. 서브쿼리도. 

 

 

  Comments,     Trackbacks