SELECT

 


 

 

[ 문제: 여러 기준으로 정렬하기 ]

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

 

 

[ Query ]

select animal_id, name, datetime
from animal_ins
order by name asc, datetime desc

 

[ 해설 ]

여러 개의 order by를 사용할 경우 왼쪽부터 순차적으로 진행

order by A asc, B desc

A로 오름차순 정렬을 하고, 만약 같은 값이 있다면 B로 내림차순 정렬

 


 

[ 문제: 상위 n개 레코드 ]

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

 

 

[ 1차 Query ]

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

 

[ 문제점 ]

위 쿼리가 실행되는 순서는 from - where - select - order by

따라서 order by 이전에 rownum이 할당되어서 정렬 되지 않음

 

 

[ 최종 Query ]

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

 

[ 개념 정리 ]

 

  • rownum이란?

오라클에서 지원하는 가상 컬럼으로, 쿼리의 결과에 1부터 하나씩 증가하여 붙는 컬럼

 

  • 사용 용도

수행한 쿼리문에서 여러개의 결과가 출력될 때, 결과의 개수를 제한하여 가져오기 위해 사용

단, rownum은 1부터 순서대로 붙기 때문에 'rownum = 2' 나 'rownum > 1'과 같은 방식으로는 사용할 수 없음

 

  • 유의점

order by와 함께 사용할 경우, order by절의 실행 순서는 where 절 실행 후이므로 order by절을 내부 쿼리에서 실행해야 함.

 


 

GROUP BY

 


 

 

[ 문제: 동명 동물 수 찾 ]

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

 

 

[ Query ]

select name, count(name) count
from animal_ins
where name is not null
group by name
having count(name) > 1
order by name;

 

[ 개념 정리 ]

  • HAVING 절

GROUP BY절에서 집계함수를 가지고 조건비교 할 때 사용 ( WHERE절에서는 집계함수를 사용할 수 없다 )

 

  • ORDER BY는 가장 바깥쪽에 작성
  • GROUP BY 자체가 ORDER BY와 같은 기능 ( 순차가 같으면 생략 가능 )

 


 

 

[ 문제: 입양 시각 구하기(1) ]

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 9시부터 19시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

 

[ Query ]

 

SELECT T.HOUR HOUR, COUNT(*) COUNT
FROM (
    SELECT TO_CHAR(DATETIME, 'HH24') HOUR
    FROM ANIMAL_OUTS
) T
WHERE T.HOUR BETWEEN 9 AND 19
GROUP BY T.HOUR
ORDER BY T.HOUR

 

[ 개념 정리 ]

 

1. TO_CHAR

 

날짜나 숫자를 문자열로 바꾸는 함수

DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE의 데이터 타입을 사용자가 지정한 폼을 갖는 VARCHAR2의 데이터 타입으로 변환한다.

 

기본적인 사용법은 TO_CHAR(날짜 또는 숫자, [형식])

 

  • 숫자

9: 숫자지만, 빈자리를 공백으로 채움

0: 숫자지만, 빈자리를 0으로 채움

, : 천 단위의 콤마

. : 소숫점

 

 

e.g.)

SELECT TO_CHAR(12345, '00000000') FROM DUAL

result)

00012345

 

  • 날짜

YYYY : 년

RRRR : 년

 

RR: SYSDATE를 기준으로 ROUND한 년도

시스템 상 날짜가 2020년일 때

50년을 기준으로 작으면 '20', 크거나 같으면 '19' 붙음

TO_CHAR('140101', 'rrmmdd') -> 2014-01-01

TO_CHAR('950101' , 'rrmmdd') -> 1995-01-01

 

MM : 월

DD : 일

HH : 시간 (12시)

HH24 : 시간 (24시)

MI : 분

SS : 초

 

 

2. Inline View

 

FROM절에 사용하는 Sub Query

Alias를 붙여주어 하나의 테이블처럼 사용 가능

FROM절에서 원하는 데이터를 조회하여 가상의 집합을 만들어 조인을 수행하거나 가상의 집합을 다시 조회할 때 사용

복사했습니다!