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 은 간단 해 보이 지만 세부 적 인 원리 도 많 습 니 다.작은 혼동 은 결과 가 예상 과 맞지 않 기 때문에 평소에 이런 세부 적 인 원 리 를 주의해 서 관건 적 인 시기 에 실 수 를 하지 않도록 해 야 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 my sql 에 이모 티 콘 저장my sql 에 emoji 표정 을 저장 하려 면 utf8mb 4 문자 집합 을 사용 해 야 합 니 다. 이것 은 4 바이트 저장 입 니 다. 최소 지원 버 전 은 5.5.3 + 입 니 다. 그렇지 않 으 면 새로운...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.