ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는
각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.
-> animal_outs.animal_id = animal_ins.animal_id
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요.
-> animal_outs.date - animal_ins.date 해서 큰 2개의 데이터를 가지고 오면 된다
즉 두개의 테이블에서 date를 뺀 값을 desc한다
--> 별칭은 from에서 지정해 준다
--> from, group by, having, order by, select 순서대로 읽기 때문에 from에 지정하면 뒤에서 사용 가능
--> from -> connect by -> where -> group by -> having -> select -> order by 순서대로 작동된다
--> 그래서 select에서 별칭을 지정하면 having절에서 사용할 수 없다
--> 왜냐하면 구동되는 순서가 having이 먼저이기 때문에 having에선 select에서 정한 별칭이 없기 때문이다
1단계 시간을 뺀 값이 큰 순서대로 정렬하기 (외래키 사용)
select animal_outs.animal_id, animal_outs.animal_name, animal_outs.date - animal_ins.date as time
from animal_outs , animal_ins
where animal_out.animal_id = animal_ins.animal_id
order by time desc;
2단계 테이블에 별칭을 주어 간결하게 만들기
select a.animal_id, a.animal_name, a.date - b.date as time
from animal_outs a , animal_ins b
where a.animal_id = b.animal_id
order by time desc;
3단계 rownum으로 3이하인 row를 출력한다(서브 쿼리를 사용해서 정렬한 내용에서 가져오고 싶은 부분을 자른다)
select a.animal_id, a.name
from (select a.animal_id, a.name, a.datetime - b.datetime as time
from animal_outs a , animal_ins b
where a.animal_id = b.animal_id
order by time desc)a
where rownum < 3;