- inner join 뭐가 교집합이예요? 한 줄에 null값이 없고 전부 있는 거? 이게 교집합? 맞음
- left join 어떻게 합쳐지나? 왼쪽 거 다 나오고 겹치지 않는 부분이 오른쪽에 붙음.


[1주차] - 날것의 데이터

#대소문자 상관 없음
!그러나 실제 데이터와 대소문자 맞춰서 써주는 게 나중에 안헷갈림

!꿀팁
- show tables 로 어떤 테이블이 있는지 살짝 살펴봄.
- 원하는 테이블을 select.. from.. 해서 봄. 여기서 필드명 확인하고, 값을 확인해서
  where절을 건다.




- where절하고 같이 쓰이는 문법들 - 
같지 않음  !=
범위  between A and B

         select * from orders
         where created_at between '2020-07-13' and '2020-07-15'

         2020-07-13에서 2020-07-14까지의 데이터를 불러옴

포함  in (1,3,5)
패턴 (문자열 규칙) 조건  like '%@daum.net'






limit
distinct
      select distinct(payment_method) from orders
count
      select count(*) from orders

      select count(distinct(name)) from users




!에러가 있으면 혼자서 해결해 보려는 시간 갖기. 나중에 큰 자산이 됨.
10분이든, 20분이든, 30분이든, 1시간이든.

!
where email like '%gmail.com'
and created_at between '2020-07-12' and '2020-07-14'
처럼 and 다음에 between 쓰는 경우처럼 괄호 안써도 됨.





<숙제>
select * from orders
where email like '%naver.com'
and course_title = '웹개발 종합반'
and payment_method = 'kakaopay'









[2주차] - 통계적인 숫자들. 최대, 최소, 평균, 갯수.. 의미있는 정보로의 변환
범주(카테고리)로 묶어야지 정보들을 통계낼 수 있다.

group by
select name, count(*) from users
group by name;
group by가 들어가면 count가 그룹으로 묶어준 각각의 것에 대한 카운트가 들어간다.

!순서대로 다 쓰는 게 아니라, 쭉 쓰고 필요한 부분 다시 올라가서 수정하는 게 안헷갈리고 좋음.


min
select week, min(likes) from checkins
group by week;

max
avg
select week, avg(likes) from checkins
group by week;

round 반올림
select week, round(avg(likes),2) from checkins
group by week;

sum

! count가 제일 많이 쓰임.













order by
select name, count(*) from users
group by name
order by count(*);
            --------
맨 마지막에 하는 게 정렬(그러므로 맨 마지막에 써줌)
뒤에 아무것도 안쓰면 기본적으로 오름차순.(asc. ascending) desc라고 써주면 내림차순.(descending)

! 세미콜론(;)은 끝나는 부분 표시하는 건데 안붙여도 됨.


select payment_method, count(*) from orders
where course_title = '웹개발 종합반'
group by payment_method
order by count(*) desc


! 꿀팁. 이렇게 쿼리를 작성하면 편해요!
1) show tables로 어떤 테이블이 있는지 살펴보기
2) 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 limit 10 쿼리 날려보기
3) 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
4) 테이블을 찾았다! 범주를 나눠서 보고싶은 필드를 찾기
5) 범주별로 통계를 보고싶은 필드를 찾기
6) SQL 쿼리 작성하기!

참 쉽죠? 여러분은 이제 범주에 따라 통계치를 계산할 수 있는 사람이 되었답니다! 







별칭 기능
Alias [알리아스]

1. 첫번째 알리아스

select * from orders o
                          --
where o.course_title = '앱개발 종합반'
        --


2. 두번째 알리아스
select payment_method, count(*) as cnt from orders o
                                          -------
where o.course_title = '앱개발 종합반'
group by payment_method




<숙제>
select payment_method, count(*) as 주문건수 from orders o
where o.email like '%naver.com'
and o.course_title = '앱개발 종합반'
group by o.payment_method 









[3주차]

Join
테이블과 테이블을 붙히는 것
테이블을 붙일 때 기준이 뭔가 하나 필요하다.
(예를 들면, 두 테이블에 공통으로 들어있는 user_id)
(통상적으로 key값이라 부르는 것들이 그러하다)
(엑셀의 vlookup과 동일한데, vlookup보다 쉬움. 그래서 엑셀보다 쉬운 SQL이 되는 것임. 후후.)

! join 굉장히 실무에서 많이 쓰임. 거의 다 쓴다고 보시면 돼요. 거의 모든 쿼리에 Join이 들어간다고 보시면 돼요



테이블을 한 목적에 맞는 것들만 모아 두는 것이 가장 좋습니다
그게 실제로 웹서비스가 동작하는데 있어서
훨씬 더 편하고, 간편하고,
또 그렇게 안하면 나중에 뭔가를 수정하고 싶을 때 문제가 많이 생겨요.
그래서 그렇게 많이들 해 둡니다.




Join의 종류
Left Join, Inner Join
(, Outer Join도 있는데 거의 필요가 없음. 위 2개만 잘 써도 원하는 결과 대부분 얻을 수 있을 것)
(Inner Join이 조금 더 쉽고, 많이 쓰임)

