본문 바로가기
(문제풀이)

프로그래머스 (Oracle) LV.1 문제풀이

by cogito-new 2022. 10. 20.

프로그래머스 데이터베이스 (oracle) Lv1 문제풀이 모음

  • 정답률 순서에 따라 문제를 나열했습니다(변동 있음)
  • 문제 답안은 더보기 클릭하면 보입니다.
  • 풀이 방식은 다를 수 있습니다.

아픈 동물 찾기.

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id, name)

(2) from : 참조할 테이블 (animal_ins)

(3) where 조건 : 아픈 동물 (intake_condition = sick)

(4) 정렬 order by : animal_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

select animal_id, name
from animal_ins
where intake_condition = 'Sick'
order by animal_id asc;

 


동물의 아이디와 이름.

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id, name)

(2) from : 참조할 테이블 (animal_ins)

(3) where 조건 : 없음

(4) 정렬 order by : animal_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

SELECT animal_id, name 
from animal_ins
order by animal_id asc;

 


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

 

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id)

(2) from : 참조할 테이블 (animal_ins)

(3) where 조건 : 이름이 있어야 하므로 이름 중, null 을 제외 (is not null)

→ null의 경우 != 가 아닌 is null // is not null 사용해야 함.

(4) 정렬 order by : animal_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

SELECT animal_id
from animal_ins
where name is not null
order by animal_id asc;

 


상위 n개 레코드

풀이 : 

더보기

(1) Select : 조회할 열 (name)

 → 아래 틀린 답이 존재했기 때문에 from에서 데이터를 조건에 맞게 가져올 수 있도록 서브쿼리를 사용

(2) from : 서브쿼리 (animal_ins 테이블에서 datetime으로 정렬한 테이블의 행 중,  name열을 return

(3) where : rownum =1, 첫번째로 가져온 데이터만 출력하도록 조건 지정 (문제의 조건) 

 

select name
from (
    select name
    from animal_ins
    order by datetime
)
where rownum = 1;

 

→다른 방법 : 서브 쿼리를 where 에 사용할 수도 있다.(from 으로 가져온 데이터 들에서 where로 조건을 지정.

datetime = ( animal_ins 테이블에서 가장 작은 datetime을 가져온다.) →최소값이므로 return 값은 하나.

select name
from animal_ins
where datetime = (
        select min(datetime)
        from animal_ins
    );

 틀린 답 : from 을 통해 animal_ins에서 name열의 데이터를 오라클 내부 로직에 의해 가져오고

이후 order by에 의해 정렬되기 때문에 rownum = 1로 지정하더라도 다른 결과가 나온다.

select name
from animal_ins
where rownum = 1
order by datetime;

 


여러 기준으로 정렬하기

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id, name, datetime)

(2) from : 참조할 테이블 (animal_ins)

(3) 정렬 order by : name을 우선 오름차순으로 정렬하고  (명시하지 않으면 자동으로 오름차순 정렬)

     이후, datetime을 내림차순으로 정렬한다.

 

SELECT animal_id, name, datetime
from animal_ins
order by name, datetime desc;

 


어린 동물 찾기

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id, name)

(2) from : 참조할 테이블 (animal_ins)

(3) where 조건 : 젊은 동물의 아이디를 조회해야 하므로 != (not equal)을 이용해 나이든 동물을 제외.

(4) 정렬 order by : animal_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

 

SELECT animal_id, name
from animal_ins
where intake_condition != 'Aged'
order by animal_id asc;

 


역순 정렬하기

풀이 : 

더보기

(1) Select : 조회할 열 (name, datetime)

(2) from : 참조할 테이블 (animal_ins)

(3) 정렬 order by : animal_id 내림차순으로

select name, datetime
from animal_ins
order by animal_id desc;

 


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

 

풀이 : 

더보기

(1) Select : 집계함수를 사용해 테이블에서 해당하는 값 하나로 리턴해야 한다. 

(2) from : 참조할 테이블 (user_info)

(3) where : age가 null인 값

 → count 집계함수에서 열을 지정하면 null 인 경우에 개수가 세어지지 않는다.

따라서, * 를 사용해 행 전체를 가져와서 (집계함수이므로 특정 열이 아니어도 됨) 행의 개수를 return한다.

(4) alias를 사용해 열의 명칭을 지정한다.

select count(*) as users
from user_info 
where age is null;

 


이름이 없는 동물의 아이디

 

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id)

(2) from : 참조할 테이블 (animal_ins)

(3) where 조건 : 이름이 있어야 하므로 이름 중, null 을 제외 (is not null)

(4) 정렬 order by : animal_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

 

select animal_id
from animal_ins
where name is null
order by animal_id;

 


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

풀이 : 

더보기

(1) Select : 조회할 열 (factory_id, factory_name, address)

(2) from : 참조할 테이블 (food_factory)

(3) where 조건 : 강원도를 포함해야 하므로 (%문자열%) 을 사용하여 해당 데이터가 %안의 문자열을 포함하는 값으로 조건을 설정.

(4) 정렬 order by : factory_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

SELECT factory_id, factory_name, address
from food_factory
where address like '강원도%'
order by factory_id;

 


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

