1. Join 이란?
👉 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미해요.
예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!
👉 위의 예시와 같이, 두 테이블의 정보를 연결해서 함께 보고싶을 때가 있겠죠? 그럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는답니다. 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 불러요.
👉 [오늘의 꿀팁!] 병원에서 의사선생님이 '환자번호 101번님 진료받으러 들어오세요' 라고 불렀는데 같은 환자번호를 가진 사람이 여러명이 있으면 누가 들어와야 할지 환자번호만으로 알 수 없겠죠?
SQL에서의 Join도 마찬가지에요. key값을 사용해 연결하고 싶은 테이블에 찾아가서 똑같은 값을 가지는 key를 찾게 되는데, 똑같은 key를 가지는 데이터가 여러개 있으면 어느 데이터를 가져와서 연결해야 할지 알 수 없어요.
- Join을 사용해서 Key값으로 두 테이블 연결해보기
select * from point_users
left join users
on point_users.user_id = users.user_id
2. Join의 종류: Left Join, Inner Join
- Left Join: 유저 데이터로 Left Join 이해해보기
여기서 A와 B는 각각의 테이블을 의미합니다. 둘 사이의 겹치는 부분은, 뭔가 테이블 A와 B의 key 값이 연결되는 부분일 것 같지 않나요?
select * from users u
left join point_users p
on u.user_id = p.user_id;
👉 어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있습니다.
꽉찬 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우
비어있는 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우
비어있는 데이터의 경우, 회원이지만 수강을 등록/시작하지 않아 포인트를 획득하지 않은 회원인 경우에요!
- Inner Join: 유저 데이터로 Inner Join 이해해보기
여기서 A와 B는 각각의 테이블을 의미합니다. 이 그림은 뭔가, 두 테이블의 교집합을 이야기하고 있는 것 같지 않나요?
select * from users u
inner join point_users p
on u.user_id = p.user_id;
👉 앗, 여기서는 비어있는 필드가 있는 데이터가 없어요! 그 이유는, 같은 user_id를 두 테이블에서 모두 가지고 있는 데이터만 출력했기 때문이에요.
3. SQL 쿼리가 실행되는 순서
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
👉 위 쿼리가 실행되는 순서: from → join → select
- from enrolleds: enrolleds 테이블 데이터 전체를 가져옵니다.
- inner join courses on e.course_id = c.course_id: courses를 enrolleds 테이블에 붙이는데, enrolleds 테이블의 course_id와 동일한 course_id를 갖는 courses의 테이블을 붙입니다.
- select * : 붙여진 모든 데이터를 출력합니다.
👉 항상 from에 들어간 테이블을 기준으로, 다른 테이블이 붙는다고 생각하면 편합니다!
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
👉 위 쿼리가 실행되는 순서: from → join → where → group by → select
- from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
- inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
- where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
- group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
- select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.
👉 Join의 실행 순서는 항상 from 과 붙어다닌다고 생각하면 편해요!
'스파르타코딩클럽' 카테고리의 다른 글
[내일배움단] 엑셀보다 쉬운 SQL - 4주차 (0) | 2023.01.14 |
---|---|
[스파르타코딩클럽] 웹개발 종합반 - 2주차 (0) | 2023.01.12 |
[내일배움단] 엑셀보다 쉬운 SQL - 2주차 (2) | 2022.12.30 |
[스파르타코딩클럽] 웹개발 종합반 - 1주차 (2) | 2022.12.30 |
[내일배움단] 엑셀보다 쉬운 SQL - 1주차 (0) | 2022.12.27 |