티스토리 뷰

PS

[MySQL] 프로그래머스_SELECT

희철 2023. 4. 2. 04:02

문제

이름 순으로 정렬하고, 이름이 같으면 보호를 나중에 시작한 동물 우선으로

-> 이름은 ASC, 보호 시작일은 DESC

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

 

 

ANIMAL_ID순으로 정렬

-> 단순히 ASC. 안적어도됨

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID

 

 

젊은 동물의 아이디와 이름을 아이디순으로 조회

-> 젊은 동물이란 INTAKE_CONDITION이 Aged가 아닌 것들. Aged는 ''를 이용하여 문자열 처리

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION != 'Aged' ORDER BY ANIMAL_ID

 

 

아픈 동물의 아이디와 이름을 아이디순으로 조회

-> 위와 마찬가지로 INTAKE_CONDITION이 Sick인 것 찾으면됨.

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID

 

 

동물의 이름과 보호시작일을 ANIMAL_ID 역순

-> ORDER BY로 ANIMAL_ID를 DESC로

SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC

 

 

모든 동물의 정보를 ANIMAL_ID순으로

-> *를 이용해 모든 정보 표시

SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID

 

 

강원도에 위치한 공장id, 공장이름, 주소를 조회하는데 공장id를 오름차순으로

-> 강원도에 위치해야하므로 LIKE를 이용해 앞에가 강원도인것을 찾고, 공장id로 정렬

SELECT factory_id, factory_name, address FROM FOOD_FACTORY
    WHERE address LIKE '강원도%' 
    ORDER BY factory_id

 

 

2021년에 출판된 '인문'카테고리에 속하는 도서리스트의 도서id, 출판일 출력. 출판일 기준으로 오름차순

SELECT book_id, DATE_FORMAT(published_date, '%Y-%m-%d') FROM book
    WHERE published_date LIKE '2021%' AND category = '인문'
    ORDER BY published_date

published_date에 시간 정보도 들어있으므로 DATE_FORMAT을 이용하여 변환해줘야함.

 

 

used_goods_board와 used_goods_reply테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 id, 댓글 작성자 id, 댓글내용, 댓글 작성일을 조회. 댓글 작성일을 기준으로 오름차순, 같으면 게시글 제목을 기준으로 오름차순

SELECT 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
    JOIN used_goods_reply R ON R.board_id = B.board_id
    WHERE B.created_date LIKE '2022-10%'
    ORDER BY R.created_date, title

board_id, reply_id, writed_id, contents는 두 개의 테이블에 모두 존재하므로 R, B를 이용하여 구분해주었음. JOIN을 이용하여 board_id가 같은 경우를 나눠주었고, LIKE를 이용하여 2022년 10월에 작성된 것만 모았음.

 

 

총주문량을 기준으로 내림차순, 같다면 출하번호를 기준으로 오름차순

SELECT flavor FROM first_half
    ORDER BY total_order DESC, shipment_id

내림차순은 DESC

 

 

생일이 3월인 여성회원id, 이름, 성별, 생년월일을 조회. 전화번호가 NULL인 경우는 제외하고 회원id 기준으로 오름차순

SELECT member_id, member_name, gender, DATE_FORMAT(date_of_birth, '%Y-%m-%d') FROM member_profile
    WHERE tlno != 'NULL' and gender = 'W' and date_of_birth LIKE '_____03%'
    ORDER BY member_id

전화번호가 NULL이라길래 그냥 NULL이라했는데 'NULL'이라고 해야함.

 

 

총주문량이 3000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛 조회. 총주문량이 큰 순서대로

SELECT F.flavor FROM first_half F
    JOIN icecream_info I ON I.flavor = F.flavor
    WHERE F.total_order > 3000 AND I.ingredient_type = 'fruit_based'
    ORDER BY F.total_order DESC

상반기 아이스크림 총 주문량이 3000넘는 것을 구해야하지만 아이스크림의 flavor가 fruit_based여야함. 

 

 

12세 이하의 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회. 전화번호가 없는 경우엔 'NONE'출력. 나이를 기준으로 내림차순, 같다면 환자이름을 기준으로 오름차순

SELECT pt_name, pt_no, gend_cd, age, IFNULL(tlno,'NONE') FROM PATIENT
    WHERE age <= 12 AND gend_cd = 'W'
    ORDER BY age DESC, pt_name

