[프로그래머스] SQL 01.

yoong·2023년 6월 14일

7. SQL

목록 보기
4/5

01.여러 기준으로 정렬하기

Probem

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

Answer

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

Memo

02. 상위 n개 레코드

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

Answer

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME LIMIT 1

Memo
1.보호시작일 순으로 정렬
2.LIMIT를 이용하여 1개만 출력

03.조건에 맞는 회원수 구하기

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

Answer

SELECT COUNT(USER_ID) FROM USER_INFO
WHERE JOINED like '2021%' 
AND AGE >= 20 
AND AGE <= 29

Memo
1. Count로 SELECT
2. 2021년 가입한 회원
3. 20세 이상
4. 29세 이하

04.가격이 제일 비싼 식품의 정보 출력하기

Probem

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

Answer

#방법1
SELECT * FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1
#방법2
SELECT * FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

Memo

  • LIMIT으로 제한하는 방법(방법1)
  • 서브쿼리로 MAX값 구하는 방법(방법2)

05.최댓값 구하기

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

Answer

#방법1
SELECT DATETIME FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1
#방법2
SELECT DATETIME FROM ANIMAL_INS
WHERE DATETIME IN (SELECT MAX(DATETIME) FROM ANIMAL_INS)

Memo

06.동물 수 구하기

Probem
동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

Answer

SELECT COUNT(ANIMAL_ID) FROM ANIMAL_INS;

Memo

  • name의 경우 null값이 존재하여 ANIMAL_ID값으로 가져왔는데 COUNT(*)로 가져오는게 더 깔끔할 듯

07.

Probem
동물 보호소로 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다

Answer

SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS;

Memo

08.저자 별 카테고리 별 매출액 집계하기(다시)

Probem
2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.

Answer

SELECT 
A.AUTHOR_ID,
A.AUTHOR_NAME,
B.CATEGORY,
SUM(BS.SALES * B.PRICE) AS TOTAL_SALES 
FROM AUTHOR A

INNER JOIN BOOK B ON A.AUTHOR_ID = B.AUTHOR_ID
INNER JOIN BOOK_SALES BS ON B.BOOK_ID = BS.BOOK_ID
WHERE BS.SALES_DATE >= '2022-01-01'
AND BS.SALES_DATE < '2022-02-01'
GROUP BY A.AUTHOR_ID, A.AUTHOR_NAME,B.CATEGORY
ORDER BY A.AUTHOR_ID ASC,B.CATEGORY DESC;

Memo

09.이름이 있는 동물의 아이디

Probem
동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

Answer

방법1
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NOT NAME = 'NULL'
방법2
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL

Memo

10.NULL 처리하기

Probem
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.

Answer

SELECT ANIMAL_TYPE,IFNULL(NAME,'No name'),SEX_UPON_INTAKE FROM ANIMAL_INS

Memo

  • IFNULL로 NULL값을 'No name'으로 대체

11.나이 정보가 없는 회원 수 구하기

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

Answer

SELECT COUNT(*) FROM USER_INFO
WHERE AGE IS NULL

Memo

12.강원도에 위치한 생산공장 목록 출력

Probem
FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.

Answer

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

Memo

13.경기도에 위치한 식품창고 목록 출력

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

Answer

SELECT WAREHOUSE_ID,WAREHOUSE_NAME,ADDRESS,IFNULL(FREEZER_YN,'N') 
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '경기%'
ORDER BY WAREHOUSE_ID ASC

Memo

14. 이름이 없는 동물의 아이디

Probem
동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

Answer

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID

Memo

15. 가장 비싼 상품 구하기

Probem
PRODUCT 테이블에서 판매 중인 상품 중 가장 높은 판매가를 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 MAX_PRICE로 지정해주세요.

Answer

SELECT MAX(PRICE) AS MAX_PRICE FROM PRODUCT

Memo

16. 흉부외과 또는 일반외과 의사 목록 출력하기

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

Answer

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;

Memo

17.12세 이하인 여자 환자 목록 출력하기

Probem
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

Answer

SELECT PT_NAME,PT_NO,GEND_CD,AGE,IFNULL(TLNO,'NONE') AS TLNO FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

Memo

18.평균 일일 대여 요금 구하기

Probem
CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

Answer

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE  FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV"

Memo

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

Probem
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.

Answer

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

Memo

  • join 연습 더하기!

20.자동차 대여 기록에서 장기/단기 대여 구분하기(다시)

Probem

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

Answer

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) < 29 THEN '단기 대여' 
ELSE '장기 대여'
END AS RENT_TYPE

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

WHERE START_DATE LIKE '2022-09-%' 
ORDER BY HISTORY_ID DESC;

Memo

#오라클정답 참고
SELECT  HISTORY_ID
     ,  CAR_ID
     ,  TO_CHAR(START_DATE, 'YYYY-MM-DD')   AS START_DATE
     ,  TO_CHAR(END_DATE, 'YYYY-MM-DD')    AS END_DATE
     ,  CASE WHEN TO_DATE(TO_CHAR(END_DATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') - TO_DATE(TO_CHAR(START_DATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') >= 29 THEN '장기 대여'
             ELSE '단기 대여'
        END     AS RENT_TYPE
  FROM  CAR_RENTAL_COMPANY_RENTAL_HISTORY
 WHERE  TO_CHAR(START_DATE, 'YYYYMMDD') LIKE '202209%'
 ORDER BY HISTORY_ID DESC
 ;

21.조건에 부합하는 중고거래 댓글 조회하기(다시)

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

Answer

SELECT A.TITLE,A.BOARD_ID,B.REPLY_ID,B.WRITER_ID,B.CONTENTS,DATE_FORMAT(B.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE 
FROM USED_GOODS_BOARD A

INNER JOIN USED_GOODS_REPLY B ON A.BOARD_ID = B.BOARD_ID
WHERE A.CREATED_DATE LIKE '2022-10-%' # MONTH(A.CREATED_DATE) = 10
ORDER BY B.CREATED_DATE ASC, A.TITLE ASC

Memo

  • 댓글작성일/게시글생성일 잘 파악하기!

Congrats!

레벨 1 다풀었다 히히...

profile
데이터와 이미지로 세상을 공부하는 중입니다 :)

0개의 댓글