Today I Learned
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s;
그냥 두개의 테이블을 불러오는 쿼리.
from_date
와salary
가 emp_no
이 10001인 값으로 모두 표현되고 있음.
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where s.emp_no > 10001;
이렇게 하니까 emp_no 10002의 from_date가 오름차순에서 가장 빠른 날짜의 키의
from_date와 salary의 값을 가져온다.
참고로 salaries 의 emp_no과 from_date가 합쳐져 복합키이다.
결국엔 어쩃든간에 두개이상의 테이블을 의도하려는 대로 가져오려면 where절이 있어야한다.
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no;
where절을 붙이니 아래와 같이 나옴.
e.emp_no은 기본키라 10001이 한개이고 s.emp_no은 10001이 여러개이다.
e.emp_no = s.emp_no이라는 조건을 주니까
e.emp_no과 e.first_name이 s.emp_no과 s.from_date에 맞춰서
아래와 같이 표현됨.
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e
join salaries s
on e.emp_no = s.emp_no;
참고로 join으로 이렇게해도 똑같은 결과.
그래서 from에서 두개이상의 테이블을 불러오는 것도 "조인한다"라고 표현. (268p)
explain
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no
limit 10;
explain 실행했을 때 레코드는 쿼리에서 사용된 테이블의 갯수만큼 나온다.
id가 낮을수록 즉 위에 있을 수록 쿼리의 바깥부분이거나 먼저 접근한 부분이고,
id가 높을수록 즉 아래에 있을 수록 쿼리의 안쪽부분이거나 나중에 접근한 부분이다.
MySQL은 필요에따라 실행계획을 산출하기 위해 쿼리의 일부분을 직접 실행할 때도 있어서 쿼리 자체가 복잡하고 무거우면 실행 계획의 조회도 느려질 가능성이 있다.