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절에서 원하는 데이터를 조회하여 가상의 집합을 만들어 조인을 수행하거나 가상의 집합을 다시 조회할 때 사용
'SQL' 카테고리의 다른 글
[Oracle] 오라클 시퀀스 ( Sequence ) (0) | 2020.06.07 |
---|---|
[Oracle] 계층형 쿼리 ( Hierarchical Queries ) (0) | 2020.06.07 |
[Oracle] docker sysdba 접속 (0) | 2020.06.07 |
Oracle 기본 함수 :: 날짜함수, 변환함수, decode, case (0) | 2020.05.17 |
Oracle 기본 함수 :: 숫자함수, 문자함수 (0) | 2020.05.17 |