📌 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 |
| %i | 분 | 30 |
| %s | 초 | 00 |
💻 정답 코드 (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 처리 순서 요약
| 순서 | 절 | 설명 |
|---|
| 1 | FROM | 기본 테이블 선택 |
| 2 | JOIN | JOIN 연결 |
| 3 | ON | JOIN 조건 평가 |
| 4 | WHERE | 행 필터링 |
| 5 | GROUP BY | 그룹핑 |
| 6 | HAVING | 그룹 결과 필터링 |
| 7 | SELECT | 최종 출력 컬럼 선택 |
| 8 | ORDER BY | 정렬 |
| 9 | LIMIT | 출력 개수 제한 |
📌 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. 강원도에 위치한 생산공장 목록 출력하기
🔍 핵심 개념 및 주의할 점
💻 정답 코드 (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;