left join pokemon on trainer.trainer_type=pokemon.type and trainer.id = 1에서 trainer id=1 인 행들만 반환될까?

jinwook han·2021년 10월 12일

left join pokemon on trainer.trainer_type=pokemon.type and trainer.id = 1에서 trainer id=1 인 행들만 반환될까?
-> 아니오. trainer.id이 1이 아닌 행들도 반환된다.

on절에서 조건을 만족하지 못한 trainer 행들은 포켓몬 컬럼들이 null로 채워져서 반환된다.

실험

1. 데이터 구성

pokemon

create table pokemon (
    id INT auto_increment primary key,
    name varchar(20),
    type varchar(20)
);

trainer

create table trainer (
	trainer_id BIGINT primary key,
    trainer_name varchar(20),
    trainer_type varchar(20)
);

pokemon data

idnametype
1pikachuelectric
2balbusaurgrass
3pikachuelectric
4coilelectric

trainer data

trainer_idtrainer_nametrainer_type
1ashelectric
2martinelectric
3hyuaryunfire

2. 쿼리 실행

select * from trainer left join pokemon
on trainer.trainer_type=pokemon.type
and trainer.id=1

3. 결과

trainer_idtrainer_nametrainer_typeidnametype
1ashelectric1pikachuelectric
1ashelectric3pikachuelectric
1ashelectric4coilelectric
2martinelectricNULLNULLNULL
4hywaryunfireNULLNULLNULL

결론

정확히 trainer.id=1인 행들만 나오기를 원한다면, on 절이 아닌 where절에 조건을 넣어야 한다.
예시:

select * from trainer left join pokemon
on trainer.trainer_type=pokemon.type
where trainer.id=1

참고자료

https://stackoverflow.com/questions/8311096/whats-the-difference-between-where-clause-and-on-clause-when-table-left-join

0개의 댓글