12세 이하, 여자는 WHERE절을 이용해서 구현. 전화번호가 없는 경우엔 'NONE'을 출력해야하므로 IFNULL(A,B)사용. 그래서 tlno가 NULL이라면 B의 값인 'NONE'출력

 

 

진료과가 cs이거나 gs인 의사의 이름, 의사 id, 진료과, 고용일자 조회. 고용일자 기준으로 내림차순, 같다면 이름을 기준으로 오름차순

SELECT dr_name, dr_id, mcdp_cd, DATE_FORMAT(hire_ymd,'%Y-%m-%d') FROM doctor
    WHERE mcdp_cd = 'cs' OR mcdp_cd = 'gs'
    ORDER BY hire_ymd DESC, dr_name

 

 

자동차종류가 'SUV'인 자동차들의 평균 일일 대여 요금 출력. 소수 첫째자리에서 반올림하고 컬럼명은 AVERAGE_FEE

SELECT ROUND(AVG(daily_fee)) AS AVERAGE_FEE FROM car_rental_company_car
    WHERE car_type = 'SUV'

car_type으로 분류하고 ROUND로 AVG(daily_fee)를 반올림함. ROUND에서 두 번째 파라미터에 아무것도 안적으면 0이므로 소수 첫째자리에서 반올림한다는 의미임.

그리고 AS를 이용해 컬럼명 지정

 

 

서울에 위치한 식당들의 식당 id, 식당 이름, 음식 종류, 즐겨찾기 수, 주소, 리뷰 평균 점수 조회. 리뷰 평균점수는 소수 세 번째 자리에서 반올림, 평균점수 기준으로 내림차순, 같으면 즐겨찾기 수를 기준으로 내림차순

SELECT I.rest_id, rest_name, food_type, favorites, address, ROUND(AVG(R.review_score),2) AS score
    FROM rest_info I
    JOIN rest_review R ON I.rest_id = R.rest_id
    WHERE address LIKE '서울%'
    GROUP BY I.rest_id
    ORDER BY score DESC, favorites DESC

rest_id에 대해서 이 rest_id와 같은 rest_id를 가진 review데이터와 JOIN함. 각 아이디별로 리뷰가 여러 개일 것임. GROUP BY로 나눠주면 각 아이디별로 여러 개의 review값을 갖게 될거임. rest_info는 rest_id별로 하나의 행만 있음. 그렇기때문에 GROUP으로 묶지 않는 다면 값이 하나만 나올 거임.

 

 

동일한 회원이 동일한 상품을 재구매한 데이터를 통해 회원 id와 상품id 출력. 회원id를 기준으로 오름차순, 같으면 상품 id를 기준으로 내림차순

SELECT user_id, product_id FROM online_sale
    GROUP BY user_id, product_id
    HAVING COUNT(*) > 1
    ORDER BY user_id, product_id DESC

user_id와 product_id가 모두 같아야하므로 그룹으로 묶었음. 그룹으로 묶은 이후 필터링을 하기 위해 HAVING을 이용하였고 COUNT가 2이상인 것만 추림

 

 

Online_sale과 offline_sale테이블을 합쳐서 2022년 3월 판매 데이터의 판매날짜, 상품id, 유저id, 판매량 출력. offline_sale의 user_id는 NULL, 판해일, 상품id, 유저id 오름차순 정렬

SELECT DATE_FORMAT(sales_date, '%Y-%m-%d') AS sales_date, product_id, user_id, sales_amount FROM online_sale
WHERE sales_date LIKE '2022-03%'
UNION
SELECT DATE_FORMAT(sales_date, '%Y-%m-%d') AS sales_date, product_id, NULL AS user_id, sales_amount FROM offline_sale
WHERE sales_date LIKE '2022-03%'
ORDER BY sales_date, product_id, user_id

우선 online_sales의 데이터를 출력할 컬럼별로 구한 뒤에 UNION을 이용해 뒤의 테이블과 합치도록 하였음. 이때, offline_sales는 user_id가 없기때문에 그냥하면 오류남. 그래서 user_id를 NULL로 넣어주었음.

각각 WHERE를 이용해서 2022년 3월 데이터만 필터링했음.

 

댓글
최근에 올라온 글
Total
Today
Yesterday