[SQL][스파르타] 3주차 join

Regina·2022년 10월 26일
0

SQL

목록 보기
6/9

항상 from에 들어간 테이블을 기준으로, 다른 테이블이 붙는다고 생각하면 편함!
from -> join -> select

select * from users u 
left join point_users pu 
on u.user_id = pu.user_id 

users 테이블의 user id와 point_users 테이블의 user id를 기준으로 left join 해줘
Alias는 이렇게 쓰는 것. user_id 라는 게 어디 테이블의 user_id 인지 구체적으로 지시를 해줘야 하니까.
left join 을 하면 포인트가 없는 회원들 정보는 Null 값으로 나온다. (users는 포인트 정보는 없고, 회원 이메일 주소와 user id가 있고, point_users 에는 회원이 보유한 포인트 정보와 user id가 있다. 테이블에 동일하게 있는 user_id가 키정보가 되어서 join을 할 수가 있다. 회원이지만 포인트가 없는 회원들도 있으니 left join을 하게 되면 포인트가 없는 회원들은 포인트 컬럼이 Null 값으로 나오게 된다). left join 은 순서가 중요함. 누구한테 누구를 붙이는 지에 따라 결과가 달라지니까.

select * from users u 
inner join point_users pu 
on u.user_id = pu.user_id 

하지만 inner join 을 하면 포인트가 있는 회원들의 정보들만 나온다. 교집합

예시1) checkins 테이블에 courses 테이블 연결해서 통계치 내보기

select c1.course_id, c2.title, count(*) as cnt from checkins c1
inner join courses c2 on c1.course_id = c2.course_id 
group by c1.course_id

(course_id가 과목명 타이틀이 아니라서 보기 불편했음. 그래서 어떻게 하면 "앱개발 종합반"이라는 것을 같이 결과에 보여줄 수 있을까? 했는데 from checkins c1 이니까 c2의 정보는 못 가져오나? 헷갈렸다. 그런데 inner join 을 했으니까 가져올 수가 있다.)

예시 2) orders 테이블에 users 테이블 연결해서 통계치 내시

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

###자꾸 실수하는 것!
1) email like 'naver.com' 라고 %를 빼먹음
2) u.name, o.email 어디에 있는 name이고 어디에 있는 email인지 지정안하는 것
조심해야 함!!
추가로 3) 별칭을 잘 쓰기 count(*) as cnt

profile
하루하루 더 나은 사람이 되어보자

0개의 댓글