SQL LV1 - Programmers

청수동햄주먹·2023년 6월 12일
0

SQL 공부

목록 보기
2/8

발등에 불이 떨어졌다.
5일만에 sql 다시(?) 익숙해지기

LV1_24문제

아픈 동물 찾기

SELECT  ANIMAL_ID, NAME
FROM    ANIMAL_INS
WHERE   INTAKE_CONDITION IN('Sick')
ORDER BY ANIMAL_ID
  • INTAKE_CONDITION = 'Sick'이라고 해도 됨

어린 동물 찾기

SELECT      ANIMAL_ID, NAME
FROM        ANIMAL_INS
WHERE       INTAKE_CONDITION NOT IN ('Aged')
ORDER BY    ANIMAL_ID
  • NOT IN

여러 기준으로 정렬하기

동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요.
단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
  • order by multiple columns
    , comma 로 나열한다.
  • 나중에 였다는거~
    ↳ desc 최근 순으로 나열. example 잘보기

상위 n개 레코드

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

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

# 문제의 의도가 where 대신 정렬시 리밋으로 처리하는 것이 맞아보인다.
ORDER BY DATETIME LIMIT 1
  • LIMIT
    정렬후 갯수를 설정해 줄 수 있다.

최댓값 구하기

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

SELECT  MAX(DATETIME)
FROM    ANIMAL_INS

강원도에 위치한 생산공장 목록

SELECT  FACTORY_ID, FACTORY_NAME, ADDRESS
FROM    FOOD_FACTORY
WHERE   ADDRESS like '%강원도%'
ORDER BY FACTORY_ID ASC

경기도에 위치한 식품창고 목록

  1. 테이블에서 경기도에 위치한 창고의
  2. ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 3. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고
  3. 결과는 창고 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

# coalesce
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, COALESCE(FREEZER_YN, 'N') AS FREEZER_YN
  • COALESCE
    NULL값을 다른 명칭으로 바꾸어주는 함수
  • CASE
  CASE
      WHEN condition1 THEN result1
      WHEN condition2 THEN result2
      ELSE result
  END;

조건에 맞는 회원수 구하기

  1. 2021년에 가입한 회원 중
  2. 나이가 20세 이상 29세 이하인 회원이
  3. 몇 명인지 출력하는 SQL문을 작성해주세요.
SELECT  COUNT(*) AS USERS
FROM    user_info
WHERE   date_format(JOINED, "%Y") = 2021
        && AGE between 20 and 29
  • "%Y"
    소문자로 하면 안됨!
  • between
    • The values can be numbers, text, or dates

과일로 만든 아이스크림 고르기

WITH T1 AS(
    SELECT * 
    FROM FIRST_HALF 
    WHERE TOTAL_ORDER > 3000
), T2 AS(
    SELECT * 
    FROM ICECREAM_INFO
    WHERE INGREDIENT_TYPE = 'fruit_based'
)

select  T1.FLAVOR
from T1
JOIN T2 on T1.FLAVOR = T2.FLAVOR
ORDER BY TOTAL_ORDER desc

# 
SELECT T1.FLAVOR
FROM FIRST_HALF T1
JOIN ICECREAM_INFO T2
ON T1.FLAVOR = T2.FLAVOR
WHERE T1.TOTAL_ORDER > 3000 && T2.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC

자동차 대여 기록에서 장기/단기 대여 구분하기

  1. 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서
  2. 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여
    • +1을 해주어야 빌리는 당일도 포함이 된다는 것..!
  3. 대여기록을 출력하는 SQL문을 작성해주세요.
  4. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
  5. START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.
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') = 2022
        && DATE_FORMAT(START_DATE,'%m') = 09
ORDER BY HISTORY_ID DESC

# 다른 분의 답
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,
    IF(DATEDIFF(END_DATE, START_DATE) +1 >= 30, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE start_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;
  • if (조건문, true 일 경우, false 일 경우) as 새칼럼이름
  • like 맨 뒤의 %: 아무 숫자나 와도 됨 그러나 앞의것은 따라야함

조건에 부합하는 중고거래 댓글 조회

  1. USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서
  2. 2022년 10월에 작성된 게시글 제목 (reply 테이블) , 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요.
  3. 결과는 댓글 작성일(board 테이블) 을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

! 게시글 != 댓글

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 AS B
JOIN    USED_GOODS_REPLY AS R
ON      B.BOARD_ID = R.BOARD_ID
WHERE   DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY CREATED_DATE, TITLE;

B.CREATED_DATE, R.CREATED_DATE 를 정확한 위치에 써야 정답이 된다.


profile
코딩과 사별까지

0개의 댓글