[출제 빈도 : 높음, 평균 점수 : 낮음, 문제세트 : 11]
난이도 쉬운 순서, 풀이한 사람이 많은 순서로 풀이하겠다.
[Level 2]
-- 1
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P, OFFLINE_SALE AS O
WHERE P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE
-- 2
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P
JOIN (SELECT PRODUCT_ID, SALES_AMOUNT
FROM OFFLINE_SALE
) AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE
-- 3
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P
JOIN OFFLINE_SALE AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE
--4
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P, OFFLINE_SALE AS O
WHERE P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY O.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE
이 문제는 풀 수 있는 방법이 굉장히 많다.
join기준 테이블을 더 간단한 PRODUCT 테이블로 지정하는 게 나을 것 같다.
[Level 2]
SELECT B.BOOK_ID, A.AUTHOR_NAME, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') as PUBLISHED_DATED
FROM BOOK AS B, AUTHOR AS A
WHERE B.AUTHOR_ID = A.AUTHOR_ID
AND B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE
❗ 주의사항을 조심하자. 출력예시와 같은 데이트포맷이 나와야 함.
DATE_FORMAT(컬럼명, 형식)
데이트와 포맷 사이에 언더바 있음. ㅋ.
[Level 3]
-- 1
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID AND O.DATETIME < I.DATETIME
ORDER BY I.DATETIME
-- 2
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS AS I
JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME < I.DATETIME
ORDER BY I.DATETIME
[Level 3]
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
LEFT JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3
LEFT JOIN을 걸어 ANIMAL_INS 테이블에는 있지만, ANIMAL_OUTS 테이블에는 없는 값을 찾는다.
(만약 그냥 JOIN 즉, INNTER JOIN을 건다면 공통된 값만 찾으므로 원하는 값을 찾을 수 없다.)
이후 보호시작일(I.DATETIME) 순으로 정렬하고, LIMIT 3
을 통해 정렬된 데이터 중, 3개만 값을 가져온다.
*LEFT JOIN : 왼쪽 테이블을 기준으로 오른쪽 테이블을 조인
[Level 4]
-- 1 LIKE 이용
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
AND I.SEX_UPON_INTAKE LIKE 'Intact%'
AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%'
OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY I.ANIMAL_ID
-- 2 성별이 그대로
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
AND NOT I.SEX_UPON_INTAKE = O.SEX_UPON_OUTCOME
ORDER BY I.ANIMAL_ID
보호소에 들어왔을 때부터 이미 중성화가 되어있다면 I.SEX_UPON_INTAKE 값과 O.SEX_UPON_OUTCOME 값이 같을 것이므로, 이 두 값이 다른 경우를 찾으면 된다.
1) 둘 중 하나라도 만족하는 데이터 검색 : OR
2) 둘 다 만족하는 데이터 검색 : AND
아래 OR에 AND를 넣어주면 2번 구현 가능.
SELECT *
FROM 테이블
WHERE (컬럼명 LIKE 'A%' OR 컬럼명 LIKE 'B%')
SELECT *
FROM 테이블
WHERE (컬럼명 LIKE 'A%' OR 'B%')
이렇게는 안된다 ㅋ . 될 줄 알았는데 안 되길래 위에 거겠군 하고 바꿔서 구현했습니다.
시간이 되면 나머지 문제에 대해서도 풀이 ..