본문 바로가기
DB

VIEW 와 SELECT 실행 순서

by 요섹남 2023. 9. 21.

VIEW 뷰

하나 이상의 기본 테이블이나 다른 뷰를 이용하여 생성되는 가상 테이블이다.

- 기본 테이블은 디스크에 공간이 할당되어 데이터를 저장함

- 뷰는 데이터 딕셔너리 테이블에 뷰에 대한 정의만 저장되어 디스크 저장 공간 할당이 이루어지지 않음.

- 전체 데이터 중에서 일부만 접근할 수 있도록 함

- 뷰에 대한 수정 결과는 뷰를 정의한 기본 테이블에 적용됨

- 뷰를 정의한 기본 테이블에서 정의된 무결성 제약조건은 그대로 유지됨

 

뷰는 왜 필요한가?

- 사용자 마다 특정 객체만 조회할 수 있도록 할 필요가 있음

   (모든 직원에 대한 정보를 모든 사원이 볼 수 있도록 하면 안 됨)

- 복잡한 질의문을 단순화 할 수 있음

- 데이터의 중복성을 최소화할 수 있음

 

장점

- 논리적 독립성을 제공함

- 데이터의 접근 제어 ( 보안 )

- 사용자의 테이터 관리 단순화

- 여러 사용자의 다양한 데이터 요구 지원

 

단점

- 뷰의 정의 변경 불가

- 삽입 , 삭제 , 갱신 연산에 제한이 있음

 

SELECT, 쿼리 실행 순서

FROM 절

SELECT 부터 시작할 것같지만, 쿼리의 가정 첫번째 실행 순서는 FROM절 입니다. FROM 절에서는 전체 테이블의 결과를 갖고 옵니다. INDEX를 사용하지 않는 다는 가정에서 WHERE절이나 SELECT절에서 일부 행이나 열을 제거하여 출력한다고 해도 가장 처음에 테이블의 모든 데이터를 가족 옵니다.

 

WHERE 절

WHERE 절에서는 FROM절에서 읽어온 테이블에서 조건에 맞는 결과만 갖도록 데이터를 간추립니다. 

 

GROUP BY

GROUP BY 절에서는 WHERE 조건으로 간추린 데이터를 선택한 칼럼으로 GROUPING 작업을 한 결과를 갖고 있습니다. GROUP BY 절을 사용하게 되면 해당 칼럼으로 그룹함수를 사용할 수 있습니다.

 

- GROUP BY 란?

  • 같은 값을 가진 행을 그룹짓는 SQL 명령어
  • GROUP BY는 COUNT(), MAX(), MIN(), SUM(), AVG() 등 집계함수와 함께 사용된다.
  • GROUP BY절은 각 그룹의 하나만을 리턴한다.
  • FROM절과 WHERE절 뒤에 위치한다.
  • SQL 7.0이후 부터는 GROUP BY를 할 때 비용을 따져서 정렬하여 그룹핑을 하는 경우도 있고, Hash Match를 통해서 정렬이 이루어지지 않을 수도 있다. 따라서 GROUP BY를 할 때 반드시 ORDER BY는 되지 않으므로 명시적으로 정렬을 원한다면 ORDER BY를 사용하여야 하고 ORDER BY를 사용 하므로써 추가 비용이 발생을 하게 된다.

- GROUP BY의 목적?

GROUP BY 절은 주로 집계 함수와 같이 사용되곤 한다. 여기서 집계 함수는 여러 행의 값을 더하거나, 평균값을 내거나, 개수를 세는 등 여러 개의 데이터에 관한 계산을 한다.

 

HAVING 절

HAVING 절은 GROUP BY된 이 후 사용되는 조건 절입니다

비슷한 WHERE 절과 다르게 HAVING 절은 데이터를 먼저 GROUPING 작업을 한 후 데이터를 필터링하기 때문에 상대적으로 느리다. 그러므로 WHERE 절에서 데이터를 처리하는 방식이 효율적이다.

 

SELECT 절

신기하게도 맨 처음 보여지지만 조건절이 다 실행이 된 후에 실행되는게 SELECT 절이다.

우리가 보고싶어하는 데이터를 보여주는 부분이기 때문에 데이터를 모든 조건으로 처리를 한 후 어떤 열을 출력해줄지 선택하는 역할을 한다.

 

ORDER BY 절

마지막으로 SELECT 문으로 데이터를 출력 하였다면 행의 순서를 어떻게 보여줄지 정렬해주는게 ORDER BY 절이다. 모든 데이터가 보여지고 난 후 처리하는 것이기 때문에 맨마지막에 처리가 된다.

 

마지막으로 실행순서가 중요한 이유

샐행순서에 대한 숙지는 필수이다. 쿼리를 사용할 때 우리는 최종적으로 출력되는 결과만 육안으로 확인할 수 있다. 그래서 각 단계에서 어떤 데이터를 읽고 사용할 수 있는지, 실행순서를 모르면 쿼리를 작성하는데 많은 불편이 생길것이다.