[프로그래머스] SELECT 문제풀이

2023. 10. 23. 20:51CS Life/Database

Programmers SQL

Hackerrank

0.

1. 재구매가 일어난 상품과 회원 리스트 구하기

SELECT USER_ID, PRODUCT_ID  FROM ONLINE_SALE GROUP BY USER_ID, PRODUCT_ID  

Where 절은 굳이 쓰지 않음
ONLINE_SALE 테이블에서 → FROM ONLINE_SALE

동일한 회원이 동일한 상품을 재구매한 데이터를 구하여,
WHERE절 사용하지 않는다 GROUP BY USER_ID, PRODUCT_ID 로 그룹 묶은 다음
GROUP BY
GROUP BY USER_ID, PRODUCT_ID HAVING count(*) > 1`

재구매한 회원 ID와 재구매한 상품 ID를 출력 SELECT USER_ID, PRODUCT_ID

하는 SQL문을 작성해주세요.
결과는 회원 ID를 기준으로 오름차순 정렬해주시고 ``
회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.
ORDER BY USER_ID ASC, PRODUCT_ID DESC

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

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

[!NOTE]
Attribute 에 대한 조건을 넣고 싶을 때 WHERE 절 사용

[!tip]
문자열에 대해서 ‘강원도%’ → 강원도 + 다른 문자열 형태

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

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

SELECT  b.title, b.board_id, r.reply_id, r.writer_id, r.contents,          DATE_FORMAT(r.created_date,'%Y-%m-%d') FROM used_goods_board b, used_goods_reply r   WHERE b.board_id = r.board_id AND b.created_date LIKE "2022-10%" ORDER BY r.created_date ASC, b.title ASC;  
  • DATE_FORMAT 으로 format 맞춰주기
  • WHERE 절로 조건 추가 가능
  • 이름이 같은 열이 등장할 경우 각 테이블의 이름을 지정하고 접근해줄 것

4. 조건에 맞는 도서 리스트 출력하기

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

SELECT book_id, DATE_FORMAT(published_date, "%Y-%m-%d") FROM book  WHERE DATE_FORMAT(PUBLISHED_DATE, '%Y') = '2021' AND category LIKE "인문" ORDER BY published_date ASC 
  • 기간의 경우 DATE_FORMAT 사용해서 맞춰줘도 되고 기간을 범위로 잡고 해도 된다

5. 12세 이하인 여자 환자 목록 출력하기

 IFNULL(tlno, "NONE") as tlno  

NULL 인 값을 다른 출력으로 만들고 싶을 경우 위와 같은 IFNULL 함수를 사용해서 코드를 작성

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

SELECT ROUND(AVG(daily_fee)) as AVERAGE_FEE  FROM car_rental_company_car WHERE car_type LIKE "SUV" 

Round 함수 = 반올림 하는 함수 round(a,b) → b 는 소수 몇자리

[!note]
ROUND(숫자(컬럼), (반올림 기준))
숫자(컬럼) : 반올림할 대상 숫자
반올림 기준 : 소수점 자릿 수 지정(필수 아님)
지정하지 않을 경우 소수점 첫번째 자리를 사용한다.

기존 항목에서 조정한 변수를 사용할 경우 as 를 통해 정의할 수 있다.

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

  • Inner Join 방식 사용
SELECT DISTINCT b.flavor  FROM FIRST_HALF a, ICECREAM_INFO b WHERE a.flavor = b.flavor  AND a.total_order > 3000  AND b.ingredient_type LIKE "fruit%" ORDER BY a.total_order DESC; 

Inner join 방식으로 겹치는 부분을 출력하려면 조건에 같은 속성을 같다고 하는 논리연산자를 하나 넣어서 조건을 만들어 줘야함

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

SELECT dr_name, dr_id, mcdp_cd, DATE_FORMAT(hire_ymd, "%Y-%m-%d")  FROM doctor  WHERE mcdp_cd LIKE "CS" OR mcdp_cd LIKE "GS" ORDER BY hire_ymd DESC, dr_name ASC; 
  • Date_format 함수 기억하기!!!

9. 3월에 태어난 여성 회원 목록 출력하기

SELECT member_id, member_name, gender, DATE_FORMAT(date_of_birth, "%Y-%m-%d") FROM member_profile  WHERE date_of_birth LIKE "%03%" AND TLNO IS NOT NULL AND GENDER LIKE "W" ORDER BY member_id ASC; 

IS NOT NULL 생각하고 조건 제대로 다 넣기

10. 모든 레코드 조회하기

SELECT *  FROM ANIMAL_INS  ORDER BY animal_id ASC 

11. 역순 정렬하기

SELECT name, datetime  FROM animal_ins  ORDER BY animal_id DESC; 

12. 아픈 동물 찾기

SELECT animal_id, name  FROM animal_ins WHERE INTAKE_CONDITION LIKE 'sick' ORDER BY animal_id asc; 

13. 어린 동물 찾기

SELECT animal_id, name  FROM animal_ins WHERE intake_condition != 'Aged' ORDER BY animal_id asc; 

아닌 경우 != 쓰기

14. 동물의 아이디와 이름

SELECT animal_id, name  FROM animal_ins 

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

SELECT animal_id, name, datetime  FROM animal_ins  ORDER BY name, datetime DESC ; 

기본 정렬 출력 : asc
desc 은 조건 걸기

16. 상위 n개 레코드

SELECT name  FROM animal_ins  ORDER BY datetime limit 1 ; 

top-n 개 고를 떄 Limit 써서 주기

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

SELECT count(user_id) as USERS FROM user_info  WHERE joined LIKE "2021%" AND age between 20 and 29; 
SELECT COUNT(USER_ID) AS USERS FROM USER_INFO  WHERE DATE_FORMAT(JOINED, '%Y') = '2021' AND AGE BETWEEN 20 AND 29 

개수 셀때는 count() 함수 사용하기

18. 서울에 위치한 식당 목록 출력하기

SELECT      INFO.REST_ID     , INFO.REST_NAME     , INFO.FOOD_TYPE     , INFO.FAVORITES     , INFO.ADDRESS     , SCORE_BY_REST.SCORE FROM     REST_INFO INFO     , (         SELECT REST_ID, ROUND(AVG(REVIEW_SCORE),2) SCORE          FROM REST_REVIEW         GROUP BY REST_ID     ) SCORE_BY_REST WHERE      INFO.REST_ID = SCORE_BY_REST.REST_ID     and ADDRESS LIKE '서울%' ORDER BY     SCORE_BY_REST.SCORE DESC     , INFO.FAVORITES DESC ; 

FROM 절로 가져올 목록을 설정해서 만들어 놓기

19. 오프라인/온라인 판매 데이터 통합하기

(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT FROM OFFLINE_SALE  WHERE DATE_FORMAT(SALES_DATE, '%m') = '03')  UNION ALL  (SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE WHERE DATE_FORMAT(SALES_DATE, '%m') = '03') ORDER BY SALES_DATE, PRODUCT_ID, USER_ID; 

NULL AS USER_ID



“이 글은 Obsidian 에서 작성되어 업로드 되었습니다”

'CS Life > Database' 카테고리의 다른 글

WHERE-HAVING 절 차이  (0) 2023.10.25
Week 5 - Introduction to SQL (1)  (0) 2023.10.24
Week 7 - Intermediate SQL  (1) 2023.10.21
Week 6 - Introduction to SQL (2)  (0) 2023.10.21
Week 3 - Introduction to Relation Model  (0) 2023.10.20