2025-04-06 MY SQL

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

📌 1. MySQL 코딩 테스트 오답노트


📌 1-1. 이름이 없는 동물의 아이디

🔍 핵심 개념 및 주의할 점

  • SQL에서 NULL 비교는 IS 또는 IS NOT 을 사용해야 한다.
  • CHAR vs VARCHAR: CHAR은 고정 길이, VARCHAR은 가변 길이이며 입력 값보다 1~2바이트 추가로 저장된다.

💻 정답 코드 (SQL)

SELECT animal_id 
    FROM ANIMAL_INS     
    WHERE name IS NULL;

📌 1-2. 경기도에 위치한 식품창고 목록 출력하기

🔍 핵심 개념 및 주의할 점

  • CASE 는 SELECT 컬럼 하나로 인식한다.
  • 세미콜론은 SQL 문장의 끝에 하나만 붙인다.
  • 문자열은 작은 따옴표를 사용하는 것이 일반적이다.
  • CASE WHEN 에서는 비교식 대신 값 반환이 필요하다.
  • CASE 문 끝은 반드시 END 로 닫는다.
  • ELSE 를 생략하면 NULL 반환.
  • 원본 값을 그대로 사용해야 하는 컬럼은 그대로 사용한다.

💻 정답 코드 (SQL)

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS,
    CASE
        WHEN FREEZER_YN IS NULL THEN 'N'
        ELSE FREEZER_YN 
    END AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '경기도%'
ORDER BY WAREHOUSE_ID;

📌 1-3. 조건에 맞는 회원수 구하기

🔍 핵심 개념 및 주의할 점

  • LIKE 방식은 DATE/DATETIME 을 문자열로 변환하여 느리다.
  • 인덱스를 활용하는 범위 탐색이 효율적이다.

💻 정답 코드 (SQL)

SELECT COUNT(USER_ID) AS USERS 
FROM USER_INFO 
WHERE JOINED LIKE '2021%' 
  AND AGE BETWEEN 20 AND 29;

💻 개선 코드 (SQL)

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE JOINED >= '2021-01-01'
  AND JOINED < '2022-01-01'
  AND AGE BETWEEN 20 AND 29;

📌 1-4. 흉부외과 또는 일반외과 의사 목록 출력하기

🔍 핵심 개념 및 주의할 점

  • 날짜 포맷 변경은 DATE_FORMAT() 사용.
  • WHERE 절 조건이 많을 때는 IN 연산자로 가독성을 높인다.

💡 포맷 정리 참고표

포맷설명예시 (2025-04-06 14:30:00)
%Y연도 (4자리)2025
%y연도 (2자리)25
%m월 (2자리)04
%c월 (숫자)4
%d일 (2자리)06
%e일 (숫자)6
%H시 (24시간)14
%i30
%s00

💻 정답 코드 (SQL)

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') 
FROM DOCTOR 
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;

💻 개선 코드 (SQL)

SELECT 
    DR_NAME, 
    DR_ID, 
    MCDP_CD, 
    DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME;

📌 1-5. 상위 N개 레코드

🔍 핵심 개념 및 주의할 점

  • 집계 함수는 WHERE 가 아닌 SELECT 또는 HAVING/서브쿼리에서 사용한다.
  • LIMIT 사용으로 간단하게 해결 가능하다.

💻 정답 코드 (SQL)

SELECT NAME 
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS);

💻 다른 풀이 (SQL)

SELECT NAME
FROM ANIMALS_INS
ORDER BY DATETIME
LIMIT 1;

📌 1-6. 나이 정보가 없는 회원 수 구하기

🔍 핵심 개념 및 주의할 점

  • COUNT(컬럼) 은 NULL 을 제외하므로 COUNT(*) 사용.

💻 오답 코드 (SQL)

SELECT COUNT(AGE) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;

💻 수정 코드 (SQL)

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;

💡 SQL 처리 순서 요약

순서설명
1FROM기본 테이블 선택
2JOINJOIN 연결
3ONJOIN 조건 평가
4WHERE행 필터링
5GROUP BY그룹핑
6HAVING그룹 결과 필터링
7SELECT최종 출력 컬럼 선택
8ORDER BY정렬
9LIMIT출력 개수 제한

📌 1-7. 동물의 아이디와 이름

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID;

📌 1-8. 어린 동물 찾기

🔍 핵심 개념 및 주의할 점

  • 같지 않음 연산자는 <> 사용.

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS
WHERE INTAKE_CONDITION <> 'Aged';

📌 1-9. 이름이 있는 동물의 아이디

💻 정답 코드 (SQL)

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;

📌 1-10. 여러 기준으로 정렬하기

💻 정답 코드 (SQL)

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS 
ORDER BY NAME, DATETIME DESC;

📌 1-11. 가장 비싼 상품 구하기

💻 정답 코드 (SQL)

SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT;

📌 1-12. 강원도에 위치한 생산공장 목록 출력하기

🔍 핵심 개념 및 주의할 점

  • LIKE 구문 사용.

💻 정답 코드 (SQL)

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY 
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID;

📌 1-13. 12세 이하인 여자 환자 목록 출력하기

💻 정답 코드 (SQL)

SELECT PT_NAME, PT_NO, GEND_CD, AGE, 
    CASE 
        WHEN TLNO IS NULL THEN 'NONE'
        ELSE TLNO
    END AS TLNO
FROM PATIENT 
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;

📌 1-14. 인기있는 아이스크림

💻 정답 코드 (SQL)

SELECT FLAVOR
FROM FIRST_HALF 
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;

📌 1-15. 조건에 맞는 도서 리스트 출력하기

🔍 핵심 개념 및 주의할 점

  • 인덱스 설계 시 대분류, 소분류 순서 고려.

💻 정답 코드 (SQL)

CREATE INDEX idx_category_publishedDate ON BOOK(CATEGORY, PUBLISHED_DATE);

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK 
WHERE CATEGORY = '인문'
  AND PUBLISHED_DATE >= '2021-01-01' 
  AND PUBLISHED_DATE < '2022-01-01'
ORDER BY PUBLISHED_DATE ASC;

📌 1-16. 과일로 만든 아이스크림 고르기

💻 정답 코드 (SQL)

SELECT FIRST_HALF.FLAVOR 
FROM FIRST_HALF 
JOIN ICECREAM_INFO ON ICECREAM_INFO.FLAVOR = FIRST_HALF.FLAVOR
WHERE FIRST_HALF.TOTAL_ORDER >= 3000
  AND ICECREAM_INFO.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC;

💻 개선 코드 (SQL)

SELECT F.FLAVOR 
FROM FIRST_HALF F
JOIN ICECREAM_INFO I ON I.FLAVOR = F.FLAVOR
WHERE F.TOTAL_ORDER >= 3000
  AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC;
profile
학생

0개의 댓글