풀이 : 

더보기

(1) Select : 조회할 열 (warehouse_id, warehouse_name, address, freezer_yn

(2) NVL 을 사용해 해당 열에서 Null인 경우 → 'N'으로 반환 하도록 지정해준다.

(NVL2도 있음.)

(3) from : 참조할 테이블 (food_warehouse)

(4) where 조건 : 경기도를 포함해야 하므로 (%문자열%) 을 사용하여 해당 데이터가 %안의 문자열을 포함하는 값으로 조건을 설정.

(5) 정렬 order by : warehouse_id 오름차순으로. (asc 명시하지 않아도 정렬 됨)

SELECT warehouse_id, warehouse_name, address, NVL(freezer_yn, 'N')
from food_warehouse
where address like '%경기도%'
order by warehouse_id;

 


조건에 맞는 회원 수 구하기

풀이 : 

더보기

(1) Select : 조건에 해당하는 age를 가진 행 수를 집계함수를 사용해 return

(2) from : 참조할 테이블 (user_info)

(3) where 조건 : 20 <= age<=29 , between 사용하지 않고 and를 두번 사용해도 됨. 

     두 번째 조건으로는 joined 열에서 2021년 가입자만 return하도록 함.

select count(age)
from user_info
where age between 20 and 29 and
    joined like '2021%';

 


가장 비싼 상품 구하기

풀이 : 

더보기

(1) Select : 집계함수를 사용해 한 개의 값만 return

(2) alias를 사용하여 리턴 열의 이름을 max_price로 지정

(3) from : 참조할 테이블 (product)

SELECT max(price) as max_price
from product;

 


모든 레코드 조회하기

풀이 : 

더보기

(1) Select : 조회할 열 (animal_id, animal_type, datetime, intake_condition, name, sex_upon_intake)

(2) from : 참조할 테이블 (animal_ins)

(3) 정렬 order by : animal_id오름차순으로. (asc 명시하지 않아도 정렬 됨)

select animal_id, animal_type, datetime, intake_condition, name, sex_upon_intake
from animal_ins
order by animal_id;

 


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

 

풀이 : 

더보기

(1) Select : pt_name, pt_no, gend_cd, age, tlno 

(2) tlno 에서 null 값을 NONE으로 표시하고, 열의 이름은 tlno로 지정

(3) from : 참조할 테이블 (patient)

(4) order by : age로 내림차순 정렬 후, 환자 번호 오름차순

select  pt_name, pt_no, gend_cd, age, nvl(tlno, 'NONE') as tlno
from patient
where age <= 12 and gend_cd = 'W'
order by age desc, pt_no;

 


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

풀이 : 

더보기

(1) Select : to_char를 이용해서 날짜의 표시 형태를 변경해주면 됨.

(2) where 조건을 이용해서 CS, GS에 해당하는 결과만 반환

(3) hire_ymd 를 내림차순 정렬 후, 같은 날짜라면 dr_name으로 오름차순 정렬

SELECT dr_name, dr_id, mcdp_cd, to_char(hire_ymd, 'YYYY-MM-DD')
from doctor
where mcdp_cd in ('CS', 'GS')
order by hire_ymd desc, dr_name;

 


최댓값 구하기

풀이 : 

더보기

(1) where에서 정렬 전에 메모리에 데이터를 가져오기 때문에 서브쿼리를 사용하지 않는다면 rownum 지정시 다른 결과가 return 된다.

(2) 서브 쿼리를 사용해서 animal_ins 테이블에서 datetime을 내림차순으로 정렬해서 가져온다.

(3) rownum =1, 즉 첫번째 값만 가져온다.

select datetime
from (
    select datetime
    from animal_ins
    order by datetime desc
)
where rownum = 1;

평균 일일 대여 요금 구하기

풀이 : 

더보기

(1) 집계함수 사용하여 결과값 평균 구하기

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
GROUP BY CAR_TYPE

과일로 만든 아이스크림 구하기

풀이 : 

더보기

(1) JOIN 조건 flavor(primary key) 사용하여 테이블 연결

(2) 문제 주어진 조건인 총 주문량 >= 3000

      아이스크림 베이스 : 과일 조건 추가

(3) 기본이 내림차순이지만, 명확하게 하기 위해 정렬 조건 추가

SELECT FH.FLAVOR
FROM FIRST_HALF FH, ICECREAM_INFO II
WHERE FH.FLAVOR = II.FLAVOR
  AND FH.TOTAL_ORDER >= 3000
  AND II.INGREDIENT_TYPE = "fruit_based"
ORDER BY TOTAL_ORDER DESC

 

-> 다른 답안과 비교하며 공부할 만한 사항

EXISTS 절 사용

SELECT FH.FLAVOR
FROM FIRST_HALF FH
WHERE 1=1 
  AND EXISTS (
    SELECT 1 FROM ICECREAM_INFO II
     WHERE FH.FLAVOR = II.FLAVOR
       AND II.INGREDIENT_TYPE = 'fruit_based'
      )
  AND FH.TOTAL_ORDER > 3000
ORDER BY FH.TOTAL_ORDER DESC;

 

반응형