inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

SQL 코딩테스트를 위한 첫 걸음

cross join, full join

cross join, full join강의 / leetcode 1280번 문제 질문드립니다

해결된 질문

300

이승렬

작성한 질문수 5

1

select a.student_id,
a.student_name,
a.subject_name,
count(e.subject_name) attended_exams
from
(
	select student_id,
    	student_name,
    	subject_name
	from Students, Subjects # cross join
) a
left outer join 
(
	select student_id,
	subject_name
	from Examinations
) e
on a.student_id=e.student_id
and a.subject_name=e.subject_name
group by a.student_id, a.student_name, a.subject_name
order by a.student_id, a.subject_name;

해당 코드에 select 문에 있는

count(e.subject_name) attended_exams

를 실행할 때,

count(a.subject_name) attended_exams

와 같이 cross join을 실행한 subject_name을 기준으로 실행하는 경우에는 0값이 안나오는 결과를 확인했는데 둘의 차이가 궁금합니다.

sql mysql 코딩-테스트

답변 1

1

Gemma

승렬님 안녕하세요:)

늘 참신한 질문을 주셔서 감사합니다.

 

leetcode: https://leetcode.com/problems/students-and-examinations/description/

승렬님의 질문이
위의 코드 (e.subject_name -> 정답 코드)와 아래 코드(a.subject_name -> 오답 코드)의 차이가 무엇이냐로 이해했는데요.

image

image


이해를 위해 아래와 같이 데이터를 좀더 풀어봤습니다. (select *로 확인)

image

왼쪽 노란색 박스는 a temp table에서, 오른쪽 노란색 박스는 e temp table에서 온 결과입니다.

 

참고로 초록색 박스의 row가 왜 3개인지 말씀 드리면,

a temp table에서는 (1, Alice, Math) 조합이 1개이지만, e temp table에서는 (1, Math) 조합이 3개이므로 조인하는 과정에서 3개로 뻥튀기된 것입니다.

 

승렬님의 질문은 분홍색 박스를 확인하면 되는데요.

a temp table에서는 늘 subject_name이 들어있습니다. (분홍색 박스에서 Physics 존재)

반면 e temp table에서는 Examinations table에 없다면 조인할 데이터가 없으므로 null로 나타날 것입니다.

 

null 데이터는 count 자체가 성립이 안되기 때문에, count(null)=0이 됩니다. 그렇기 때문에 우리의 정답 코드처럼 count(e.subject_name)을 하면 0으로 나오는 것입니다.

 

반면 Physics는 count를 할 수 있기 때문에, count(Physics)=1이 됩니다. 그렇게 때문에 오답 코드 처럼 count(a.subject_name)을 하면 늘 1로 나오는 것입니다.


읽어보시고 이해 안가는 부분이 있으시면, 추가 질문 부탁드립니다:)

 

 

Free Edition 실습 영상은 아직 업데이트전인가요?

0

4

1

2주차 개념#12 트리 순회

0

12

2

백준 사이트 서비스 종료

0

30

3

라이브 운영중인 환경의 테이블에 인덱스 추가시 고려사항

0

22

2

잠겨버린 사물함 시간초과 관련 질문입니다.

0

17

1

상품 정보 크롤링

0

15

2

JPA Repository 질문이 있습니다!

1

29

2

페이지네이션 처리를 쿼리에서 하는 방식 질문

1

31

1

강의에 적용한 스크립트를 받아 볼수 있을까요?

0

29

2

백준 서비스 종료인데 도전 과제 프로그래머스 문제로 올려주실수 있으신가요

0

60

1

문제 링크 변경

0

54

2

SQL 파일 다운로드

0

62

2

workbench 테이블 생성

0

273

2

sql 코딩 테스트에서 index 생성 가능 여부

1

282

2

not In강의 / leetcode 1978 질문 드립니다

2

198

1

LEETCODE - Sales Analysis 3 코드 질문드립니다.

1

278

1

[The Latest Login in 2020] datetime 계산 관련

1

247

1

[Average Selling Price] 문제 테스트케이스 실패

1

280

3

서브쿼리 질문

1

348

1

EASY INNER JOIN 관련 average-selling-price 연습문제

1

282

1

INNER JOIN 강의 질문

1

325

2

문제 주소 링크

1

295

2

work bench 설치관련 문의

1

280

2

깃헙 데스크탑, MYSQL 워크벤치 연동

2

856

3