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
'programing' 카테고리의 다른 글
| WooCommerce 카트, 체크아웃 페이지(메인 테마 부분) 수정 방법 (0) | 2023.03.10 |
|---|---|
| jQuery를 밑줄(_s) WordPress 테마에 추가하는 가장 좋은 방법은 무엇입니까? (0) | 2023.03.10 |
| React with Backbone을 사용할 때 forceUpdate()를 피할 수 있습니까? (0) | 2023.03.10 |
| AngularJS의 루트스코프에 브로드캐스트이벤트 등록을 취소하려면 어떻게 해야 하나요? (0) | 2023.03.10 |
| 스프링 구성 파일에서 bean ID와 이름을 사용하는 차이점 (0) | 2023.03.10 |