SQL

[코딩테스트] Level2

Bordercolli 2023. 9. 6. 13:02
728x90

※ 도전을 두려워하지 말고 부딪혀보자! 틀려도 너무 연연해하지 않기.

LEVEL1 복습
1. IF(조건, 참,거짓)
2. DATEDIFF(마지막날짜, 시작날짜) = 마지막날짜 - 시작날짜 일 수 구해줌
3. CASE WHEN 조건문 THEN 참일경우 결과값 ELSE 거짓일경우결과값 END AS 결과를 저장할 변수명
4. date_format(날짜변수, '%Y-%m-%d') 시간빼고 날짜 출력해줌.
5. WHERE date_format(날짜변수, '%Y-%m')='xxxx-xx';

문제1. 동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

문제2. 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

특정 데이터가 먼저 출력되길 바란다면?

ORDER BY FIELD(변수, 먼저출력될데이터, 나중에 출력될 데이터);

방법1. FIELD 함수 사용

방법2. UNION 사용

 

문제3. 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

문제4. 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

WHERE 컬럼 IN (출력하고 싶은 값);

문제5. 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

WHERE UPPER/ LOWER(컬럼) LIKE '단어';

# 컬럼의 데이터를 대문자로 바꾸고, 해당 단어가 들어간 데이터를 찾아라.

문제6. 동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

문제7. 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

문제8. 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

IF사용
CASE WHEN 사용

문제9.동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 'No Name'으로 표시해주세요.

문제10. 보호소에서 몇 시에서 입양이 가장 활발하게 일어나는지 알아보려고 한다. 오전 9시부터 8시까지 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성하여라. 이때 결과는 시간대 순으로 정렬하여야 한다.

HOUR(컬럼) 은 '년-월-일-시간-분-초'에서 '시간'만 추출하여 준다.

 

문제11. ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.

(시각(시-분-초)을 제외한 날짜(년-월-일)만 보여주세요.)

 

문제12.FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

문제13.MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

(AND 3번 사용가능)

문제14. PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.

 

문자열 자르기

LEFT(문자열, 길이) /  RIGHT(문자열, 길이) / SUBSTRING(문자열, 시작자리번호, 자를문자수)

문제15. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

 

solution1. floor함수 사용 → 소수점 아래는 무시 ex) 1.2 => 1

solution2. truncate함수 사용 → 숫자 특정 자리수 이하를 버림(컬럼, 버림할 자리) ex) truncate(12.123, 1)=> 12.1

solution3. round()사용 -> 반올림이라서 안됨.

floor함수 사용
truncate함수 사용

 

문제16. PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.

 

문제17. ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

GROUP BY 를 두 번 쓴 경험을 준 문제

 

문제18. ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

※  되도록 이면 별칭으로 조건문을 달거나 ORDER BY, GROUP BY 같은 명령을 사용하지 않는 것이 좋다. 별칭은 SELECT문에서만 사용하도록 하자. ㅜㅜ

 

문제19. 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

문제20. '경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

문제21. CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

REGXP_LIKE(컬럼명, 비교할문자열) => 비교할 문자열이 해당 컬럼 내에 있는지 확인한다. 마치 ctrl+f나 리눅스의 find처럼!

문제22. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

문제23. USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

CASE

WHEN 조건 THEN 결과

WHEN 조건 THEN 결과 ...

이런식으로 WHEN을 여러 번 사용하여 파이썬의 CASE같은 느낌을 낼 수 있다. 

1. 테이블 위아래로 결합
- ORDER BY FIELD(변수, 먼저출력될데이터, 나중에출력될데이터)
- A테이블 UNION B테이블  # A테이블과 B테이블 결합

2. 특정 행(데이터) 추출하기
WHERE 컬럼 IN (출력하고자 하는 값 나열);

3. 출력하고 싶은 문자열 출력
WHERE UPPER/ LOWER(컬럼) LIKE '단어';
#이렇게 하면 출력하고 싶은 단어를 대소문자 가리지 않고 뽑아낸 후 대소문자로 변경하고 원하는 단어를 뽑아낼 수 있다.
# ex) 'el'이 포함된 레코드를 대소문자 구별없이 뽑아내고 싶다.

4. HOUR, SECOND, MINUTES, YEAR, MONTH, DAY() 함수만을 사용하여서 특정 뽑아내고 싶은 날짜 및 시간을 추출할 수 있다.

5. DATE_FORMAT(컬럼, '날짜포맷');
6. 문자열자르기 
LEFT/ RIGHT(문자열, 자르고싶은길이)
SUBSTRING(문자열, 시작자리번호(인덱스아님), 자르고 싶은 문자 수)  ex) substring()   -> MySQL에서 사용
SUBSTR(문자열, 시작자리번호(인덱스아님), 자르고 싶은 문자 수) -> Oracle에서 사용

7. floor와 round차이
floor/ truncate(숫자열,소수점자리수) => 소수점 아래를 무시한다.
round(숫자열, 소수점자리수)=> 소수점 아래 반올림한다.

8. GROUP BY 에 여러 컬럼을 대입할 수 있다.
9. REGXP_LIKE(컬럼명, 찾고자하는 단어) => 컬럼 안에서 내가 찾고자하는 단어를 검색한다 (ctrl+F와 같은 효과)
10. CASE
WHEN 조건 THEN 결과
WHEN 조건 THEN 결과...
END AS 결과를저장할변수
이런 식으로 WHEN을 여러 번 사용하여 파이썬의 CASE와 같은 느낌을 낼 수 있다. 

 

'SQL' 카테고리의 다른 글

[코딩테스트] Level3  (0) 2023.09.07
[코딩테스트] Level1  (0) 2023.09.01
[파이썬으로 SQL] pymysql기반 MySQL다루기  (0) 2023.08.30
[참고] MySQL INDEX  (0) 2023.08.30
[문제풀이] 파이널 테스트  (0) 2023.08.29