SQL Server에서 Group By, having 및 Where 절의 실행 순서는 무엇입니까?


92

WHERE 절과 함께 GROUP BY 및 HAVING을 사용할 때 SQL 쿼리의 실행 순서와 혼동됩니다. 어느 것이 먼저 실행됩니까? 순서는 무엇입니까?

답변:


186

순서대로 :

FROM & JOIN은 행을 결정하고 필터링합니다.
WHERE 행 에 대한 추가 필터
GROUP BY 는 해당 행을 그룹으로 결합합니다.
HAVING 필터 그룹
ORDER BY 는 나머지 행 / 그룹을 정렬합니다.
LIMIT 필터는 나머지 행 / 그룹에 있습니다.


이것에 대한 언급이 있습니까 ??
Geshan

3
@Geshan, 조사SET SHOWPLAN_ALL ON
KM.

안녕하세요, 질문이 하나 있습니다. 조건이 where 조건을 재정의 할 때 case 문이 있습니까?
MAX

2
선택 조항은 어떻습니까? 마지막인가?
MAX

짧고 간결한 답변! 감사합니다!
Abhishek Ghosh

14

다음은 SQL Server의 전체 시퀀스입니다.

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP

따라서 위 목록에서 다음과 같은 실행 순서를 쉽게 이해할 수 있습니다 GROUP BY, HAVING and WHERE.

1.  WHERE
2.  GROUP BY
3.  HAVING

Microsoft에서 더 많은 정보 얻기


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val여기 ON은 조인 후에 나오고 선택이 먼저 오는데 설명이 있습니까?
noob

이것은 SQL 문을 작성하는 구문입니다. 내가 언급 한 순서는 SQL 엔진이 평가하는 실제 순서입니다. 즉, 쿼리 구문이 올 바르면 엔진이 FROM먼저 평가 한 다음 계속해서 평가 ON합니다.
Md. Suman Kabir


WHERE가 SELECT 앞에 오면 행이 반환되는 이유는 무엇입니까? select sum (1) from foo where 1 = 0
Tony B

8

WHERE가 첫 번째이면 쿼리 결과를 그룹화하고 마지막으로 HAVING-clause를 사용하여 그룹화 된 결과를 필터링합니다. 이것은 "논리적"순서입니다. 엔진에서 기술적으로 어떻게 구현되는지 모르겠습니다.


2
옵티마이 저가 집계에 의존하지 않는 경우 HAVING에서 WHERE로 절을 이동할 수 있다는 점을 추가 할 가치가 있습니다. 이것은 표시된 결과에 영향을주지 않습니다.
Damien_The_Unbeliever

2

Matthias가 말했듯이 엔진에서 구현 된 것 같습니다. WHERE, GROUP BY, HAVING

전체 시퀀스를 나열하는 참조를 온라인으로 찾으려고했지만 (즉, "SELECT"가 맨 아래에 있음) 찾을 수 없습니다. 얼마 전에 읽은 "Inside Microsoft SQL Server 2005"책, Solid Quality Learning에 자세히 설명되어 있습니다.

편집 : 링크를 찾았습니다 : http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


당신이 연결 한 아주 좋은 설명 :-).
sleske

1
링크가 죽었습니다. 당신이 그것을 고칠 수 있다면, 그것은 좋을 것입니다 :)
Akash KC

2

Oracle 12c에서는 아래 순서로 코드를 실행할 수 있습니다.

Where
Group By
Having

또는

Where 
Having
Group by

1

구현하려는 경우 수행해야 할 작업에 대해 생각하십시오.

  • WHERE : JOIN 작업을 실행해야합니다.
  • GROUP BY : 조인 결과를 "그룹화"하려면 Group by를 지정합니다. 그런 다음 WHERE 사용 후 JOIN 작업 후 수행해야합니다.
  • HAVING : HAVING은 GROUP BY 표현식에서 말하는 것처럼 필터링하기위한 것입니다. 그런 다음 GROUP BY 이후에 실행됩니다.

순서는 WHERE, GROUP BY 및 HAVING입니다.


여기서 설명하신 내용은 훌륭합니다. 그것은 HAVING에 대한 나의 의심을 해소했습니다. 요약하면-GROUP BY & HAVING은 SELECT & WHERE와 동일하게 작동합니다. HAVING 절은 항상 COMPLETE 테이블 데이터에서 GROUP BY 조건을 사용하고 NOT ON GROUPED 데이터에서 실행됩니다.
Naveen Kumar

1

아래 순서로

  1. 시작 및 가입
  2. 어디
  3. 그룹화
  4. HAVING
  5. 고르다
  6. 주문
  7. 한도

0

조항이있는 경우 그룹 별 조항 이전 / 앞에 올 수 있습니다.

예 : select * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

9 개 행이 선택되었습니다.

select teach, count ( ) count ( )가있는 test_std에서 count (TEACH에 의해 )> 1 그룹을 .

티치 카운트


랑거 2 유언 4


0

이것은 쿼리 실행의 SQL 순서입니다.

여기에 이미지 설명 입력

기사의 예제를 통해 실행 순서를 확인할 수 있습니다 .

아래의 질문이 도움이 될 수 있으며이 기사 에서 직접 얻을 수 있습니다 .

  1. GROUP BY-> WHERE 제약 조건이 적용된 후 나머지 행은 GROUP BY 절에 지정된 열의 공통 값을 기반으로 그룹화됩니다. 그룹화의 결과로 해당 열에 고유 한 값이있는만큼의 행만 있습니다. 암시 적으로 이것은 쿼리에 집계 함수가있는 경우에만 이것을 사용해야 함을 의미합니다.
  1. HAVING-> 쿼리에 GROUP BY 절이있는 경우 HAVING 절의 제약 조건이 그룹화 된 행에 적용되고 제약 조건을 충족하지 않는 그룹화 된 행은 삭제됩니다. WHERE 절과 마찬가지로 별칭도 대부분의 데이터베이스에서이 단계에서 액세스 할 수 없습니다.

참조 :-


-2

SELECT는
FROM
조인
WHERE
하여 그룹을
HAVING
ORDER BY를


13
이것은 실제로 잘못되었습니다. MS Certified Trainers 및 공식 교육 자료에 따르면 Order By는 Select 이후입니다. 당신이 그것에 대해 생각할 때 일종의 논리적입니다. 아직 가져 와서 붙이지 않은 가상 테이블을 주문하는 것은 어리석은 일입니다. :)
simme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.