SQL ) LV3. 대여 기록이 존재하는 자동차 리스트 구하기
접근법
- 두 테이블의 칼럼 정보가 필요하므로 JOIN 연산 수행
- 이때, MONTH함수로 대여시작일START_DATE에서 월을 추출했을 때, 10인 경우와
- 자동차 종류CAR_TYPE 값이 ‘세단’인 경우
- CAR_ID를 조회했다.
- 이때, 주의할 점은 CAR_ID가 중복된 것이 여러 개 나올 수 있으므로 DISTINCT 키워드를 붙여 중복을 제거했다.
코드
SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
WHERE MONTH(START_DATE) = 10 AND CAR_TYPE = '세단'
ORDER BY 1 DESC;
SQL ) LV3. 조건에 맞는 사용자와 총 거래금액 조회하기
접근법
- 우선 두 테이블을 각각 WRITER_ID와 USER_ID를 기준으로 JOIN했다.
- 이때, 거래 완료된 게시물만 필요하므로 WHERE절에서 STATUS가 DONE인 경우를 조건으로 추가했고,
- 이후, WRITER_ID를 기준으로 그룹화를 수행한 뒤, 총합계 SUM(PRICE)가 70만이 넘는 레코드만 조회되도록 했고,
- 이후, PRICE를 SUM함수로 집계하여 총 합계를 나타내는 TOTAL_SALES 칼럼을 만들었다.
- 참고) 여기서 HAVING절이 SELECT절보다 먼저 수행되는데, 별칭ALIAS를 사용할 수 있는 이유는 MySQL의 예외적인 모습이라고 한다
코드
SELECT USER_ID, NICKNAME, SUM(PRICE) TOTAL_SALES
FROM USED_GOODS_BOARD B JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
WHERE STATUS = 'DONE'
GROUP BY WRITER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY 3;
SQL ) LV3. 조건에 맞는 사용자 정보 조회하기
접근법
- 게시물테이블과 사용자테이블을 각각 WRITER_ID와 USER_ID를 기준으로 JOIN했다.
- 또한, 사용자별 작성된 게시물 개수를 구해야 하므로, USER_ID기준으로 그룹화 한 뒤, HAVING절에서 COUNT(*)값이 3이상인 레코드만 조회되도록 했다.
- 여기서, 문제에서 출력하는 값의 형태를 지정해줬기 때문에,
- 전체주소 칼럼은 흩어져있는 주소 정보를 CONCAT함수로 연결했고,
- 전화번호 카럼은 전화번호TLNO는 중간에 “-”로 연결해줘야 했기에 CONCAT과 SUBSTR함수를 통해 문자열을 자른뒤 -로 이어줬다.
코드
SELECT USER_ID, NICKNAME,
CONCAT(CITY, " ", STREET_ADDRESS1, " ", STREET_ADDRESS2) AS '전체주소',
CONCAT(SUBSTR(TLNO, 1, 3), "-", SUBSTR(TLNO, 4, 4), "-", SUBSTR(TLNO,8, 4)) AS '전화번호'
FROM USED_GOODS_BOARD B JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
GROUP BY 1 HAVING COUNT(*) >= 3
ORDER BY 1 DESC;
SQL ) LV3. 부서별 평균 연봉 조회하기
접근법
- 부서와 직원정보가 담긴 두 테이블을 JOIN한 뒤 부서ID기준으로 그룹화를 수행했다.
- 이후, 부서별 평균 판매량SAL을 구한 뒤 ROUND함수로 반올림한 칼럼 AVG_SAL을 추가했다.
코드
SELECT D.DEPT_ID, DEPT_NAME_EN, ROUND(AVG(SAL)) AVG_SAL
FROM HR_DEPARTMENT D JOIN HR_EMPLOYEES E ON D.DEPT_ID = E.DEPT_ID
GROUP BY D.DEPT_ID
ORDER BY 3 DESC;
'📕 SQL > MySQL' 카테고리의 다른 글
📕[SQL] 24.09.09 SQL (0) | 2024.09.09 |
---|---|
📕[SQL] 24.09.08 SQL (1) | 2024.09.08 |
📕[SQL] 24.09.05 SQL (1) | 2024.09.05 |
📕[SQL] 24.09.04 SQL (4) | 2024.09.04 |
📕[SQL] 24.09.01 SQL (0) | 2024.09.01 |