Mysql 의 left join 무효 및 사용 에 대한 주의사항 설명

5909 단어 Mysqlleftjoin
Mysql 의 left join 무효 및 사용
오늘 sql 을 쓴 결과 left join 을 사용 하여 왼쪽 표 의 데 이 터 를 모두 조회 하지 않 았 다 는 것 을 알 게 되 었 습 니 다.저 는 잠시 답답 해 졌 습 니 다.나중에 자세히 연구 한 후에 야 제 가 상식 적 인 실 수 를 저 질 렀 다 는 것 을 알 게 되 었 습 니 다(저 는 풋내기 입 니 다)
이것 은 원래 sql 입 니 다.

이러한 조 회 는 tb 를line 이 표 의 데 이 터 를 모두 조회 해 내 니 정말 난처 하 다.
뒤에 야 나 는 우리 가 여러 표를 조회 할 때 where 까지 실행 하기 전에 먼저 임시 표를 만 들 것 이라는 것 을 알 게 되 었 다.
그리고 on 은 임시 표 의 조건 선별 입 니 다.left join 을 사용 하면 조건 이 진실 이 든 아니 든 왼쪽 표 의 데 이 터 를 조회 하고 조건 이 가짜 이면 null 로 표 시 됩 니 다.

where 는 임시 표 생 성 후 필터 조건 입 니 다.

첫 번 째 그림 에서 나 는 tbvehicle 이 표 의 여과 조건 은 where 에 놓 여 있 습 니 다.left join 이 발생 하 는 조건 은 가짜 데이터 이 고 where 의 v.del 입 니 다.flag='0'에서 필터 링 됨(조건 이 가짜 데이터 이기 때문에 del다 비 어 있 음)
그래서 저 는 left join 을 사용 한 것 같 지만 실제로 이렇게 쓰 는 것 은 inner join 을 사용 한 결과 와 같 습 니 다.
정확 한 sql 은 다음 과 같 습 니 다:

임시 표 에서 조건 선별 을 잘 하면 왼쪽 표 의 데 이 터 를 얻 을 수 있다.
요약:
left join 을 사용 하고 조건 조 회 를 해 야 할 때 조건 을 바 꾸 어 on 뒤에 놓 을 지 where 뒤에 놓 을 지 자세히 고려 해 야 합 니 다.
Mysql left join 피 갱 안내
현상.
left join 은 우리 가 my sql 을 사용 하여 조회 하 는 과정 에서 매우 흔히 볼 수 있다 고 할 수 있다.예 를 들 어 블 로그 의 한 글 에 몇 개의 댓 글 이 있 는 지,상점 안의 한 화물 에 얼마나 많은 댓 글 이 있 는 지,한 개의 댓 글 에 얼마나 많은 찬 사 를 받 는 지 등 이다.그러나 join,on,where 등 키워드 에 익숙 하지 않 아서 조회 결과 가 예상 과 맞지 않 을 때 가 있 습 니 다.그래서 오늘 제 가 정리 하고 같이 구 덩이 를 피 하 겠 습 니 다.
여기 서 나 는 먼저 한 장면 을 제시 하고 두 가지 문 제 를 던 졌 다.만약 네가 모두 맞 힐 수 있다 면 이 문장 은 볼 필요 가 없다.
만약 에 한 반 관리 응용 프로그램 이 있다 고 가정 하면 표 classes 가 있 고 모든 반 을 저장 했다.표 students 가 있 는데 모든 학생 을 저 장 했 습 니 다.구체 적 인 데 이 터 는 다음 과 같 습 니 다.

SELECT * FROM classes;

SELECT * FROM students;

그럼 지금 은 두 가지 요구 가 있 습 니 다.
각 반 의 명칭 과 그 에 대응 하 는 여학생 수 를 찾아내다
한 반 의 학우 총 수 를 찾아내다.
수요 1 에 대해 대부분의 사람들 은 깊이 생각 하지 않 고 다음 과 같은 두 가지 sql 기법 을 생각해 낼 수 있 습 니 다.어떤 것 이 옳 습 니까?

SELECT c.name, count(s.name) as num 
    FROM classes c left join students s 
    on s.class_id = c.id 
    and s.gender = 'F'
    group by c.name
혹은

SELECT c.name, count(s.name) as num 
    FROM classes c left join students s 
    on s.class_id = c.id 
    where s.gender = 'F'
    group by c.name
수요 2 에 대해 대부분의 사람들 은 깊이 생각 하지 않 고 다음 과 같은 두 가지 sql 기법 을 생각해 낼 수 있 습 니 다.어떤 것 이 옳 습 니까?

SELECT c.name, count(s.name) as num 
    FROM classes c left join students s 
    on s.class_id = c.id 
    where c.name = '  ' 
    group by c.name
혹은

