프로그래머스 데이터베이스 (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;
'(문제풀이)' 카테고리의 다른 글
백준 11728_배열 합치기 (0) | 2023.06.05 |
---|---|
프로그래머스(java) : 음양 더하기 (0) | 2022.11.15 |
프로그래머스 (java) : 약수의 개수와 덧셈 (0) | 2022.10.19 |
프로그래머스(java) : 숫자 문자열과 영단어 (0) | 2022.10.19 |
프로그래머스(java) : 부족한 금액 계산하기 (0) | 2022.10.19 |