2025-04-07 MY SQL

성현규·2025년 4월 7일
post-thumbnail

📌 1. MY SQL 코딩테스트 정리


📌 1-1 잔챙이 잡은 수 구하기

🔍 핵심 개념 및 주의할 점

  • "LENGTH 에 NULL 만 있는 경우는 없습니다." = LENGTH 컬럼 전체가 다 NULL 인 상황은 없다.

💻 정답 코드 (SQL)

SELECT COUNT(ID) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL;

📌 1-2. 잡은 물고기 중 가장 큰 물고기의 개수 구하기

🔍 핵심 개념 및 주의할 점

  • CONCAT() 으로 문자열과 숫자를 더할 수 있다. 콤마로 구분하여 많이 넣을 수 있다.
  • CONCATENATE (연결하다, 잇다) 라는 단어의 줄임말이다.

💻 정답 코드 (SQL)

SELECT CONCAT(MAX(LENGTH), 'cm') AS MAX_LENGTH
FROM FISH_INFO;

📌 1-3. 평균 일일 대여 요금 구하기

🔍 핵심 개념 및 주의할 점

  • ROUND(숫자, 자리수)로 자를 수 있다.
  • 0 = 정수, -1 = 십의 자리로 반올림, 이후 1자리 2자리 하면 나타낼 소숫점 아래숫자를 의미한다.

💻 정답 코드 (SQL)

SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

📌 1-4. 모든 레코드 조회하기

💻 정답 코드 (SQL)

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

📌 1-5. 특정 옵션이 포함된 자동차 리스트 구하기

🔍 핵심 개념 및 주의할 점

  • FIND_IN_SET = contains(java에서) -> 여러가지를 포함하고 싶다면 AND로 연결해서 여러번 쓰기
  • '네비게이션' IN OPTIONS이다.

💻 정답 코드 (SQL)

SELECT CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
FROM CAR_RENTAL_COMPANY_CAR
WHERE FIND_IN_SET('네비게이션', OPTIONS)
ORDER BY CAR_ID DESC;

📌 1-6. Python 개발자 찾기

🔍 핵심 개념 및 주의할 점

  • IN은 칼럼이 앞에 오는게 맞지만 MY SQL만 칼럼이 뒤에 오는 방식으로 써도 가능하다.

💻 정답 코드 (SQL)

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python'
   OR SKILL_2 = 'Python'
   OR SKILL_3 = 'Python'
ORDER BY ID ASC;

📌 1-7. 잡은 물고기의 평균 길이 구하기

🔍 핵심 개념 및 주의할 점

  • WHERE 절에서는 데이터를 걸러내는 곳이기 때문에 AS같은 것을 사용할 수 없다.
  • 이 문제에서는 확실하게 AVG 안에서 CASE WHEN 을 사용하는 게 낫다.

💻 정답 코드 (SQL)

SELECT ROUND(AVG(
    CASE WHEN LENGTH IS NULL THEN 10 ELSE LENGTH END
), 2) AS AVERAGE_LENGTH
FROM FISH_INFO;

📌 1-8. 한 해에 잡은 물고기 수 구하기

🔍 핵심 개념 및 주의할 점

  • 데이터 타입만 DATE이면 어떻게 적어두든 비슷한 방식으로 해를 구하면 된다.

💻 정답 코드 (SQL)

SELECT COUNT(ID) AS FISH_COUNT
FROM FISH_INFO
WHERE TIME >= '2021/01/01'
  AND TIME < '2022/01/01';

📌 1-9. 최댓값 구하기

💻 정답 코드 (SQL)

SELECT MAX(DATETIME) AS '시간'
FROM ANIMAL_INS;

📌 1-10. 자동차 대여 기록에서 장기/단기 대여

🔍 핵심 개념 및 주의할 점

  • DATEDIFF는 일수-일수를 반환해준다.
  • DATEDIFF() 는 양 끝을 뺀 '차이' 만 계산 즉, 양쪽 날짜 수 포함 계산하려면 +1 해야 한다.
  • 날짜만 저장되어 있다면 → BETWEEN
  • 날짜 + 시간 까지 저장되어 있다면 → >= AND <
  • DATE_ADD(기준 날짜, INTERVAL 더할 양 단위) -> 예시: SELECT DATE_ADD('2022-09-01', INTERVAL 10 DAY);

💻 정답 코드 (SQL)

SELECT HISTORY_ID, CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE,
       DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
       CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
            ELSE '단기 대여' END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;

📌 1-11. 가장 큰 물고기 10마리 구하기

