문제

나는 잘못된 방식으로 인터넷 검색을 받아야하거나 어리석은 순간이 있습니다.

차이점은 무엇입니까? HAVING 그리고 WHERE 에서 SQL SELECT 성명?

편집 : 나는 링크의 주요 정보가 포함되어 있기 때문에 Steven의 답변을 올바른 것으로 표시했습니다.

언제 GROUP BY 사용되지 않고 HAVING a처럼 행동합니다 WHERE

내가 본 상황 WHERE 에는 없었습니다 GROUP BY 그리고 내 혼란이 시작된 곳입니다. 물론, 당신이 이것을 알기 전까지는 질문에서 그것을 지정할 수 없습니다.

매우 깨달은 모든 답변에 감사드립니다.

도움이 되었습니까?

해결책

그룹에 대한 검색 조건 또는 SELECT 문에 사용 된 집계 함수를 지정합니다.

원천

다른 팁

가기 : 조건을 확인하는 데 사용됩니다 ~ 후에 집계가 발생합니다.
위치 : 조건을 확인하는 데 사용됩니다 ~ 전에 집계가 발생합니다.

이 코드 :

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

MA의 모든 도시 테이블과 각 도시의 주소 수를 제공합니다.

이 코드 :

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

5 개 이상의 주소와 각 도시의 주소 수를 가진 MA의 도시 테이블을 제공합니다.

나에게 가장 큰 차이점 : if HAVING SQL 언어에서 제거 되었으면 생명은 이전과 마찬가지로 다소 계속 될 것입니다. 확실히, 파생 테이블, CTE 등을 사용하여 소수의 쿼리를 다시 작성해야하지만 결과적으로 이해하고 유지하기가 더 쉽습니다. 이를 설명하기 위해 공급 업체의 최적화 코드를 다시 작성해야 할 수도 있습니다. 다시 업계 내에서 개선 할 수있는 기회입니다.

이제 잠시 제거하는 것을 고려하십시오 WHERE 언어에서. 이번에는 다수 명백한 대안 구성없이 존재하는 쿼리를 다시 작성해야합니다. 코더는 정확히 하나의 행을 포함하는 것으로 알려진 테이블에 창의력을 발휘해야합니다 (예 : DUAL Oracle에서) 사용 ON 이전을 시뮬레이션하는 조항 WHERE 절. 그러한 구조는 고안 될 것이다. 언어에서 뭔가 빠진 것이 있었고 결과적으로 상황이 더 나빠질 것임이 분명 할 것입니다.

tl; 우리는 잃을 수 있습니다 HAVING 내일과 상황은 더 나쁘지 않을 것이지만, 아마도 더 나을 것입니다. 그러나 똑같이 말할 수는 없습니다 WHERE.


여기의 답변에서 많은 사람들이 HAVING 조항은 a.없이 사용할 수 있습니다 GROUP BY 절. 이 경우 HAVING 절은 전체 테이블 표현식에 적용되며 상수만이 SELECT 절. 일반적으로 HAVING 조항에는 집계가 포함됩니다.

이것은 소리보다 더 유용합니다. 예를 들어,이 쿼리를 고려하여 name 열은 모든 값에 고유합니다 T:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

가능한 두 가지 결과 만 있습니다 HAVING 조항은 사실입니다. 결과는 값을 포함하는 단일 행입니다. 1, 그렇지 않으면 결과는 빈 세트가됩니다.

키워드를 집계 함수와 함께 사용할 수 없기 때문에 HADIN 절은 SQL에 추가되었습니다.

이것을 확인하십시오 W3Schools 링크 자세한 내용은

통사론:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

이와 같은 쿼리 :

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... 파생 테이블을 사용하여 다시 작성할 수 있습니다 (생략 HAVING) 이와 같이:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

둘 사이의 차이점은 절에 의한 그룹과의 관계에 있습니다.

  • 그룹 앞에 오는 곳; SQL은 기록하기 전에 WHERE 절을 평가합니다.

  • 그룹 후에 오는 것; SQL은 IT를 그룹화 한 후 평가를 평가합니다.

select statement diagram

참조

HAVING 다음과 같은 집계를 사용할 때 사용됩니다. GROUP BY.

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

SQL에 의해 반환 된 세트에 제한이 적용되는 경우; SQL의 내장 세트 Oeprations 및 Indexes를 사용하므로 결과 세트를 필터하는 가장 빠른 방법입니다. 가능할 때마다 항상 사용하십시오.

일부 집계 필터에는 필요한 것이 필요합니다. SQL이 검색, 조립 및 결과를 정렬 한 후 쿼리를 필터링합니다. 따라서 필요한 상황을 제외하고는 어디보다 훨씬 느리고 피해야합니다.

