sql 연결 검색 어 에서 on,where 선별 의 차이 점 요약

머리말
모든 프로그래머 에 게 sql 조회 라 는 것 은 간단 하고 간단 하 다 고 믿 습 니 다.일반적인 상황 에서 프로 그래 밍 언어 에 맞 는 논리 적 표 현 력 을 추가 삭제 하고 수정 하면 모든 기능 을 실현 할 수 있 습 니 다.그러나 삭제 와 수정 은 sql 문장의 모든 것 을 대표 할 수 없고 완전한 sql 기능 은 다른 사람들의 기대 에 두려움 을 느 낄 수 있다.일반적인 첨삭 검사 보다 조금 복잡 한 차원 의 연결 조회 로 볼 때 맹목적 으로 사용 하면 예상 치 못 한 위험 결과 가 나 와 프로그램 에 이상 한 버그 가 발생 할 수 있다.
연결 조회 문법 에서 다른 사람 이 가장 먼저 현혹 되 는 것 은 on 필터 와 where 필터 의 차이 점 입 니 다.우리 가 조 회 를 작성 할 때 선별 조건 의 배치 가 on 뒤에 있 든 where 뒤에 있 든 찾 아 낸 결 과 는 항상 같 습 니 다.그렇다면 왜 sql 조회 에 두 가지 선택 기 를 지원 하 게 합 니까?사실 이 두 종류의 선별 기 는 차이 가 있 지만 깊이 파고 들 지 않 으 면 쉽게 발견 되 지 않 을 뿐이다.
sql 의 연결 조 회 는 3 가지 로 나 뉘 어 있 습 니 다.cross join,inner join,outer join,cross join 과 inner join 에서 선택 조건 이 on 뒤에 있 는 지,where 뒤에 있 는 지 는 다 르 지 않 습 니 다.극단 적 으로 이 두 가지 연결 조 회 를 작성 할 때 on 만 사용 하고 where 를 사용 하지 않 아 도 문제 가 없습니다.따라서 on 필터 와 where 필터 의 차 이 는 outer join,즉 평소에 가장 많이 사용 하 는 left join 과 right join 에 대한 것 입 니 다.
다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 살 펴 보 겠 습 니 다.
예 를 들 어 두 장의 데이터 시트 가 있 고 구조 와 데 이 터 는 그림 과 같다.
표 main

시계

이 두 장의 시 계 를 사용자 정 보 를 저장 하 는 데 사용 되 는 것 으로 볼 수 있 습 니 다.main 은 주요 정 보 를 배치 하고 ext 표 는 추가 정 보 를 배치 합 니 다.두 장의 표 의 관 계 는 1 대 1 이 고 id 문 자 를 대응 하 는 관계 키 로 합 니 다.현재 우 리 는 주 소 를 항주 의 모든 사용자 정보 로 선별 하지 않 고,결과 에 main 표 와 ext 표 의 모든 필드 데 이 터 를 포함 해 야 한다.

select * from main left JOIN exton main.id = ext.id and address <> '  '
눈 을 감 고 뇌 인 육 으로 SQL 을 실행 해 어떤 결과 인지 상상 해 보 세 요.
address <> ' '이 선별 조건 을 on 에 두 었 을 때 조회 한 결 과 는 우리 가 예상 한 것 과 다른 것 같 습 니 다.결과 에서 알 수 있 듯 이 이 선별 조건 은 ext 표 에 대응 하 는 기록 만 걸 러 낸 것 같 습 니 다.main 표 의 기록 은 걸 러 지지 않 았 고 위의 그림 에서 빨간색 으로 표 시 된 기록 입 니 다.outer join에 비해inner join의 주요 특징 중 하 나 는 바로 한쪽 의 시 계 를 바탕 으로 하 는 것 이다.그러나 여기 서 왼쪽 시 계 를 바탕 으로 한 다 는 점 에서 선별 조건 을 무시 할 수 있다 는 것 은 너무 포악 하 다.
검색 어 를 조금 바 꾸 고 주소 의 선별 조건 을 on 에서 where 로 옮 깁 니 다.

select * from main left JOIN ext on main.id = ext.id where address <> '  '
결 과 는 우리 가 예 상 했 던 대로 되 었 다.

이런 결과 의 차 이 를 초래 하 는 것 은outer join조회 의 논리 적 조회 의 각 단계 에서 말 해 야 한다.
전반적 으로 outer join 의 실행 과정 은 4 단계 로 나 뉜 다.
      1.먼저 두 표 에 교차 연결(피리 칼 적)을 실행 합 니 다.
      2.필터 에 적용
      3.외부 줄 추가
      4.where 필터 적용
where 필 터 를 사용 하지 않 는 sql 을 사용 하면 전체 상세 한 과정 은 다음 과 같 습 니 다.
첫 번 째 단 계 는 두 표 에 교차 연결 을 실행 합 니 다.결 과 는 다음 과 같 습 니 다.이 단 계 는 36 개의 기록 이 있 습 니 다.(이 그림 은 불완전 합 니 다)

두 번 째 단 계 는 on 선택 기 를 사용 합 니 다.선택 기 에는 두 가지 조건 이 있 습 니 다.main.id = ext.id and address<> ' '요구 에 부합 되 는 기록 은 다음 과 같 습 니 다.

이것 은 바로 우리 가 기대 하 는 바 에서 조회 한 결과 인 것 같 지만,다음 단계 에서 이 결 과 는 혼 란 스 러 워 질 것 이다.
세 번 째 단계,외부 줄 추가.outer join한 가지 특징 은 한쪽 의 시 계 를 바탕 으로 하 는 것 이다.만약 다른 쪽 의 시계 가 on 선별 조건 에 부합 되 는 기록 이 없다 면 null 로 대체 하 는 것 이다.이번 조회 에서 이 단계 의 역할 은 원래 걸 러 야 할 기록 을 추가 하 는 것 이다.

사족 을 그 리 는 느낌 이 들 지 않 았 는 지 결국 이렇게 되 었 다.

네 번 째 단계,where 필터 적용
이 문제 sql 에 서 는 where 필터 가 없 기 때문에 이전 단계 의 결 과 는 최종 결과 입 니 다.
그리고 그 주소 에 대해 where 조건 에서 sql 을 선별 하 는 데 이 단 계 는 역할 을 했 고 모든 주 소 를 항주 에 속 하지 않 는 기록 을 선별 했다.

위의 설명 을 통 해outer join에서 의 선별 조건 이 on 과 where 에서 의 차 이 를 나 타 낼 수 있 습 니 다.개발 자 들 이 상세 하 게 알 수 있다 면 sql 을 작성 하 는 과정 에서 발생 하 는 많은 알 수 없 는 오 류 를 피 할 수 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기