🔍 핵심 개념 및 주의할 점

  • ORDER BY 컬럼 DESC → NULL 맨 앞
  • ORDER BY 컬럼 ASC → NULL 맨 뒤
  • 원래 설계는 이러하여 이를 고려하기 위해서는
  • ORDER BY 절은 숫자가 작을수록 먼저 온다는 규칙이 있다. ORDER BY LENGTH IS NULL하여 이렇게 하면 NULL일때는 1로 생각되므로 0인게 앞으로 오고 1은 뒤로 가게 된다.
  • 값이 존재하면 우선 내부적으로 0으로 처리해서 앞으로 보낸 후에 다음 조건으로 각 숫자를 판단해서 정렬한다.

💻 정답 코드 (SQL)

SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH IS NULL, LENGTH DESC, ID ASC
LIMIT 10;

📌 1-12. 조건에 부합하는 중고거래 댓글 조회하기

🔍 핵심 개념 및 주의할 점

  • 날짜 꼭 문자열로 감싸기
  • 테이블 열 정보 한글 이름까지 꼭 확인하기 -> 열이름이 같아도 한글 뜻이 다를 수 있음.

💻 정답 코드 (SQL)

SELECT B.TITLE, B.BOARD_ID, U.REPLY_ID, U.WRITER_ID, U.CONTENTS,
       DATE_FORMAT(U.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD B
JOIN USED_GOODS_REPLY U ON B.BOARD_ID = U.BOARD_ID
WHERE B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY U.CREATED_DATE ASC, B.TITLE ASC;

📌 1-13. 동명 동물 수 찾기

🔍 핵심 개념 및 주의할 점

  • 원래 COUNT가 그룹에서 NULL 개수를 제외하고 센다.
  • GROUP BY 를 하고 나면, SQL 은 마치 "그룹별로 임시 테이블이 생긴 것처럼" 작동한다.

💻 정답 코드 (SQL)

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME;

📌 1-14. 이름에 el이 들어가는 동물 찾기

🔍 핵심 개념 및 주의할 점

  • 문제 틀리면 문제에서 빠진 조건 있는지 정말 꼼꼼히 봐야한다.
방법설명대소문자 구분
LIKE '%문자%'문자열 포함 여부 확인❌ (기본적으로 구분 안 함)
BINARY LIKE '%문자%'대소문자 구분 포함 여부 확인
REGEXP_LIKE(컬럼, '문자')정규표현식으로 포함 여부 확인❌ (BINARY 붙이면 ✅)
BINARY REGEXP_LIKE(컬럼, '문자')정규표현식 + 대소문자 구분

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'DOG'
  AND NAME LIKE '%EL%'
ORDER BY NAME;

📌 1-15. 동물 수 구하기

💻 정답 코드 (SQL)

SELECT COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS;

📌 1-16. NULL 처리하기

💻 정답 코드 (SQL)

SELECT ANIMAL_TYPE,
       CASE WHEN NAME IS NULL THEN 'No name' ELSE NAME END AS NAME,
       SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

📌 1-17. DATETIME에서 DATE로 형 변환

🔍 핵심 개념 및 주의할 점

  • DATE로 바꿀때는 DATE()로 감싸는게 제일 낫다.

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME, DATE(DATETIME) AS '날짜'
FROM ANIMAL_INS;

📌 1-18. 가격이 제일 비싼 식품의 정보 출력하기

💻 정답 코드 (SQL)

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;

📌 1-19. 카테고리 별 상품 개수 구하기

🔍 핵심 개념 및 주의할 점

  • SUBSTRING(컬럼명, 시작위치, 길이): 문자열의 특정부분을 잘라서 탐색해야할때 사용한다. -> 시작위치는 1부터이다.
  • LEFT(칼럼명, 길이): 앞에서부터 특정 부분까지 자를때 사용한다.
  • ORDER BY는 SELECT 이후 실행되므로 SELECT의 별칭을 사용할 수 있다.

💻 정답 코드 (SQL)

WITH PRODUCT_CTE AS (
    SELECT PRODUCT_CODE, SUBSTRING(PRODUCT_CODE, 1, 2) AS CATEGORY
    FROM PRODUCT
)
SELECT CATEGORY, COUNT(PRODUCT_CODE) AS COUNT
FROM PRODUCT_CTE
GROUP BY CATEGORY
ORDER BY CATEGORY;

📌 1-20. 조건에 맞는 아이템들의 가격의 총합 구하기

💻 정답 코드 (SQL)

SELECT SUM(PRICE) AS TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY = 'LEGEND';

📌 1-21. 중복 제거하기

💻 정답 코드 (SQL)

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;

📌 1-22. 중성화 여부 파악하기

🔍 핵심 개념 및 주의할 점

  • '%Neutered%' 이건 LIKE와 같이 써야하고 SEX_UPON_INTAKE LIKE '%Neutered%' 이렇게 형식을 일일히 써서 OR로 이어주어야함.
  • 아니면 정규표현식 활용하기

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME,
       CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%'
                 OR SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O'
            ELSE 'X' END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

📌 1-23. 진료과별 총 예약 횟수 출력하기

🔍 핵심 개념 및 주의할 점

  • 컬럼명 alias (별칭)을 사용할 때는 원칙적으로 따옴표를 쓰지 않는게 좋다.
  • 띄어쓰기나 특수문자를 넣으려면 따옴표를 써야 하는데 그럴 바에는 그냥 아예 안쓰는게 깔끔하다.

💻 정답 코드 (SQL)

SELECT MCDP_CD AS '진료과코드', COUNT(MCDP_CD) AS '5월예약건수'
    FROM APPOINTMENT 
    WHERE  '2022-05-01' <= APNT_YMD AND '2022-06-01' > APNT_YMD
    GROUP BY MCDP_CD
    ORDER BY 5월예약건수 ASC, 진료과코드 ASC;

📌 1-24. 고양이와 개는 몇 마리 있을까

🔍 핵심 개념 및 주의할 점

  • GROUP BY에 조건이 필요하면 HAVING ! - 아 이럴때 쓰는 거구나 !

💻 정답 코드 (SQL)

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
    FROM ANIMAL_INS 
    GROUP BY ANIMAL_TYPE
    HAVING ANIMAL_TYPE IN ('DOG', 'CAT')
    ORDER BY ANIMAL_TYPE ASC;
  • 순서를 내가 직접 지정해야할때 CASE WHEN 문을 사용한다.
  • 아래는 단순 CASE 표현식으로 검색 CASE 표현식과 다른 종류이다.

💻 개선 코드 (SQL)

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
    FROM ANIMAL_INS 
    GROUP BY ANIMAL_TYPE
    HAVING ANIMAL_TYPE IN ('DOG', 'CAT')
    ORDER BY 
        CASE ANIMAL_TYPE
            WHEN 'CAT' THEN 1
            WHEN 'DOG' THEN 2
            ELSE 3
        END;

📌 1-25. 입양 시각 구하기(1)

🔍 핵심 개념 및 주의할 점

구분함수설명
날짜DATE()날짜만 추출한다.
YEAR()연도만 추출한다.
MONTH()월만 추출한다.
DAY()일(day)만 추출한다.
시간HOUR()시(hour)만 추출한다.
MINUTE()분(minute)만 추출한다.
SECOND()초(second)만 추출한다.
포맷DATE_FORMAT()원하는 형식으로 날짜 및 시간을 포맷한다.
요일DAYNAME()요일 이름을 반환한다. (예: Monday)
DAYOFWEEK()요일 번호를 반환한다. (1=일요일, 7=토요일)
계산DATE_ADD()날짜/시간을 더한다.
DATE_SUB()날짜/시간을 뺀다.
TIMESTAMPDIFF()두 날짜/시간의 차이를 구한다.
  • HAVING은 그룹핑된 데이터 범위 안에서만 적용할 수 있는 조건을 사용해야 한다. 광범위하게 먼저 걸러야할 것은 WHERE에서 먼저 거르고 오자.

  • 💻 정답 코드 (SQL)

WITH HOUR_DTS AS (
    SELECT HOUR(DATETIME) AS HOUR_DT
    FROM ANIMAL_OUTS
    WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
)

SELECT HOUR_DT AS HOUR, COUNT(HOUR_DT) AS COUNT
FROM HOUR_DTS
GROUP BY HOUR_DT
ORDER BY HOUR_DT ASC;

📌 1-26. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

🔍 핵심 개념 및 주의할 점

  • 옵션에 특정 물품이 포함됐는지 봐야한다? -> FIND_IN_SET

  • 💻 정답 코드 (SQL)

SELECT CAR_TYPE, COUNT(CAR_TYPE) AS CARS
    FROM CAR_RENTAL_COMPANY_CAR 
    WHERE FIND_IN_SET('통풍시트', OPTIONS)
        OR FIND_IN_SET('열선시트', OPTIONS)
        OR FIND_IN_SET('가죽시트', OPTIONS)
    GROUP BY CAR_TYPE
    ORDER BY CAR_TYPE ASC
profile
학생

0개의 댓글