Left Join ?
왼쪽에 있는 거 기준으로 붙인다

Inner Join ?
교집합만 나온다.
(Null값이 있는 건 빼고 나온다)

select * from enrolleds e
inner join courses c on e.course_idd = c.course_id


! 알리아스는 안 헷갈려도 붙여주는 게 좋음.
(?왜인지는 안말함.)



select c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
group by c1.title, c2.week     //두가지 다 써서 최대한 다양한 그룹으로 묶음
order by c1.title, c2.week     //앞에거 먼저 정렬하고, 뒤에 거 정렬



select c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id //한 번 더 묶는다. 바로 앞에 거랑 묶음.
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week



1. sql은 같은 결과에 도달할 수 있는 방법이 여러가지예요. 정답이 하나가 아니다.
2. sql을 쓸 때 저도 마찬가지지만, 지금 계속 해나가는 과정이 그랬지만,
이렇게 해봤다가 또 저것도 확인했다가,
어 에러 나네, 고치고,
또 이렇게 콤마도 넣어 보고,
이렇게 왔다 갔다 왔다 갔다
하면서 만들면 되는 겁니다. 아셨죠?
그 누구도, 한 번에 쭉 위에서부터 써 가지고
탁 실행시켜서 '음 결과가 나왔군~' 이런 사람 없습니다 아셨죠

그래서 정말 심하게 말씀을 드리면
모로 가도 데이터만 나오면 된다
이렇게 일단 생각을 하시고
작업을 하셔도 무방합니다 아셨죠







left join
이런 경우에 많이 쓰겠죠.
한쪽에는 있는데 한쪽에는 없는 것을 가지고 통계내고 싶을 때

그러니, 더 큰 걸 왼쪽에 둠.

null을 찾는 거, null을 빼는 거
NULL은 대문자로 쓸 것

select u.name, count(*) as cnt from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is not NULL
group by u.name

!
count는 NULL을 제외하고 센다.

!
강의 3-7 끝에 정렬 내용 나옴.






Union
필드가 다 똑같은데, (필드명이 같다)
이어보고 싶을 때 씀.
(예를 들어, 7월달 것과 8월달 것)

(
select '7월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at < '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week
)
union all
(
select '8월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week
)

! union에선 order by 가 안먹는다. (그래서 위에서 order by 두 줄을 빼도 결과 같음.)
(다 나온 다음에 order를 해야지, order를 한 상태로 합치는 건 안된다는 거예요.
그래서 다 나온 다음에 다시 한 번 정렬 순서를 주는 방법이 있습니다.) -> 4주차 서브퀴리 개념



클렌징
case when문을 써서
서브쿼리로 계속 써야

엑셀에서 해라






숙제: enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기. user_id도 같이 출력되어야 한다.



select e.enrolled_id, e.user_id, count(*) as max_count from enrolleds e
inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id
where done = 1
group by e.enrolled_id, e.user_id
order by max_count desc



숙제는 이렇게 나왔으니 시험문제면 
group by에
group by e.enrolled_id, e.user_id 든 group by e.enrolled_id 든 맞겠지만,

실제 업무에선 select문에 맞춰서 group by도 만들어야 함.

(enrolled_id는 내가 강의들을 때 부여받는 아이디)
여기선 enrolled_id로 그룹지어도 user_id가 중복이 되지 않겠지만,
그런 문제가 생길 수 있으니
실제 업무에선 select문에 맞춰서 group by도 만들어야 함.








[4주차]

이번 주차까지 다 하시면요
이제는 거의 왠만한 문법들은 다 다루셨다고 생각하시면 되고
이 문법들을 거의 조합해가지고
약간의 트릭이라든지
아니면 실전에서의 응용이라든지
이런 것들만 실력을 넓혀나가면 되는
그런 단계에 이를 겁니다 아셨죠



Subquery
여러분이 조금 더 쿼리문을 복잡하게 쓸 수 있게 하는 테크닉

배울 것
1. Subquery
2. Subquery를 좀 더 간결하게 보일 수 있도록 하는 with 구문에 대해서도 배울 거고요
3. 이 현실에서의 데이터는요 여러분 지저분하고 복잡합니다.
그래서 여기 현실에서의 데이터를 가공할 수 있는
그런 문자열들을 가지고 어떻게 가공할 수 있는지
문자열을 가지고 노는 법
4. 그 다음에 마지막으로 이 case when이라고 하는
조건문에 대해서도 배워보겠습니다.

여기까지 딱 배우시면
이제는 문법은 다 배우신 거예요


이제 분석 가능한 사람이다.



'SQL' 카테고리의 다른 글

엑셀보다 쉬운 SQL - 후기  (0) 2021.10.24
엑셀보다 쉬운 SQL - 4주차  (0) 2021.10.24
엑셀보다 쉬운 SQL - 3주차  (0) 2021.10.24
엑셀보다 쉬운 SQL - 2주차  (0) 2021.10.24
엑셀보다 쉬운 SQL - 1주차  (0) 2021.10.24
Posted by 캬웃
,