본문 바로가기
코딩테스트

SQL 2

by 임지혁코딩 2024. 3. 30.

MYSQL 에서 TOP 대신 사용 하는 방법

 

TOP 함수를 생각했지만, 해당 함수는 SQL SERVER에서의 기능이었다.

ORDER BY로 원하는 기준에 따라 정렬하고, LIMIT를 통해 그 중 몇개를 얻어낼 것인지 정한다. 

 

재귀 쿼리

 

 

없는 데이터를 0으로 변경해야 하는 문제 .

 

with recursive time as (select ㅁ uninall select ㅁ조건에 맞는 추가내용 

where절에, 재귀의 조건을 정한다. )

 

이후 left outer join을 통해, 해당 테이블과 합친다.

 

 

 

조건

1. 넣고자 하는값, 그리고 1로 시작하는 값을 명명하여 넣는다(WHERE 또한 최초 시작 조건을)

2. UNION ALL

3. 해당 RECRUSIVE TABLE에서, 그 명명한 값 +1 을 재명명한다.

 

결과 : 하나씩 성장하여가는 값이 완성된다. 

1,2,3,4,5,6,,7,8

논리적인 동작 순서에도 불구하고, SELECT 절의 별칭을 다른 곳에서 쓸 수 있다.



SELECT C.CAR_ID, C.CAR_TYPE, ROUND(C.DAILY_FEE * 30 * ((100-P.DISCOUNT_RATE)/100),0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C LEFT OUTER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H 
ON C.CAR_ID = H.CAR_ID LEFT OUTER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE ('2022-11-01 00:00:00' BETWEEN START_DATE AND END_DATE)
OR ('2022-11-30 00:00:00' BETWEEN START_DATE AND END_DATE))
AND C.CAR_TYPE IN('세단', 'SUV')
AND P.DURATION_TYPE = '30일 이상'
GROUP BY C.CAR_ID, C.CAR_TYPE
HAVING FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC

 

논리적인 동작순서가 SELECT가 HAVING보다 낮지만, MYSQL은 특별히 SELECT를 먼저 스캔하고

논리적 동작을 따르기 때문에 HAVING절에서 AS는 쓸 수 있다. 

 

CASE, WHEN, THEN, END 

 

살짝 틀려버린점은, END를 까먹었단 점이다. 이런 실수는 주의하자. 

 

++CASE 내부에서 집계함수를 쓸 수 없다. 그러므로 

'코딩테스트' 카테고리의 다른 글

SQL 3  (0) 2024.04.16
고난이도 구현 문제  (0) 2024.04.14
HASH  (0) 2024.03.17
SQL  (0) 2024.03.13
프로그래머스로 풀이 사이트 변경  (0) 2024.03.13