SQLServer 2008 기술 내막 - T - SQL 조회 노트

1. SQL 프로 그래 밍 은 집합 을 위 한 사고방식, 요 소 를 조회 하 는 논리 적 처리 순서, 3 치 논리 등 독특한 점 이 많다.이러한 지식 을 습득 하지 못 하고 SQL 로 프로 그래 밍 을 시작 하면 불필요 하고 성능 이 낮은 코드 를 얻 을 수 있 으 며 유지 하기 어렵다.
2. SQLServer 에서 실제 작업 계획 (실행 계획) 을 생 성 하 는 구성 요 소 는 검색 최적화 기 (query optimizer) 입 니 다.결과 집합 이 정확 하 다 는 전제 하에 서 만 최적화 기 는 지름길 로 갈 수 있다.조회 의 논리 적 처리 와 물리 적 처 리 를 명확 하 게 구분 하 는 것 은 매우 중요 하 다.
3. 논리 조회 의 각 단계:
(5) SELECT (5-2) DISTINCT (5-3) TOP () (5-1) 
(1) FROM (1-J)   JOIN  ON 
     |(1-A)   APPLY  AS 
     |(1-P)  PIVOT () AS 
     |(1-U)  UNPIVOT () AS 
(2) WHERE 
(3) GROUP BY 
(4) HAVING 
(6) ORDER BY ;

첫 번 째 단계: FROM: 검색 의 소스 표를 표시 합 니 다. 연결 연산 에서 관련 된 단 계 는 (1 - J1) 피리 카드 축적, (1 - J2) ON 필터 와 (1 - J3) 외부 줄 추가 입 니 다.가상 테이블 VT1 을 생 성 합 니 다.
1.1. 피리 카드 축적: 두 표 는 피리 카드 축적 을 실행 하고 가상 표 VT1 - J1 을 생 성 한다.
1.2, ON 필터: VT1 - J1 에서 ON 을 true 로 만족 시 키 는 줄 에 VT1 - J2 를 삽입 합 니 다.
1.3. 외부 줄 추가: OUTER JOIN (CROSS JOIN 또는 INNER JOIN 에 비해) 을 지정 하면 표 에 일치 하 는 줄 이 없 는 것 을 유지 하고 외부 줄 로 추가 하여 VT1 - J3 를 생 성 합 니 다.
두 번 째 단계: WHERE: WHERE 자구 의 술어 에 따라 VT1 의 데 이 터 를 줄 로 선별 하고 결과 가 TRUE 인 줄 에 만 VT2 를 삽입 합 니 다.
세 번 째 단계: GROUP BY: group by 의 목록 에 따라 VT2 를 그룹 으로 나 누고 각 그룹 은 하나의 결과 줄 만 있 으 며 VT3 를 생 성 합 니 다.
STEP 4: HAVING: HAVING 에 나타 난 술어 에 따라 VT3 김 신 을 선별 하여 결과 가 TRUE 인 그룹 에 만 VT4 를 삽입 합 니 다.
STEP 5: SELECT: SELECT 자구 의 요 소 를 처리 하여 VT5 를 생 성 합 니 다.
5.1. 계산 식: SELECT 목록 의 표현 식 에 따라 VT5 - 1 을 생 성 합 니 다.
5.2, DISTINCT: VT5 - 1 에서 중복 되 는 줄 을 삭제 하고 VT5 - 2 를 생 성 합 니 다.
5.3. TOP: ORDER BY 자구 정의 논리 에 따라 정렬 하고 VT5 - 2 에서 앞에서 지정 한 수량 이나 백분율 의 줄 을 선택 하여 VT5 - 3 을 생산 합 니 다.
STEP 6: ORDER BY: ORDER BY 자구 에서 지정 한 열 이름 에 따라 VT5 - 3 을 정렬 합 니 다.커서 VC6 생 성.
3 값 논리:
a. 모든 조회 필터 (ON, WHERE, HAVING) 는 null 을 FALSE 로 처리 합 니 다.
b. check 제약 조건 의 null 값 은 TRUE 로 취급 합 니 다.
c. UNIQUE 제약, 집합 연산 (UNION 과 EXCEPT), 정렬 과 그룹 작업 은 두 null 이 같다 고 생각 합 니 다.
주의:
1. FROM 자구 에 표 연산 자가 여러 개 있 으 면 왼쪽 에서 오른쪽으로 순서대로 처리한다.각 표 연산 자의 결 과 는 다음 표 연산 자의 왼쪽 입력 으로 마지막 으로 가상 표를 다음 단계 의 입력 으로 생 성 합 니 다.
2. WHERE 이전에 데이터 그룹 을 나 누 지 않 았 기 때문에 WHERE 자 구 는 취 합 을 사용 할 수 없습니다.필터 에서 ON 이 보존 표 의 일부 줄 을 삭제 하 는 것 은 최종 적 인 것 이 아니 라 WHERE 가 최종 적 인 것 입 니 다.외부 연결 을 사용 할 때 만 ON 과 WHERE 가 논리 적 으로 구별 된다.
3. 조회 에서 GROUP BY 를 지정 하면 후속 모든 절 차 는 지 정 된 그룹 에서 만 작 동 할 수 있 습 니 다.
4. HAVING 은 그룹 데이터 에 사용 할 수 있 는 유일한 필터 입 니 다.
5. SQL 은 여러 개의 연산 을 동시에 계산 (all - at - once operation) 하기 때문에 SELECT 문장의 논리 적 순 서 는 무관 합 니 다.
6. ORDER BY 는 SELECT 의 별명 을 사용 할 수 있 는 유일한 절차 입 니 다.

좋은 웹페이지 즐겨찾기