프로그래머스 SQL Lv.1

murphytklee·2023년 4월 11일
0
post-thumbnail

📌 새로 알게된 것

  • DATE_FORMAT( , '%Y-%m-%d')
  • DATEDIFF(END_DATE, START_DATE)+1
  • CASE
          when
          when
          when
    else end

1. 아픈 동물 찾기 (Select)

Link

-- 코드를 입력하세요
SELECT i.animal_id, i.name from animal_ins i
where INTAKE_CONDITION = 'sick'


2. 동물의 아이디와 이름 (Select)

Link

-- 코드를 입력하세요
SELECT i.ANIMAL_ID, i.NAME from ANIMAL_INS i


3. 이름이 있는 동물의 아이디 (Is null)

Link

-- 코드를 입력하세요
SELECT i.ANIMAL_ID from ANIMAL_INS i
where i.NAME is not null
order by i.ANIMAL_ID asc


4. 상위 n개 레코드 (Select)

Link

-- 코드를 입력하세요
SELECT i.NAME from ANIMAL_INS i
order by i.DATETIME asc
limit 1
  • limit 말고 다른 방법은 없는가?



5. 여러 기준으로 정렬하기 (Select)

Link

-- 코드를 입력하세요
SELECT i.ANIMAL_ID, i.NAME, i.DATETIME from ANIMAL_INS i
order by i.NAME, i.DATETIME desc


6. 어린 동물 찾기 (Select)

Link

-- 코드를 입력하세요
SELECT i.ANIMAL_ID, i.NAME from ANIMAL_INS i
where INTAKE_CONDITION != 'aged'
order by i.ANIMAL_ID asc


7. 역순 정렬하기 (Select)

Link

-- 코드를 입력하세요
SELECT i.NAME, i.DATETIME from ANIMAL_INS i
order by i.ANIMAL_ID desc


8. 강원도에 위치한 생산공장 목록 출력하기 (Select)

Link

-- 코드를 입력하세요
SELECT f.FACTORY_ID, f.FACTORY_NAME, f.ADDRESS from FOOD_FACTORY f
where f.ADDRESS like '%강원도%'
order by f.FACTORY_ID asc


9. 나이 정보가 없는 회원 수 구하기 (Is null)

Link

-- 코드를 입력하세요
SELECT count(*) as USERS from USER_INFO u
where u.age is null


10. 경기도에 위치한 식품창고 목록 출력하기 (Is null) ⁉️

Link

-- 코드를 입력하세요
SELECT f.WAREHOUSE_ID,
			 f.WAREHOUSE_NAME,
			 f.ADDRESS,
			 (case when f.FREEZER_YN is null then 'N' else f.FREEZER_YN end) as FREEZER_YN
from FOOD_WAREHOUSE f
where f.ADDRESS like '%경기도%'
order by f.WAREHOUSE_ID asc
  • case 문을 쓰지 않고 FREEZER_YN 필드에 바로 출력시킬 수는 없는 건가?
    → if문을 써도 가능



11. 조건에 맞는 회원수 구하기 (Select) ⁉️

Link

-- 코드를 입력하세요 O
SELECT count(*) as USERS from USER_INFO u
where year(u.joined) = '2021'
and u.age between 20 and 29

-- 코드를 입력하세요 X
SELECT count(u.age between 20 and 29) as USERS from USER_INFO u
where year(u.joined) = '2021'
  • 왜 위 아래의 코드는 다르게 출력되는건가 ?
    → count( 안에는 필드만 들어갈 수 있다)



12. 이름이 없는 동물의 아이디 (Is null)

Link

-- 코드를 입력하세요
SELECT i.ANIMAL_ID from ANIMAL_INS i
where i.NAME is null


13. 가장 비싼 상품 구하기 (SUM, MAX, MIN)

Link

-- 코드를 입력하세요
SELECT max(p.price) as MAX_PRICE from PRODUCT p


14. 흉부외과 또는 일반외과 의사 목록 출력하기 (Select) 🔺

Link

