SQL 쿼리문을 작성할 때
SELECT절에서 alias(별칭)를 사용하곤 한다.
하지만, WHERE절은 물론이며 GROUP BY절 등
ORDER BY절을 제외한 모든 곳에서 select절에서 생성한 alias를 활용할 수 없다.
(서브쿼리 등을 사용한 경우를 제외하고)
지금부터 그 이유를 알아보자
[INDEX]
1. ERROR 발생 예시
2. ORDER BY 절에서만 별칭 사용이 가능한 이유
SQL의 기본 코딩 순서
select [컬럼명]
from [테이블명]
where [검색조건]
group by [컬럼명]
having [그룹함수를 이용한 검색조건]
order by [정렬기준 컬럼명] asc/desc;
# having 절에 일반조건을 줘도 실행은 되지만, 느려짐
1. ERROR 발생 예시
1) WHERE절에 별칭(alias) 사용
사원테이블(emp)에서 사원 이름과 입사 연도를 추출하는데,
입사 연도에 별칭(alias)으로 YEAR를 사용했다.
select ename, to_char(hiredate, 'RRRR') as YEAR
from emp;
이제 입사년도가 1981년인 사원에 대한 사원이름과 입사 연도를 추출하는데,
WHERE절에 YEAR를 사용해서 출력해보자
select ename, to_char(hiredate, 'RRRR') as YEAR
from emp
where YEAR = 1981;
SQL Error [904] [42000]: ORA-00904: "YEAR": 부적합한 식별자
위와 같이 [ORA-00904] ERROR가 발생하는 것을 볼 수 있다.
2) GROUP BY 절에서 별칭(alias) 사용
사원테이블에서 직업별 월급의 합계를 출력해 보자
select job, sum(sal) as 합계
from emp
group by job;
사원테이블에서 직업별 월급의 합계를 출력하는데,
직업은 job이 아니라 직업으로 출력되게 해보자.
이때, group by에 select 절에서 사용한 별칭을 사용한다.
select job as 직업, sum(sal) as 합계
from emp
group by 직업;
SQL Error [904] [42000]: ORA-00904: "YEAR": 부적합한 식별자
위와 같이 [ORA-00904] ERROR가 발생하는 것을 볼 수 있다.
3) having 절에 별칭(alias) 사용
사원테이블에서 직업별 월급의 합계를 출력하는데,
직업이 SALESMAN인 사원에 대해서만 출력해 보자.
select job as 직업, sum(sal) as 합계
from emp
group by job
having job = 'SALESMAN';
위의 내용을 다시 출력하는데,
select절에서 사용한 job의 별칭인 직업을 having절에서 사용해 보자.
select job as 직업, sum(sal) as 합계
from emp
group by job
having 직업 = 'SALESMAN';
SQL Error [904] [42000]: ORA-00904: "YEAR": 부적합한 식별자
위와 같이 [ORA-00904] ERROR가 발생하는 것을 볼 수 있다.
4) order by 절에서 별칭(alias) 사용
사원테이블에서 직업별 월급의 합계를 출력하는데, 합계를 기준으로 오름차순 정렬을 해보자
select job as 직업, sum(sal) as 합계
from emp
group by job
order by sum(sal);
위의 결과를 다시 출력하는데, sum(sal)의 별칭을 사용하여 정렬해 보자
select job as 직업, sum(sal) as 합계
from emp
group by job
order by 합계;
유일하게 ORDER BY절에서만
SELECT절에서 생성한 alias를 활용해도
에러가 발생하지 않고 있는 것을 확인할 수 있다.
' 왜 ORDER BY절에서만 alias 사용이 가능한 것일까? '
2. ORDER BY절에서만 별칭(ALIAS) 사용이 가능한 이유
맨 처음 소개 했지만 다시 한번 소개해드리면, SQL의 기본 코딩 순서는 아래와 같다.
select [컬럼명]
from [테이블명]
where [검색조건]
group by [컬럼명]
having [그룹함수를 이용한 검색조건]
order by [정렬기준 컬럼명] asc/desc;
하지만 우리는 아래와 같은 의문을 가져야 한다.
' 오라클이 내부적으로 실행하는 순서가 우리가 코딩하는 순서와 같을까? '
오라클의 SQL 쿼리 실행 순서
① FROM 절
② WHERE 절
③ GROUP BY 절
④ HAVING 절
⑤ SELECT 절
⑥ ORDER BY 절
select [컬럼명] ⑤
from [테이블명] ①
where [검색조건] ②
group by [컬럼명] ③
having [그룹함수를 이용한 검색조건] ④
order by [정렬기준 컬럼명] asc/desc; ⑥
실행 순서를 보면 알 수 있듯이
오라클은 내부적으로 SELECT절을 먼저 실행하는 것이 아니라
FROM 절을 가장 먼저이며, ORDER BY절을 가장 마지막에 실행하고 있다.
SELECT절은 5번째로 실행되어 SELECT절에서 사용된 별칭(ALIAS)은
다른 절에서는 사용할 수 없다.
따라서 SELECT절 다음에 실행되는 구문에서만 별칭을 활용할 수 있는 것이고,
ORDER BY절만 이에 해당하여 이런 결과가 발생한 것이다.
궁금증이 해결됐다면,
♥ 공감과 댓글 ♥
'Oracle > 이론' 카테고리의 다른 글
<Oracle Admin 1> SQL의 실행과정(SELECT문 처리 과정) 알아보기 (0) | 2024.01.14 |
---|