SELECT c.name, count(s.name) as num 
    FROM classes c left join students s 
    on s.class_id = c.id 
    and c.name = '  ' 
    group by c.name
계속 뒤 집 지 마 세 요!!먼저 당신 의 답 을 드 리 세 요.정 답 은 바로 아래 에 있 습 니 다.
~
~
~
답 은 두 가지 수요 가 모두 첫 번 째 문구 가 정확 하 다 는 것 이다.이 문 제 를 파악 하려 면 my sql 이 left join 에 대한 집행 원 리 를 알 고 다음 절 에 전개 해 야 한다.
근원.
my sql 은 left join 에 대해 서 는 포 함 된 순환 과 유사 한 방식 으로 처리 합 니 다.아래 의 문 구 를 예 로 들 면:

SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2(LT,RT)
그 중에서 P1 은 on 여과 조건 이 고 부족 하면 TRUE,P2 는 where 여과 조건 이 며 부족 하면 TRUE 라 고 생각 합 니 다.이 문장의 집행 논 리 는 다음 과 같 습 니 다.

FOR each row lt in LT {//         
  BOOL b = FALSE;
  FOR each row rt in RT such that P1(lt, rt) {//        ,    join    
    IF P2(lt, rt) {//   where     
      t:=lt||rt;//   ,    
    }
    b=TRUE;// lt RT      
  }
  IF (!b) { //    RT,  lt RT        ,    null   
    IF P2(lt,NULL) {//   null    where     
      t:=lt||NULL; //   lt null    
    }         
  }
}
물론 실제 상황 에서 MySQL 은 buffer 방식 으로 최적화 시 켜 줄 의 비교 횟수 를 줄 일 것 이다.그러나 이것 은 관건 적 인 집행 절차 에 영향 을 주지 않 고 본 고의 토론 범위 안에 있 지 않다.
이 위조 코드 에서 우 리 는 두 가 지 를 볼 수 있다.
오른쪽 표를 제한 하려 면 반드시 on 조건 에서 진행 해 야 합 니 다.where 에서 진행 하면 데이터 가 부족 하여 왼쪽 표 가 오른쪽 표 에 일치 하 는 줄 이 없 는 줄 이 최종 결과 에 나타 나 지 않 고 우리 가 left join 에 대한 이해 에 어 긋 날 수 있 습 니 다.왼쪽 표 에 오른쪽 표 가 없 는 줄 의 경우 오른쪽 표 뒤 b=FALSE 를 옮 겨 다 니 기 때문에 NULL 로 오른쪽 표를 보완 하려 고 시도 합 니 다.그러나 이때 우리 의 P2 는 오른쪽 표 줄 에 제한 을 두 었 습 니 다.NULL 은 P2(NULL 은 일반적으로 제한 조건 을 만족 시 키 지 않 습 니 다.IS NULL 같은 경 우 를 제외 하고)를 만족 시 키 지 않 으 면 최종 결과 에 가입 하지 않 아 결과 가 부족 합 니 다.
where 조건 이 없 으 면 on 조건 이 왼쪽 표 에 대해 어떠한 제한 을 하 든 왼쪽 표 의 모든 줄 은 적어도 한 줄 의 합성 결과 가 있 을 것 입 니 다.왼쪽 표 줄 의 경우 오른쪽 표 가 대응 하 는 줄 이 없 으 면 오른쪽 표 가 끝 난 후에 b=FALSE 는 한 줄 의 NULL 로 데 이 터 를 생 성 할 것 입 니 다.이 데 이 터 는 불필요 합 니 다.그래서 왼쪽 시 계 를 걸 러 내 려 면 where 를 사용 해 야 합 니 다.
다음 두 가지 필요 한 오류 문장의 실행 결과 와 오류 원인 을 보 여 줍 니 다.
수요

수요

수요 1 where 조건 에서 오른쪽 표 에 대한 제한 으로 인해 데이터 가 부족 합 니 다(4 반 은 0 의 결과 가 있어 야 합 니 다)
수요 2 on 조건 에서 왼쪽 표 에 대한 제한 으로 인해 데이터 가 불필요 하 다(다른 반 의 결과 도 나 왔 지만 틀 렸 다)
총결산
위의 문제 현상 과 분석 을 통 해 결론 을 얻 을 수 있다.left join 문장 에서 왼쪽 표 필 터 는 where 조건 에 놓 아야 하고 오른쪽 표 필 터 는 on 조건 에 놓 아야 한다.그래 야 결과 가 많 지 않 고 적당 하 다.
SQL 은 간단 해 보이 지만 세부 적 인 원리 도 많 습 니 다.작은 혼동 은 결과 가 예상 과 맞지 않 기 때문에 평소에 이런 세부 적 인 원 리 를 주의해 서 관건 적 인 시기 에 실 수 를 하지 않도록 해 야 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기