오답노트(SQL)

wldus·2025년 11월 13일

프로그래머스 문제

1. USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.

SELECT  count(users)
case when age 20<=29 users
from USER_INFO
group by users;
▶ 정답쿼리 :
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE JOINED LIKE '2021%' 
  AND AGE BETWEEN 20 AND 29;

▶ 피드백 :
만약 내가 처음 쓴대로 case when 문을 사용하고자 했다면,() 넣었어야 함.
그리고 지금 또 파이썬 배운다고 이전에 배웠던 문법이 완전 뒤죽박죽인데
1) case when
then
else end 가 맞는 문법임
2) 20~29세 사이면 between 20 and 29
3) 문제 조건인 '21년도에 가입한' 부분을 계산하지 않음.


📌case when 을 이용할때 :

SELECT COUNT(CASE WHEN AGE BETWEEN 20 AND 29 THEN 1 END) AS USERS
FROM USER_INFO
WHERE JOINED LIKE '2021%';

📌서브쿼리를 이용할때 :

SELECT COUNT(*)
FROM (
   SELECT *
   FROM USER_INFO
   WHERE JOINED LIKE '2021%'
) A
WHERE AGE BETWEEN 20 AND 29;

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

SELECT 
PRODUCT_ID,
PRODUCT_NAME,
PRODUCT_CD,
CATEGORY,
PRICE
from FOOD_PRODUCT
where max(PRICE) 
▶ 정답쿼리 :
SELECT 
    PRODUCT_ID,
    PRODUCT_NAME,
    PRODUCT_CD,
    CATEGORY,
    PRICE
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);

▶ 피드백 :
📌 SELECT에서 불러오는 컬럼들은 반드시 FROM 절의 테이블 안에 있어야 한다.

1) SQL 문이 작동하는 순서에 대해 다시한번 숙지할 필요가 있음.
2) where 조건절에서는 집계함수(max)를 함께 쓸수 없음.


3. 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

select NAME
from  ANIMAL_INS
where DATETIME asc
limit 1
;

▶ 정답쿼리 :

select NAME
from  ANIMAL_INS
order by DATETIME
limit 1
;

▶피드백 :
1) where절로 했을때와 order by절로 쿼리를 작성했을때 결과물이 180도 다르게 나왔다.
2) order by 에서만 asc,desc 가능함


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

SELECT ANIMAL_ID, NAME 
from ANIMAL_INS 
where name like ('%el%') 
order by name ;

▶ 정답쿼리 :

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

▶피드백 : 고양이도 있는데 '개' 만 이라는 조건을 놓침


5. USER_INFO 테이블에서 나이 정보가 없는 회원이 몇 명인지 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 USERS로 지정해주세요.

SELECT sum(case when age is not null 0 then 1 end) as users
from  USER_INFO

▶ 정답쿼리 :

SELECT SUM(CASE WHEN age IS NULL THEN 1 ELSE 0 END) AS users
FROM USER_INFO;

▶피드백 :
1) case when 조건 의 순서가 맞지않았음
'비어있으면' -> 1(true)


6. FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

SELECT WAREHOUSE_ID,
WAREHOUSE_NAME,
ADDRESS
from FOOD_WAREHOUSE
where ADDRESS like '%경기도%'
order by WAREHOUSE_ID

▶ 정답쿼리 :

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

▶피드백 : null 값을 제대로 표현하지 못함. case when 구문은 생각했으나, else를 뭐라 적어야할지 떠오르지 않았음.


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

SELECT ANIMAL_ID,
NAME,
DATETIME AS 날짜
from ANIMAL_INS
order by ANIMAL_ID

▶ 정답쿼리 :

SELECT ANIMAL_ID,
NAME,
DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
from ANIMAL_INS
order by ANIMAL_ID

▶피드백 :


8. DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.

SELECT
  DR_NAME,
  DR_ID,
  MCDP_CD,
 HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'cs' or 'gs'
ORDER BY HIRE_YMD DESC, DR_NAME

▶ 정답쿼리 :

SELECT
  DR_NAME,
  DR_ID,
  MCDP_CD,
  DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'cs' or MCDP_CD ='gs'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

▶피드백 :
1) where 절에서 or이나 in 둘다 쓸수 있음.
단, 나는 처음에 WHERE MCDP_CD = 'cs' or 'gs' 이렇게 썼기 때문에 오류남.
2) 예제 제대로 확인 안해서 date_format 안함.


profile
재밌게 사는사람

0개의 댓글