programing

where 절에서 집계 함수를 사용할 수 없는 이유는 무엇입니까?

easyjava 2023. 3. 10. 22:53
반응형

where 절에서 집계 함수를 사용할 수 없는 이유는 무엇입니까?

나는 이것에 대한 해명을 원한다.아래 두 가지 질문을 쓰고 있습니다.

아이디, 이름, 급여라는 열이 있는 직원 이름의 테이블이 있습니다.

  1.  Select name from employee 
    where sum(salary) > 1000 ;

  2.  Select name from employee 
    where substring_index(name,' ',1) = 'nishant' ;

쿼리 1은 동작하지 않지만 쿼리 2는 동작합니다.제 개발 경험으로 볼 때, 가능한 설명은 다음과 같습니다.

sum()은 인수로 지정된 값 집합에 대해 기능합니다.여기서 'salary' 열은 전달되므로 이 열의 모든 값을 합산해야 합니다.단, 첫 번째 레코드 1이 테스트에 체크되는 것처럼 여기서 구내에서는 레코드가 하나씩 체크합니다.따라서 모든 열 값에 액세스해야 하므로 합계(연봉)는 계산되지 않으며 값만 반환됩니다.

쿼리 2는 서브스트링_index()가 단일 값으로 동작하기 때문에 여기에 지정된 값으로 동작합니다.

제 이해도를 확인해 주시겠습니까?

사용할 수 없는 이유SUM()에서WHERE절은 절의 평가 순서입니다.

FROM에 행을 읽을 위치를 나타냅니다.행이 디스크에서 메모리로 읽히는 즉시 행은WHERE조건들.(실제로 많은 경우, 이 행이 실패했을 경우,WHERE절은 디스크에서 읽을 수도 없습니다."조건"은 공식적으로 술어로 알려져 있으며 쿼리 실행 엔진에서 기본 테이블에서 읽을 행을 결정하기 위해 일부 술어가 사용됩니다.이것들은 액세스 술어라고 불립니다).보다시피WHERE절은 엔진에 표시될 때 각 행에 적용됩니다.

한편 집약은 (모든 술어를 확인하는) 모든 행을 읽은 후에만 수행됩니다.

생각해 보세요.SUM()를 만족시키는 행에만 적용됩니다.WHERE조건들.를 붙이면SUM()에서WHERE조항, 순환 논리를 요구하고 있습니다.새 행이 다음을 통과합니까?WHERE조항?내가 어떻게 알아?만약 통과한다면, 나는 그것을 그 안에 포함시켜야 한다.SUM단, 그렇지 않은 경우에는 에 포함시키지 마십시오.SUM그럼 어떻게 평가해야 하죠?SUM조건은?

where 절에서 집계 함수를 사용할 수 없습니다.

집계 함수는 데이터 집합에서 작동합니다.aWHERE절은 전체 집합에는 액세스하지 않고 현재 작업 중인 행에만 액세스할 수 있습니다.

물론 HAVING 절을 사용할 수 있습니다.

select name from employee 
group by name having sum(salary) > 1000;

를 해야 하는 WHERE서브쿼리를 사용할 수 있습니다.

select name from (
    select name, sum(salary) total_salary from employee
    group by name
) t where total_salary > 1000;

sum()는 집약 함수입니다.in적로, 이이 with with with와 됩니다.group by 첫 에 '알 수 없다'가 있습니다group by...group by "discuse",having는 집약 후의 필터링에 사용됩니다.

Select name
from employee 
group by name
having sum(salary) > 1000 ;

는 쿼리가 해당 컬럼의 행으로 직접 이동하기 때문에가 기능하지만 조건이 충족되지 않을 때마다 쿼리가 앞뒤로 반복되기 때문에는 실패합니다.

언급URL : https://stackoverflow.com/questions/42470849/why-are-aggregate-functions-not-allowed-in-where-clause

반응형