Join이란, 두 테이블의 공통된 정보를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
테이블을 붙일 때 '기준'이 필요하다.
Join의 종류 : Left Join, Inner Join
1)Left Join : 왼쪽에 있는 테이블 기준으로 붙힌다.
ex) SELECT from users u
'left join' point_users p
'on' u.user_id = p.user_id -> 기준
null은 비어있는 것이고 매칭이 안된다는 것인데 모든 유저가 포인트가 가지고 있을 순 없다.
2) Inner Join
교집합, 즉 포인트가 있는 것들만 나온다
ex) SELECT * from users u
join point_users p
on u.user_id = p.user_id
*왠만하면 inner join으로 쿼리를 짜는 것이 좋다.
왜? left join 보다 좀 더 쉽기 때문이다.
left join은 a를 b로 붙일 때 없으면 null이 나오지만 inner join은 교집합이기 때문에 순서가 없기에
조금 더 쉽다고 말할 수 있는 것이다.
연습
SELECT from enrolleds e
inner join courses c
on e.course_id = c.course_id
위 쿼리가 실행되는 순서: from → join → select
1. from enrolleds: enrolleds 테이블 데이터 전체를 가져옵니다.
2. inner join courses on e.course_id = c.course_id: courses를 enrolleds 테이블에 붙이는데, enrolleds 테이블의 course_id와 동일한 course_id를 갖는 courses의 테이블을 붙입니다.
3. select : 붙여진 모든 데이터를 출력합니다.
연습
SELECT u.name,count() as cnt FROM orders o
inner join users u
on o.user_id = u.user_id
where o.email like '%naver.com'
group by u.name
위 쿼리가 실행되는 순서: from → join → where → group by → select
1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (users 테이블에 u라는 별칭을 붙입니다)
3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.