<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>3rd_factory.log</title>
        <link>https://velog.io/</link>
        <description>.</description>
        <lastBuildDate>Wed, 05 Jan 2022 13:59:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>3rd_factory.log</title>
            <url>https://images.velog.io/images/3rd_factory/profile/b49afa99-eea3-4a1c-b359-b94bf4774421/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 3rd_factory.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/3rd_factory" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[내일배움단 sql 3일차]]></title>
            <link>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8-sql-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8-sql-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 05 Jan 2022 13:59:35 GMT</pubDate>
            <description><![CDATA[<p>sql 왕초보 버전으로 수강해보니 이거 매우 엑셀스럽다.</p>
<pre><code>join on</code></pre><p>엑셀의 vlookup 과 유사한 기능으로
두 시트에서 동일한 값을 기준으로 서로 매칭시켜준다.</p>
<h4 id="left-join--on-a--b">left join ~ on A = B</h4>
<pre><code>select * from users u
left join point_users p
on u.user_id = p.user_id</code></pre><p>users 시트와 point_users 시트에서
user_id 값으로 매칭
단, 왼쪽 데이터 기준으로 정렬됨.</p>
<p><img src="https://images.velog.io/images/3rd_factory/post/3864cac1-ab82-470b-9d9b-3795b63503a7/image.png" alt=""></p>
<h4 id="inner-join--on-a--b">inner join ~ on A = B</h4>
<pre><code>select * from users u
inner join point_users p
on u.user_id = p.user_id</code></pre><p><img src="https://images.velog.io/images/3rd_factory/post/53ca7ca7-c962-43af-b5b1-eabf6ce50b8c/image.png" alt=""></p>
<p>위의 left join과 결과값은 유사하지만
null 값이 없이 데이터가 꽉 찬 것만 연결.</p>
<h4 id="sql-쿼리가-실행되는-순서">SQL 쿼리가 실행되는 순서</h4>
<pre><code>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 &#39;%naver.com&#39;
group by u.name</code></pre><p><font color='blue'>from → join → where → group by → select</font></p>
<ol>
<li><p>from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.</p>
</li>
<li><p>inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)</p>
</li>
<li><p>where u.email like &#39;%naver.com&#39;: users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.</p>
</li>
<li><p>group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.</p>
</li>
<li><p>select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.</p>
</li>
</ol>
<h4 id="join-연습1">Join 연습1</h4>
<p><img src="https://images.velog.io/images/3rd_factory/post/590aa7dc-ffe1-45bd-949c-de66b3a91a9c/image.png" alt=""></p>
<ol>
<li><p>내가 쓴 코드</p>
<pre><code>select o.payment_method, round(avg(pu.point),2) from point_users pu 
inner join orders o on pu.user_id = o.user_id 
group by o.payment_method</code></pre></li>
<li><p>답안 코드</p>
<pre><code>select o.payment_method, round(AVG(p.point)) from point_users p
inner join orders o 
on p.user_id = o.user_id 
group by o.payment_method</code></pre></li>
<li><p>고찰
select 와 form 사이에 써야할 단어...들에서
alias가 o인지 pu인지 많이 헛갈렸다.
노트에 어떤 시트에 어떤 필드가 있는지 기록해놔야 안헷갈릴듯....</p>
</li>
</ol>
<h4 id="join-연습2">Join 연습2</h4>
<p><img src="https://images.velog.io/images/3rd_factory/post/e59fb083-2e04-43b0-b210-33cf2c78427d/image.png" alt=""></p>
<ol>
<li><p>내가 짠 코드</p>
<pre><code>select name, count(*) from enrolleds e
inner join users u 
on e.user_id = u.user_id
where is_registered = 0
group by name
order by count(*)</code></pre></li>
<li><p>답안 코드</p>
<pre><code>select name, count(*) as cnt_name from enrolleds e
inner join users u
on e.user_id = u.user_id 
where is_registered = 0
group by name
order by cnt_name desc</code></pre></li>
<li><p>고찰
자꾸 select와 from 사이에 넣는게 헷갈린다...
답안 코드에서는 count(*) 필드명을 cnt_name 으로 변경하였고
변경된 필드명(cnt_name)을 내림차순으로 정렬하였다.</p>
</li>
</ol>
<h4 id="join-연습3">Join 연습3</h4>
<p><img src="https://images.velog.io/images/3rd_factory/post/7fa4d62d-f1c4-4b74-909d-d218403bdb53/image.png" alt=""></p>
<ol>
<li>내가 짠 코드<pre><code>select c.course_id, title, count(*) from courses c
join enrolleds e on c.course_id = e.course_id 
where is_registered = 0
group by c.course_id
</code></pre></li>
</ol>
<pre><code>
2. 답안 코드</code></pre><p>select c.course_id, c.title, count(*) as cnt_notstart from courses c
inner join enrolleds e 
on c.course_id = e.course_id
where is_registered = 0
group by c.course_id</p>
<pre><code>3. 고찰
alias를 붙였다 안붙였다....난리다 ㅎㅎ
inner join으로 안쓰고 join으로 썼는데도 같은 결과가 나왔다.
왜 그럴까......???
이건 질문해봐야겠다.

그리고..., 퀴즈에서 제공한 이미지를 잘 관찰해야겠다.
또 필드명을 안바꿨네....

#### Join 연습4
![](https://images.velog.io/images/3rd_factory/post/2f371219-3293-4856-a8c5-9f80d35d7f20/image.png)

1. 내가 짠 코드</code></pre><p>select c1.title, 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</p>
<pre><code>2. 답안 코드</code></pre><p>select c1.title, c2.week, count(*) as cnt from checkins c2
inner join courses c1 on c2.course_id = c1.course_id
group by c1.title c2.week
order by c1.title, c2.week</p>
<pre><code>3. 고찰
어.....이번 코드는 다른 부분들이 좀 있다.
일단, 시트 붙이는 순서를 서로 바꿔놨다.....
헌데 같은 결과를 낳았다 ㅎㅎㅎㅎ
두 개 시트가 공통되는 필드가 있기에 순서가 좀 바뀌어도
원하는 결과가 나온 것 같다.
내가 짠 코드에서는 week은 순서대로 정렬을 안했었는데
답안 코드에서는 week도 정렬하였다. 

#### Join 연습5
![](https://images.velog.io/images/3rd_factory/post/357114ea-8a7e-4f86-88ec-25d6973c259e/image.png)

1. 내가 짠 코드</code></pre><p>select c1.title, 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 &gt;= &#39;2020-08-01&#39;
group by c1. title, c2.week
order by c1. title, c2.week</p>
<pre><code>2. 답안 코드</code></pre><p>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 &gt;= &#39;2020-08-01&#39;
group by c1.title, c2.week
order by c1.title, c2.week</p>
<pre><code>3. 고찰
우와....이건 좀 시간 걸렸다.
퀴즈4 에서 하나씩 데이터를 다시 확인해보며 짰는데
where 문 위치를 맨 아랫줄에 넣었더니 자꾸 에러가 나서....
group by 위로 올렸더니 실행이 되었다.
답안 코드랑 미묘하게 코드가 다르긴 한데
어쨌든 결과는 똑같이 나왔다 ㅋㅋㅋㅋ

#### 여기서 퀴즈! 막해보기 (left join)
![](https://images.velog.io/images/3rd_factory/post/7ee12d8f-9675-4243-908e-5e1921b1375b/image.png)

1. 내가 쓴 코드</code></pre><p>select count(pu.point) as pnt_user_cnt, 
        count(<em>) as tot_user_cnt, 
        round(count(point_user_id)/count(</em>),2) as ratio 
        from users u
left join point_users pu on u.user_id = pu.user_id
where u.created_at between &#39;2020-07-10&#39; and &#39;2020-07-20&#39;</p>
<pre><code>2. 답안 코드</code></pre><p>select count(point_user_id) as pnt_user_cnt,
       count(<em>) as tot_user_cnt,
       round(count(point_user_id)/count(</em>),2) as ratio
  from users u
  left join point_users pu on u.user_id = pu.user_id
 where u.created_at between &#39;2020-07-10&#39; and &#39;2020-07-20&#39;</p>
<p>```
3. 고찰
ratio 계산식 쓸 때 버버벅...
count(point_user_id)/count(*) 을 써야하는데
pnt_user_cnt/tot_user_cnt
를 썼었다 ㅎㅎㅎㅎ
필드명을 명명한 것과 필드명(값)은 구분해야한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[내일배움단 sql 2일차]]></title>
            <link>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8-sql-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8-sql-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 04 Jan 2022 13:17:00 GMT</pubDate>
            <description><![CDATA[<h4 id="퀴즈-앱개발-종합반의-결제수단별-주문건수-세어보기">[퀴즈] 앱개발 종합반의 결제수단별 주문건수 세어보기</h4>
<ol>
<li>내가 쓴 코드</li>
</ol>
<pre><code>select payment_method, count(*) from orders
where course_title = &#39;앱개발 종합반&#39;
group by payment_method</code></pre><ol start="2">
<li>답안 코드<pre><code>select payment_method, count(*) from orders
where course_title = &quot;앱개발 종합반&quot;
group by payment_method;</code></pre></li>
<li>고찰
잘 알려주신 덕분에, 퀴즈를 풀어보니
거의 똑같이 코드를 짠 듯 하다.
차이점이 있다면 답안 코드에서는 맨 끝에 &#39;;&#39; 세미콜론이 들어간다.
안 써도 코드는 돌아가던데....
코드를 마무리한다는 뜻인걸까?</li>
</ol>
<h4 id="퀴즈-gmail-을-사용하는-성씨별-회원수-세어보기">[퀴즈] Gmail 을 사용하는 성씨별 회원수 세어보기</h4>
<ol>
<li><p>내가 쓴 코드</p>
<pre><code>select name, count(*) from users
where email like &#39;%gmail.com&#39;
group by name
order by count(*) desc</code></pre></li>
<li><p>답안 코드</p>
<pre><code>select name, count(*) from users
where email like &#39;%gmail.com&#39;
group by name;</code></pre></li>
<li><p>고찰
유사하게 잘 짰다.
순서대로 나열 하는 것도 추가했었는데
퀴즈에서 요구한 것보다 한 줄 더 쓴듯...ㅋㅋ
여기도 답안코드의 마지막 줄을 보니 ; 으로 끝난다.</p>
</li>
</ol>
<h4 id="퀴즈-course_id별-오늘의-다짐에-달린-평균-like-개수-구해보기">[퀴즈] course_id별 &#39;오늘의 다짐&#39;에 달린 평균 like 개수 구해보기</h4>
<ol>
<li>내가 쓴 코드<pre><code>select course_id, avg(likes) from checkins
group by course_id </code></pre></li>
</ol>
<ol start="2">
<li><p>답안 코드</p>
<pre><code>select course_id, avg(likes) from checkins
group by course_id;</code></pre></li>
<li><p>고찰
답안과 코드 유사. 마지막 줄 ; 은 다르다.
다만, 앞에 2개 퀴즈는 보자마자 1분 내에 썼는데
이거는 조금 시간이 걸렸다. 1~2분 정도.
select course_id, avg(likes)를 써야하는걸
select likes, avg(likes)로 썼더니 이상해져서...
이것저것 바꿔보다가 저게 맞다는 걸 알게되었다.</p>
</li>
</ol>
<h4 id="숙제-네이버-이메일을-사용하여-앱개발-종합반을-신청한-주문의-결제수단별-주문건수-세어보기">숙제: 네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기</h4>
<ol>
<li><p>내가 쓴 코드</p>
<pre><code>select payment_method, count(*) from orders
where email like &#39;%@naver%&#39; 
group by payment_method</code></pre></li>
<li><p>답안 코드</p>
<pre><code>select payment_method, count(*) from orders
where email like &#39;%naver.com&#39; and course_title = &#39;앱개발 종합반&#39;
group by payment_method</code></pre></li>
<li><p>고찰
쉽네<del>~</del> 하고 썼다가
답안 코드의 &#39;and course_title = &#39;앱개발 종합반&#39; 보고
살짝 당황했다. 숙제 문제를 읽다 말았네요..흑..</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[내일배움단_sql 1주차]]></title>
            <link>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8sql-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@3rd_factory/%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EB%8B%A8sql-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 03 Jan 2022 13:37:53 GMT</pubDate>
            <description><![CDATA[<p>개강은 12월 20일에하고
그주에 0주차 오리엔테이션은 들었지만...
1주차 시작을 오늘에서야 했다.
튜터님의 문자를 보고 부리나케 들어가보니
sql반은 1주하고도 6일만 기간이 남았길래 어찌나 놀랬던지.....</p>
<p>총 5주차 분량을 들어야하니
부지런히 다 들어야겠다.</p>
<hr>
<p>오늘 배운 내용
Dbeaver </p>
<p><strong>Select</strong> </p>
<p>1) 어떤 테이블에서 2) 어떤 필드의 데이터를 가져올지</p>
<p><strong>select * from</strong></p>
<p>ex1) <strong>select * from</strong> orders <strong>where</strong> email <strong>like</strong> &#39;%naver%&#39;
orders 시트에서 email 필드에 &#39;naver&#39;단어가 포함되어 있는 데이터 찾기</p>
<p>ex2) <strong>select * from</strong> orders <strong>where</strong> email <strong>like *<em>&#39;%naver%&#39; and course_title = &#39;웹개발 종합반&#39; *</em>and</strong> payment_method = &#39;kakaopay&#39;
orders 시트에서 email 필드에 &#39;naver&#39;단어가 포함디어 있고, 웹개발 종합반을 수강하며, 결제를 &#39;kakaopay&#39;로 한 데이터 찾기</p>
<p>!= 같지 않음</p>
<p>between OO and OO 범위</p>
<p>ex3) <strong>select * from</strong> orders
<strong>where</strong> created_at <strong>between</strong> &quot;2020-07-13&quot; <strong>and</strong> &quot;2020-07-15&quot;;
orders 시트에서 created_at 필드영역에서 2020년 7월 13일부터 2020년 7월 14일까지의 데이터 찾기</p>
<p>&lt;특이사항&gt; 
between A and B 는 A 이상 B 미만 이라는 뜻.
A 초과 B 미만은 아닌 것 같다.</p>
<p>in  포함
ex4) <strong>select * from</strong> checkins <strong>where</strong> week <strong>in</strong> (1, 3);</p>
<hr>
<p>sql 이라길래 처음 들어보는 거라 살짝 긴장했는데
막상 들어보니
예전에 하던 idl이랑 꽤 비슷하다.
겁먹지 말고 지난주부터 할걸 ㅜㅜ</p>
]]></description>
        </item>
    </channel>
</rss>