>  기사  >  데이터 베이스  >  select 문의 논리적 실행 순서를 알고 계시나요?

select 문의 논리적 실행 순서를 알고 계시나요?

伊谢尔伦
伊谢尔伦원래의
2016-11-24 11:21:21935검색

소개

이것은 깊은 기술적인 문제가 아니라 뛰어난 프로그래밍 능력입니다. 이는 반드시 개인의 개발 능력과 직접적인 관련이 있는 것은 아니지만 이를 아는 것은 SQL 작성, 문제 해결 및 최적화에 큰 도움이 될 것입니다. 복잡한 지식 포인트가 아니라 아주 기본적인 SQL 기초입니다. 이것을 모르면 일반 시멘트로 집을 짓고 있는 것이고, 이것을 알면 고급 시멘트로 집을 짓는 것입니다.

하지만 이렇게 작은 지식 포인트라면 주변의 동료나 친구들을 조사해 보면 어쩌면 '놀라움'을 얻을 수도 있습니다.

이 글은 갑자기 작성되었기 때문에 아래에 작성된 SQL 문은 테스트를 거치지 않았습니다.

다음 SQL 문을 살펴보세요.

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

성공적으로 실행될 수 없는 SQL 문은 무엇이라고 생각하시나요?

Closer to home

다음은 SELECT 문의 논리적 실행 순서입니다.

FROM

ON

JOIN

어디에서

GROUP BY

WITH CUBE 또는 WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP

MICROSOFT에서는 쿼리 프로세서가 다르기 때문에 SELECT 문의 실제 물리적 실행 순서가 이 순서와 다를 수 있다고 지적했습니다.

여러 예

예 1

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2

이 SQL 문이 익숙하다고 생각하시나요? 예, 매우 기본적인 그룹 쿼리입니다. 그러나 HAVING의 실행 순서가 SELECT보다 높기 때문에 성공적으로 실행될 수 없습니다.

실제 실행 순서는 다음과 같습니다.

FROM STUDENT

GROUP BY ID

HAVING TOTAL>2

SELECT ID, COUNT(ID ) AS TOTAL

당연히 TOTAL은 SELECT ID의 마지막 문장인 COUNT(ID) AS TOTAL이 실행된 후 생성된 새로운 별칭입니다. 따라서 HAVING TOTAL>2를 실행하면 TOTAL을 인식할 수 없습니다.

예 2

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL

실제 실행 순서는 다음과 같습니다.

FROM STUDENT

GROUP BY ID

SELECT ID , COUNT(ID) AS TOTAL

ORDER BY TOTAL

이번에는 문제 없이 성공적으로 실행될 수 있습니다. ORDER BY TOTAL이 ORDER BY COUNT(ID)로 바뀌면 어떻게 되나요?

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY COUNT(ID)

실제 실행 순서:

FROM STUDENT

GROUP BY ID

SELECT ID,COUNT(ID) AS TOTAL

ORDER BY COUNT(ID)

네, 성공적으로 실행 가능합니다. SQL 실행 계획을 보면 위의 ORDER BY TOTAL과 같습니다. ORDER BY는 SELECT 이후에 실행되므로 별칭 TOTAL을 사용할 수 있습니다.

 예제 3

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

실제 실행 순서:

FROM STUDENT
 
GROUP BY NAME
 
SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

분명히 GROUP BY NAME이 있을 때 별칭 NAME이 생성되지 않았습니다. 따라서 성공적으로 실행할 수 없습니다.

요약

예전에 이 질문을 무작위로 몇몇 사람들에게 했던 기억이 나며, 누가 모른다고 해도 우리는 일부러 비웃었습니다. 물론 한 사람의 비웃음은 아니었습니다. 남의 조롱. 하지만 아직도 이 지식 포인트를 눈치 채지 못하는 사람들이 있다는 것이 밝혀졌습니다. 저는 단지 친근하게 상기시키기 위해 여기에 게시합니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.