대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(*) > 0
ORDER BY MONTH(START_DATE) ASC, CAR_ID DESC;
조건 1. 총 대여 횟수 COUNT(*) AS RECORDS 로 나타낸다.
조건 2. 2022년 8~10월까지 총 대여 횟수가 5 이상인 자동차 ,해당 기간 동안의 월별 자동차 ID별 총 대여횟수 리스트를 출력 = 서브쿼리를 생성한다. 다중 행으로 출력되기 때문에 다중 행 연산자인 IN을 사용한다.
조건 3. ~별 이라는 키워드가 나오면 무조건 GROUP BY를 사용해준다.
조건 4. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외한다. 특정 월의 대여 횟수를 출력하기 위해서 조건식을 생성한다.
하나의 SQL문에 포함되어 있는 또 다른 SQL문
SELECT, FROM, WHERE절에 사용된다.
1) SELECT절 서브쿼리 = 스칼라 서브쿼리
한 행, 한 컬럼만 반환하는 서브쿼리이다.
SELECT * , (SELECT , FROM, WHERE)
데이터의 양이 많을수록 실행속도가 느려지기 때문에 거의 사용되지 않는다.
2) FROM절 서브쿼리 = 인라인 뷰
하나의 동적으로 생성된 테이블처럼 사용된다.
열 이름과 테이블명을 꼭 명시해줘야 한다. SQL문이 실행될 때만 임시적으로 생성된다.
단일 행 서브 쿼리
단일 행 비교 연산자 : =, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 한다. 2건 이상이 된다면 오류가 발생한다.
다중 행 서브쿼리
서브쿼리 결과가 2건 이상 반환되면 다중 행 비교 연산자와 함께 사용된다.
IN : 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건
ALL : 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건
ANY : 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건
EXISTS : 서브쿼리의 결과를 만족하는 값이 존재하는지 여부 확인
다중 칼럼 서브쿼리
서브쿼리 결과로 여러 개의 컬럼이 변환되어 메인쿼리의 조건과 동시에 비교된다.
연관 서브쿼리
서브쿼리 내에 메인쿼리 컬럼이 사용된 서브쿼리이다.
SELECT A.AA, A.BB, A.CC
FROM ABC AS A
WHERE (A.AA, A.BB) IN (SELECT B.CC, B.BB
FROM DEF AS B
WHERE B.BB = A.BB)
메인 쿼리의 컬럼을 서브쿼리에 사용한다.
SELECT T1.C1, T2.C1, T2.C2
FROM T1 AS T1, T2 AS T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1 T2.C2
HAVING AVG(T1.C1) < (SELECT AVG(C1)
FROM T2);