복붙노트

[SQL] 왜 집계 함수는 where 절에서 허용되지 않습니다

SQL

왜 집계 함수는 where 절에서 허용되지 않습니다

나는이에 대한 명확한 설명을 찾고 있어요. 나는 아래의 두 쿼리를 작성하고 있습니다 :

우리는 열 ID, 이름, 급여와 직원 이름의 테이블이

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

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

쿼리 1은 작동하지 않지만 쿼리 2는 작업을 수행합니다. 이것이에 내 개발 경험에서, 나는 가능한 설명을 느낄 :

쿼리 SUBSTRING_INDEX 2- 일 ()은 하나의 값에서 작동하며, 따라서 여기가 공급되는 값에 작동한다.

당신은 나의 이해의 유효성을 검사 할 수 있습니다.

해결법

  1. ==============================

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

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

    FROM 어디에서 행을 읽는 방법을 알려줍니다. 행이 디스크에서 메모리로 읽어 오른쪽으로, 그들은 WHERE 조건을 검사합니다. (실제로 절에도 디스크에서 읽을 수 없습니다 어디 실패 대부분의 경우 행에 "조건"공식적으로 술어로 알려져 있으며, 일부 술어가 사용된다 -. 쿼리 실행 엔진 - 기본 테이블에서 읽 행을 결정합니다. 이러한 액세스 조건이라고합니다.) 당신이 볼 수 있듯이,이 엔진에 제시로 절을 각 행에 적용되는 WHERE.

    반면에, 집계는 읽은 (모든 조건을 확인하는 것이)에만 모든 행 후에 완료됩니다.

    만 조건을 만족하는 행에 적용) (SUM : 이것에 대해 생각하십시오. 당신은 WHERE 절에서 SUM ()를 두는 경우에, 당신은 순환 논리를 요구하고 있습니다. 새 행은 WHERE 절을 통과합니까? 어떻게 알아? 이 통과 할 경우, 나는 SUM에 포함해야하지만, 그렇지 않은 경우는 SUM에 포함되어서는 안된다. 그래서 어떻게 심지어 SUM 조건을 평가합니까?

  2. ==============================

    2.집계 함수는 데이터 세트에서 작동합니다. A는 절은 전체 세트에 액세스 할 수 없습니다 WHERE 있지만 행에 현재에 작동하는지.

    집계 함수는 데이터 세트에서 작동합니다. A는 절은 전체 세트에 액세스 할 수 없습니다 WHERE 있지만 행에 현재에 작동하는지.

    당신은 물론 HAVING 절을 사용할 수 있습니다 :

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

    당신이 어디에 사용해야하는 경우, 당신은 하위 쿼리를 사용할 수 있습니다 :

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

    3.합 ()는 집합 함수이다. 일반적으로, 당신은 그룹화 작업을 기대. 따라서, 귀하의 첫 번째 쿼리에 의해 그룹이 없습니다. 쿼리에 의해 그룹에서 응집 후에 필터링에 사용 갖는 :

    합 ()는 집합 함수이다. 일반적으로, 당신은 그룹화 작업을 기대. 따라서, 귀하의 첫 번째 쿼리에 의해 그룹이 없습니다. 쿼리에 의해 그룹에서 응집 후에 필터링에 사용 갖는 :

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

    4.조건이 충족되지 않을 때마다 쿼리 킵 다시 반복 갔다하기 때문에 실패하는 경우 동안 쿼리가 해당 열의 행에 직접가는 이후 가진 작품을 사용.

    조건이 충족되지 않을 때마다 쿼리 킵 다시 반복 갔다하기 때문에 실패하는 경우 동안 쿼리가 해당 열의 행에 직접가는 이후 가진 작품을 사용.

  5. from https://stackoverflow.com/questions/42470849/why-are-aggregate-functions-not-allowed-in-where-clause by cc-by-sa and MIT license