SQL Server를 사용하면 훨씬 더 빠른시기에도 사용을 도망 갈 수 있습니다. 하지 마십시오.

조항이 집계 함수에 대해 작동하지 않는 경우
수단 :이 보너스처럼 사용해서는 안됩니다 : 테이블 이름

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

여기서 절을 사용해야하는 위치를 사용하는 대신 ..

clause by clause를 사용하지 않고 절은 절만있는 곳으로 작동합니다.

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

차이 b/w WHERE 그리고 HAVING 절:

사이의 주요 차이점 WHERE 그리고 HAVING 절은 WHERE 행 작업에 사용됩니다 HAVING 열 작업에 사용됩니다.

우리가 필요한 이유 HAVING 절?

아시다시피, 집계 함수는 열에서만 수행 할 수 있으므로 집계 함수를 사용할 수 없습니다. WHERE 절. 따라서 우리는 골재 기능을 사용합니다 HAVING 절.

언제 GROUP BY 사용되지 않습니다 WHERE 그리고 HAVING 조항은 본질적으로 동일합니다.

그러나 언제 GROUP BY 사용:

  • 그만큼 WHERE 절은 결과에서 레코드를 필터링하는 데 사용됩니다. 필터링은 그룹화되기 전에 발생합니다.
  • 그만큼 HAVING 절은 그룹으로부터 값을 필터링하는 데 사용됩니다 (즉, 그룹으로의 집계가 수행 된 후 조건을 확인하기 위해).

자원 여기

나는 문제가 있었고 WHERE 그리고 HAVING. 인덱스 된 열에서 동일한 방식으로 작동하지 않습니다.

WHERE my_indexed_row = 123 행을 표시하고 다른 인덱스 행에서 "주문 ASC"를 자동으로 수행합니다.

HAVING my_indexed_row = 123 가장 오래된 "삽입 된"행에서 주문이없는 최신 행까지 모든 것을 보여줍니다.

그것을 생각하는 한 가지 방법은 adge clause가 WHERE 절에 대한 추가 필터라는 것입니다.

어디 절은 결과에서 필터 레코드를 사용합니다. 필터는 그룹화되기 전에 발생합니다. ㅏ was 절은 그룹의 값을 필터링하는 데 사용됩니다

집계 된 중간 결과 세트가 생성되기 전에 집계 쿼리 (집계 함수가 사용되는 쿼리)에서 (집계 함수가 사용되는 모든 쿼리)는 위치를 예정합니다.

haved 절의 예측은 생성 된 후 집계 결과 세트에 적용됩니다. 그렇기 때문에 집계 값에 대한 술어 조건은 WHERE 절이 아닌 조항에 있어야하며, where 절에서 선택 조항에 정의 된 별칭을 사용할 수있는 이유입니다.

기본 테이블의 값을 비교하는 데 절이 사용되는 경우, 쿼리 클릭의 결과 세트에서 집계 함수 결과를 필터링하는 데 사용되는 조항을 사용할 수 있습니다. 여기!

집계 함수의 결과를 기반으로 쿼리를 제한하는 데 사용합니다. 예를 들어 선택 *에서 Blahblahblah 그룹에서 Count (Something)> 0

에서 여기.

SQL 표준은 조항 또는 집계 함수에 사용되는 열별 열 또는 열을 참조해야합니다.

데이터베이스 행에 적용되는 WHERE 절과 반대로

프로젝트를 진행하는 동안 이것은 또한 제 질문이었습니다. 위에서 언급 한 바와 같이 was 이미 발견 된 쿼리 결과의 조건을 확인합니다. 하지만 어디 쿼리가 실행되는 동안 조건을 확인하는 것입니다.

이것을 설명 할 모범을 보여 드리겠습니다. 이와 같은 데이터베이스 테이블이 있다고 가정 해 봅시다.

usertable {int userid, date datefield, int daily income}

다음 행이 테이블에 있다고 가정합니다.

1, 2011-05-20, 100

1, 2011-05-21, 50

1, 2011-05-30, 10

2, 2011-05-30, 10

2, 2011-05-20, 20

이제 우리는 그것을 얻고 싶습니다 userid모래 sum(dailyincome) 누구 sum(dailyincome)>100

우리가 쓰면 :

usertable where sum (daily ompecome)> 100 그룹 별 userId, sum (daily omcome)을 선택하십시오.

이것은 오류가 될 것입니다. 올바른 쿼리는 다음과 같습니다.

UserTable Group에서 userId, sum (Daily Encome)을 선택하여 userId whand sum (daily Encome)> 100을 선택하십시오.

"여기서"의 주제는 줄인 반면, "hading"의 주제는 그룹 일 수 있습니다. 내가 맞아?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top