-- 코드를 입력하세요
SELECT d.DR_NAME, d.DR_ID, d.MCDP_CD, substring(d.HIRE_YMD,1,10) as HIRE_YMD
from DOCTOR d
where d.MCDP_CD = 'CS' or d.MCDP_CD ='GS'
order by d.HIRE_YMD desc, d.DR_NAME asc
  • where 절에서 in (’CS’, ‘GS’) 도 가능하다.



15. 12세 이하인 여자 환자 목록 출력하기 (Select)

Link

-- 코드를 입력하세요
SELECT p.PT_NAME, p.PT_NO, p.GEND_CD, p.AGE, 
(case when p.TLNO is null then 'NONE' else p.TLNO end) as TLNO 
from PATIENT p
where p.AGE <= 12 and p.GEND_CD = 'W'
order by p.AGE DESC, p.PT_NAME


16. 인기있는 아이스크림 (Select)

Link

-- 코드를 입력하세요
SELECT f.FLAVOR from FIRST_HALF f
order by f.TOTAL_ORDER desc, f.SHIPMENT_ID asc


17. 모든 레코드 조회하기 (Select)

Link

-- 코드를 입력하세요
SELECT * from ANIMAL_INS
order by ANIMAL_ID


18. 조건에 맞는 도서 리스트 출력하기 (Select) 🔺

Link

-- 코드를 입력하세요
SELECT b.BOOK_ID, substring(b.PUBLISHED_DATE,1,10) as PUBLISHED_DATE from BOOK b
where year(b.PUBLISHED_DATE) = '2021' and b.CATEGORY = '인문'
order by b.PUBLISHED_DATE asc
  • substring 대신 DATE_FORMAT(b.published_date,'%Y-%m-%d') 를 써보자



19. 평균 일일 대여 요금 구하기 (Select)

Link

-- 코드를 입력하세요
SELECT round(avg(c.DAILY_FEE),0) as AVERAGE_FEE from CAR_RENTAL_COMPANY_CAR c
where c.car_type = 'SUV'


20. 최댓값 구하기 (SUM, MAX, MIN)

Link

-- 코드를 입력하세요
SELECT max(i.DATETIME) from ANIMAL_INS i


21. 과일로 만든 아이스크림 고르기 (Select)

Link

-- 코드를 입력하세요
SELECT f.FLAVOR from FIRST_HALF f left join ICECREAM_INFO i on f.FLAVOR = i.FLAVOR	
where f.TOTAL_ORDER >= 3000 and i.INGREDIENT_TYPE = 'fruit_based'
order by f.TOTAL_ORDER desc


22. 특정 옵션이 포함된 자동차 리스트 구하기 (String, Date)

Link

-- 코드를 입력하세요
SELECT * from CAR_RENTAL_COMPANY_CAR c
where c.options like '%네비게이션%'
order by car_id desc


23. 자동차 대여 기록에서 장기/단기 대여 구분하기 (String, Date) 🔺

Link

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 DATE_FORMAT(start_date, '%Y-%m') = '2022-09'
ORDER BY HISTORY_ID DESC
📌 DATEDIFF(*startdate, enddate)* : *startdate*와 *enddate*의 차이를 보고하는 단위 - START_DATE와 END_DATE가 동일하다면 0으로 계산되기 때문에 +1일을 해줌으로써 대여일과 반납일이 동일해도 1일로 잡기 위함이다

24. 조건에 부합하는 중고거래 댓글 조회하기 (Select) ⁉️

Link

-- 코드를 입력하세요
SELECT b.TITLE,
			 b.BOARD_ID,
			 r.REPLY_ID,
			 r.WRITER_ID,
			 r.CONTENTS,
			 DATE_FORMAT(r.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD b INNER JOIN USED_GOODS_REPLY r
ON b.BOARD_ID = r.BOARD_ID
WHERE DATE_FORMAT(b.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY r.CREATED_DATE ASC, b.TITLE ASC
  • 왜 left join 을 쓰면 안되고 inner join 을 써야 되는지? Inner join (O), left join (X), join (O)
    → left join을 쓸 경우 공백란까지 들고오기 때문에 X
    → Join = Inner Join
profile
murphytklee.tistory.com 이사갑니다. 옮겨지는 게시글은 비공개 처리합니다.

0개의 댓글

관련 채용 정보