Oracle&Mysql

프로그래머스 SQL (OracleDB) 연습문제(SELECT)

yoon9 2021. 7. 5. 21:42

프로그래머스에서 제공한 sql문에 대해 학습 및 복습할 겸에 포스팅을 진행합니다.

 

SELECT

1.모든 레코드 조회하기.

 

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME,                                                                   TYPE,                                           NULLABLE

ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

ANIMAL_ID,  ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE

A349996 Cat 2018-01-22 14:32:00 Normal Sugar Neutered Male
A350276 Cat 2017-08-13 13:50:00 Normal Jewel Spayed Female
A350375 Cat 2017-03-06 15:01:00 Normal Meo Neutered Male
A352555 Dog 2014-08-08 04:20:00 Normal Harley Spayed Female

1.)풀이

ID값을 기준으로 Select문을 사용하여 출력만 하면 되기 때문에..

ORDER BY를 사용해준다.

SELECT *

FROM ANIMAL_INS

ORDER BY ANIMAL_ID /*default ASC*/

 

2.역순 정렬하기.(해당 문제TABLE의 구성은 1번과 동일.)

 

동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

NAME,                                    DATETIME

Rocky 2016-06-07 09:17:00
Shelly 2015-01-29 15:01:00
Benji 2016-04-19 13:28:00
Jackie 2016-01-03 16:25:00
*Sam 2016-03-13 11:17:00

2.)풀이

역순으로 정렬을 하기위해 DESC를 사용하고, 보여질 출력문의 컬럼들만 선택하여 출력하면 된다.

SELECT NAME, DATETIME 

FROM ANIMAL_INS 

ORDER BY ANIMAL_ID DESC;

 


3.아픈동물찾기(해당 문제TABLE의 구성은 1번과 동일.)

 

동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID,     ANIMAL_TYPE,    DATETIME,             INTAKE_CONDITION,       NAME,            SEX_UPON_INTAKE

A365172 Dog 2014-08-26 12:53:00 Normal Diablo Neutered Male
A367012 Dog 2015-09-16 09:06:00 Sick Miller Neutered Male
A365302 Dog 2017-01-08 16:34:00 Aged Minnie Spayed Female
A381217 Dog 2017-07-08 09:41:00 Sick Cherokee Neutered Male

이 중 아픈 동물은 Miller와 Cherokee입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_ID                                                             NAME

A367012 Miller
A381217 Cherokee

3.)풀이

where절을 사용하여 해당 컬럼의 일치하는 데이터를 select하면된다.

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

 


4.어린동물찾기(해당 문제TABLE의 구성은 1번과 동일.)

 

동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID,     ANIMAL_TYPE,    DATETIME,             INTAKE_CONDITION,       NAME,            SEX_UPON_INTAKE

A365172 Dog 2014-08-26 12:53:00 Normal Diablo Neutered Male
A367012 Dog 2015-09-16 09:06:00 Sick Miller Neutered Male
A365302 Dog 2017-01-08 16:34:00 Aged Minnie Spayed Female
A381217 Dog 2017-07-08 09:41:00 Sick Cherokee Neutered Male

이 중 젊은 동물은 Diablo, Miller, Cherokee입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_ID                                                           NAME

A365172 Diablo
A367012 Miller
A381217 Cherokee

 

4.)풀이

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

풀이 방식은 위에 3번 문제와 동일합니다.

 

 


5.동물의 아이디와 이름(해당 문제TABLE의 구성은 1번과 동일.)

 

동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

ANIMAL_ID                                                 NAME

A349996 Sugar
A350276 Jewel
A350375 Meo
A352555 Harley
A352713 Gia
A352872 Peanutbutter
A353259 Bj

 

5.)풀이

 

그냥 출력의 컬럼을 ORDER BY로 오름차순으로 출력하면된다...

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID, NAME

 


6.여러가지 기준으로 정렬하기(해당 문제TABLE의 구성은 1번과 동일.)

 

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

예를 들어, ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID,         ANIMAL_TYPE,     DATETIME,            INTAKE_CONDITION,  NAME,     SEX_UPON_INTAKE

A349996 Cat 2018-01-22 14:32:00 Normal Sugar Neutered Male
A350276 Cat 2017-08-13 13:50:00 Normal Jewel Spayed Female
A396810 Dog 2016-08-22 16:13:00 Injured Raven Spayed Female
A410668 Cat 2015-11-19 13:41:00 Normal Raven Spayed Female
  1. 이름을 사전 순으로 정렬하면 다음과 같으며, 'Jewel', 'Raven', 'Sugar'
  2. 'Raven'이라는 이름을 가진 개와 고양이가 있으므로, 이 중에서는 보호를 나중에 시작한 고양이를 먼저 조회합니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_ID,                        NAME,                      DATETIME

A350276 Jewel 2017-08-13 13:50:00
A396810 Raven 2016-08-22 16:13:00
A410668 Raven 2015-11-19 13:41:00
A349996 Sugar 2018-01-22 14:32:00

6.)풀이

NAME컬럼을 오름차순으로 해놓고 DATETIME을 내림차순으로 해놓으면 해당 NAME컬럼의 동일한 값일 경우 ,

나중에 보호를 시작한 DATETIME컬럼의 정렬기준에 대해 만족할 수 있음.

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

 

7.상위 N개 레코드(해당 문제TABLE의 구성은 1번과 동일.)

 

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

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID,      ANIMAL_TYPE,    DATETIME,          INTAKE_CONDITION,    NAME,           SEX_UPON_INTAKE

A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

NAME

Jack

※ 보호소에 가장 먼저 들어온 동물은 한 마리인 경우만 테스트 케이스로 주어집니다.

 

7.)풀이

서브쿼리를 이용하며 , Oracle의 rownum을 이용하여 풀면 된다...

SELECT *
FROM
(SELECT NAME 
 FROM ANIMAL_INS
 ORDER BY DATETIME )
WHERE ROWNUM = 1

이상.....프로그래머스에서 연습문제로 SELECT문 영역의 7문제를 다 풀어보았다

이게 아무래도.. 쉽게 접해본 것들이라 그런지.. 쉽다..

 

 

 

출처

https://programmers.co.kr/learn/challenges