<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>databyshasha.log</title>
        <link>https://velog.io/</link>
        <description>데이터 분석 &amp; 서비스 기획</description>
        <lastBuildDate>Sat, 03 Aug 2024 10:41:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>databyshasha.log</title>
            <url>https://velog.velcdn.com/images/shasha_malone/profile/9b2d7455-afc0-4db4-90a1-d031848d2c03/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. databyshasha.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/shasha_malone" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[노션 프로젝트 관리 템플릿]]></title>
            <link>https://velog.io/@shasha_malone/%EB%85%B8%EC%85%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC-%ED%85%9C%ED%94%8C%EB%A6%BF</link>
            <guid>https://velog.io/@shasha_malone/%EB%85%B8%EC%85%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC-%ED%85%9C%ED%94%8C%EB%A6%BF</guid>
            <pubDate>Sat, 03 Aug 2024 10:41:00 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><a href="https://velog.io/@sasha1107/%EB%85%B8%EC%85%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC-%ED%85%9C%ED%94%8C%EB%A6%BF-%EA%B3%B5%EC%9C%A0">노션 팀 프로젝트 협업,관리 템플릿 공유</a></p>
</li>
<li><p>[프로젝트 - 작업 단위 관리 템플릿] (<a href="https://www.notion.so/ko-kr/templates/anthropics-project-planner">https://www.notion.so/ko-kr/templates/anthropics-project-planner</a>)
사용해본 템플릿 중에 제일 괜찮아서 자주 쓸듯</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[ChatGPT 어플리케이션 제작 관련 사이트]]></title>
            <link>https://velog.io/@shasha_malone/ChatGPT-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%A0%9C%EC%9E%91-%EA%B4%80%EB%A0%A8-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@shasha_malone/ChatGPT-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%A0%9C%EC%9E%91-%EA%B4%80%EB%A0%A8-%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Tue, 23 Jul 2024 07:55:34 GMT</pubDate>
            <description><![CDATA[<h4 id="chatgpt-어플리케이션-제작-관련-사이트">ChatGPT 어플리케이션 제작 관련 사이트</h4>
<blockquote>
<p><a href="https://www.grownbetter.com/article/259">[그로우앤버터] 챗 GPT란? | 실무에 적용할 수 있는 Chat GPT 활용법 5가지</a></p>
</blockquote>
<ul>
<li><p>GPT을 활용한 새로운 어플리케이션을 만들기 보다, 지금 활성화되고 있는 어플리케이션들을 활용</p>
</li>
<li><p>가장 많이 사용하는 툴은 프롬프트 지니입니다. 다들 아시다시피 챗 GPT에서 한글을 사용하게 되면 생각 보다 빠르지 않고 자료도 많지 않습니다. </p>
</li>
<li><p>서 챗 GPT에 한글을 적으면 자동으로 번역해서 영어로 입력해주고, 결과에 대해서도 한글로 변환해주는 프롬프트 지니를 활용하면 업무 효율을 높일 수 있어요!</p>
</li>
</ul>
<p>아래에 활용하기 좋은 사이트를 모아두었으니 꼭 활용해보세요.</p>
<table>
<thead>
<tr>
<th>제목</th>
<th>목적</th>
<th>링크</th>
</tr>
</thead>
<tbody><tr>
<td>Replit + Chroma</td>
<td>어플리케이션 제작</td>
<td><a href="https://blog.replit.com/chroma">Replit + Chroma</a></td>
</tr>
<tr>
<td>Hugging Face Space</td>
<td>Model, Dataset 공유</td>
<td><a href="https://huggingface.co/spaces">Hugging Face Space</a></td>
</tr>
<tr>
<td>Toolkit</td>
<td>AI 플러그인 개발</td>
<td><a href="https://www.toolkit.club/">Toolkit</a></td>
</tr>
<tr>
<td>yeagerai-agent</td>
<td>First Langchain Agent Creator</td>
<td><a href="https://github.com/yeagerai/yeagerai-agent">yeagerai-agent</a></td>
</tr>
<tr>
<td>xturing</td>
<td>나만의 LLM을 위한 파인 튜닝</td>
<td><a href="https://github.com/sto">xturing</a></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[A/B test] Ch6. 조직 운영을 위한 지표 | 목표지표, 동인 지표, 가드레일 지표]]></title>
            <link>https://velog.io/@shasha_malone/AB-test-Ch6.-%EC%A1%B0%EC%A7%81-%EC%9A%B4%EC%98%81%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%A7%80%ED%91%9C-%EB%AA%A9%ED%91%9C%EC%A7%80%ED%91%9C-%EB%8F%99%EC%9D%B8-%EC%A7%80%ED%91%9C-%EA%B0%80%EB%93%9C%EB%A0%88%EC%9D%BC-%EC%A7%80%ED%91%9C</link>
            <guid>https://velog.io/@shasha_malone/AB-test-Ch6.-%EC%A1%B0%EC%A7%81-%EC%9A%B4%EC%98%81%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%A7%80%ED%91%9C-%EB%AA%A9%ED%91%9C%EC%A7%80%ED%91%9C-%EB%8F%99%EC%9D%B8-%EC%A7%80%ED%91%9C-%EA%B0%80%EB%93%9C%EB%A0%88%EC%9D%BC-%EC%A7%80%ED%91%9C</guid>
            <pubDate>Sun, 05 May 2024 14:40:53 GMT</pubDate>
            <description><![CDATA[<h1 id="ch06-조직-운영을-위한-지표">CH06 조직 운영을 위한 지표</h1>
<h3 id="intro"><strong>intro</strong></h3>
<ul>
<li>조직은 좋은 지표를 가져야 한다 → 설명 책임을 측정<ul>
<li>OKR( Objective , Key, Results 목표, 핵심, 결과 )</li>
<li>Objective : 장기 목표</li>
<li>Results  : 목표를 향한 단기적이고 측정 가능한 결과</li>
<li>목표를 향한 진보를 추적하기 위한 좋은 지표가 필요하다 (기준, 작성 및 평가 방법)</li>
</ul>
</li>
</ul>
<h3 id="지표의-분류">지표의 분류</h3>
<ul>
<li>조직 지표 전체에 초점을 맞춰 논의 ( 7장 , 실험에 대한 특정 지표 논의 , 21장 실험에 경보를 주는 가드레일 지표 )</li>
<li>조직지표<strong>는 목표지표, 동인지표, 가드레일 지표</strong>가 있음</li>
</ul>
<h3 id="1-목표-지표goal-metrics--성공지표-북극-지표"><strong>1. 목표 지표goal metrics = 성공지표, 북극 지표</strong></h3>
<blockquote>
<p>목표 지표 : <strong>추구하는 궁극적 성공을 포착하는 단일 or 작은 지표 집합 (</strong>조직이 궁극적으로 무엇을 신경쓰는지를 보여주는것)</p>
<ul>
<li><p>각 이니셔티브가 지표에 미치는 영향이 작거나, 영향을 실현하는 시간이 오래 걸림</p>
<p>  → 단기적으로 움직이는 지표 x</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>목표 → 지표 : 목표의 지표화</strong></p>
<p>목표 : 조직이 궁극적으로 원하는 것, 미션과 직접적으로 관련</p>
<p>지표 : 목표를 위해 측정 가능한 형태로 변환하는 것 </p>
<ul>
<li>완벽한 변환이 어려우므로 명확하게 표현해야함</li>
<li>시간에 따른 개선 필요</li>
</ul>
</blockquote>
<blockquote>
<p><strong>목표 지표의 도출 방법</strong></p>
<ul>
<li>조직의 지도자(C-Level)들은 목표 지표를 도출하기 위해 “당신의 제품이 존재하는 이유는? 귀사의 성공은 어떤 모습인가?”와 같은 질문에 대답해야 하며 이는 회사의 미션과 결부</li>
</ul>
<p>예) 마이크로 소프트의 미션 : 지구상의 모든 사람과 모든 조직에 더 많은 것을 성취하도록 힘을 싣는다 / 구글 미션 - 세계의 정보를 정리한다</p>
</blockquote>
<h3 id="2-동인-지표-driver-metrics--사인-포스트-지표-대리-지표-간접-지표-예측-지표"><strong>2. 동인 지표 Driver metrics = 사인 포스트 지표, 대리 지표, 간접 지표, 예측 지표</strong></h3>
<blockquote>
<p>목표 지표보다 단기적으로 움직임, 더 민감한 지표</p>
</blockquote>
<blockquote>
<p><strong>조직을 성공으로 이끌기 위한 인과관계 모델</strong></p>
<ul>
<li><p>성공 요인이 어떤 가설을 반영하는가</p>
<p>  → 성공 그 자체보다는 성공으로 이어지는 요인에 집중</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>무엇이 성공을 이끄는가에 대해 생각할 수 있는 몇가지 프레임워크</strong></p>
<ul>
<li><strong>HEART 프레임워크:</strong> Happiness, Engagement, Adoption, Retention, Task Success
<img src="https://velog.velcdn.com/images/shasha_malone/post/0611a186-4af7-4ed3-a5f4-f7a1f1217066/image.png" alt=""></li>
</ul>
<p><a href="https://brunch.co.kr/@uxdaysseoul/3">이미지출처</a></p>
<ul>
<li><strong>PIRATE 프레임워크:</strong> (AARRR(Acquisition(획득), Activation(활성), Retention(유지), Referred(조회), Revenue(매출)) 또는 전반적인 사용자 퍼널(user funnel))</li>
</ul>
<pre><code>✍️ **Funnel(퍼널)**

- 깔때기
- 제품에서 특정 결과에 도달하는데 필요한 단계를 정의하고 활용
- 퍼널은 앞에서 뒤로 개선하는 것보다 뒤에서 앞으로 개선하는 것이 좋음
    - 결제할 사람을 확실히 결제하게 만들고, 나중에 유입을 늘리기
    - AARRR와 관련된 개념
- 배달 앱 예시
    - 메인 화면
    - 음식점 화면
    - 음식 세부 화면
    - 장바구니 화면
    - 결제 화면
    - 결제 완료</code></pre><p>✍️ <strong>AARRR Activation(활성), Retention(유지), Referred(조회), Revenue(매출)</strong></p>
<pre><code>- Acquisition : 얼마나 제품에 접근하는가?
- Activation : 고객이 최초의 좋은 경험을 하는가?
- Retention : 다시 제품을 사용하는가?
- Revenue : 얼마나 돈을 버는가?
- Referral : 다른 사람에게 공유하는가</code></pre><ul>
<li>위의 프레임워크를 통해 궁극적으로 매출을 달성하기 전에 회사는 사용자를 확보하고 그들의 제품이 사용자를 유지할 만큼 충분한 매력을 가지고 있는지 확인 가능.</li>
</ul>
</blockquote>
<h3 id="3-가드레일-지표-guardrail-metric">3. 가드레일 지표 guardrail metric</h3>
<p>크게 2가지로 분류됨</p>
<ol>
<li><strong>⭐ 조직 가드레일 지표: 비즈니스를 보호하는 지표</strong><ul>
<li>떨어지면 안되는 지표</li>
<li>서비스에 악영향을 주었는지를 파악하는 지표</li>
</ul>
</li>
<li>신뢰도 가드레일 지표: 실험 결과의 신뢰성과 내적 타당성을 평가하는 지표 → 21장</li>
</ol>
<p><strong>조직 가드레일 지표</strong></p>
<blockquote>
<p><strong>중요한 제약을 위반하지 않고</strong>, 적절한 균형을 가지고 성공을 향해 나아가기 위해 중요.</p>
<ol>
<li><p>가능한 많은 사용자를 등록 ↔ 사용자당 참여 수준이 급격히 떨어지면 안됨!</p>
</li>
<li><p>암호 회사 : 보안(해킹, 정보도난 x) ↔ 사용 편의성 및 접근성이 떨어지면 안됨!</p>
<p> ⇒ 둘 사이 트레이드 오프 </p>
</li>
<li><p>기능 출시 ↔ 페이지 로드 시간이 기능때문에 크게 늘어나면 안됨!</p>
</li>
</ol>
<p>⇒ 종종 목표 지표나 동인 지표보다 더 민감.</p>
</blockquote>
<ul>
<li>지표 예시<ol>
<li><strong>지연 시간</strong>: 몇 초라도 지연 시간을 증가시키면 매출 손실이 발생하고 사용자 만족도가 감소할 수 있어 가드레일 지표로 자주 사용.</li>
<li><strong>페이지당 HTML 응답 크기</strong>: 만약 응답 크기가 크다면 이는 대량 코드 도입을 의미할 가능성 有 → 최적화가 필요한 불완전한 코드를 찾아내어 응답 크기를 줄이는 액션을 취할 수 있음.</li>
<li><strong>페이지당 자바스크립트 오류 수</strong>: 이 지표를 브라우저별로 세분화해서 관찰한다면 자바스크립트 문제가 브라우저 종속적인지의 여부를 확인할 수 있음.</li>
<li><strong>사용자당 매출</strong>: 전체적인 매출보다는 통계적 분산이 크기 때문에 가드레일로 사용하기 적합할 수 있음. 보다 민감하게 변형 가능(사용자당 매출 여부, 사용자당 매출 상한, 페이지당 매출 등)</li>
<li><strong>사용자당 페이지뷰</strong>: 분모 즉, 전체 페이지뷰 수의 변화가 예기치 못한 것이라면 신중히 검토할 필요.</li>
<li><strong>클라이언트 충돌</strong>: 해당 지표는 클라이언트 소프트웨어나 휴대폰 앱에서 중요한 가드레일 지표임. 사용자당 충돌 수나 전체 사용자당 충돌 여부의 평균은 분산이 작아 이른 단계에서 통계적으로 유의하므로 일반적으로 사용됨.</li>
</ol>
</li>
</ul>
<h3 id="4-ab테스트-지표-설정-예시">4. A/B테스트 지표 설정 예시</h3>
<p><strong>1. [헬로우봇 스킬스토어 이미지 A/B테스트]</strong></p>
<p>   <a href="https://brunch.co.kr/@jyoungly/6">A/B 테스트의 기술</a></p>
<p><strong>2. [당근마켓의 랜딩페이지 A/B테스트]</strong></p>
<p><a href="https://brunch.co.kr/@meetcute/72">당근마켓의 랜딩페이지, A/B테스트를 통해 개선해보자</a></p>
<hr>
<p>목표지표, 동인지표, 가드레일 지표외에 다른 ‘비즈니스 지표 분류법’, ‘실험에 대한 지표’도 존재한다!</p>
<h3 id="비즈니스-지표">비즈니스 지표</h3>
<blockquote>
<p><strong>자산 지표 vs 참여 지표</strong></p>
<ul>
<li>자산 지표: 총 페이스북 사용자(계정) 수 또는 연결 수와 같이 <strong>정적인 자산의 축적 측정</strong></li>
<li>참여 지표: 세션 또는 페이지뷰와 같은 사용자의 행동이나 다른 사용자의 제품 이용에 의해 받는 <strong>가치 측정</strong></li>
</ul>
</blockquote>
<blockquote>
<p><strong>비즈니스 지표 vs 운영 지표</strong></p>
<ul>
<li>비즈니스 지표: 사용자당 매출 또는 DAU(일일 활성 사용자 수) 등 <strong>비즈니스의 상태 추적</strong></li>
<li>운영 지표: 초당 쿼리 등 <strong>운영상의 문제</strong>가 있는지 추적</li>
</ul>
</blockquote>
<h3 id="실험에-대한-지표">실험에 대한 지표</h3>
<blockquote>
<p><strong>데이터 품질 지표</strong></p>
<p>기초 실험의 내적 타당성과 신뢰도 보장(3장/21장)</p>
</blockquote>
<blockquote>
<p><strong>진단 또는 디버그 지표</strong></p>
<ul>
<li><p>목표, 동인 또는 가드레일 지표가 문제를 나타내는 상황을 자세히 검토할 때 추가적인 세분화 또는 기타 정보 제공 가능</p>
</li>
<li><p>너무 세부적해서 지속적으로 추적x ⇒ 상황을 파악할 때 추가적으로 세분화할때 사용!</p>
<p>  예시 1) <strong>클릭율이 핵심 지표(목표, 동인 또는 가드레일 지표)인 경우</strong></p>
<p>  페이지의 특정 영역에서 클릭을 나타내는 20개의 지표(진단 또는 디버그 지표)로 세분화 가능</p>
<p>  예시 2) <strong>매출이 핵심 지표인 경우</strong> </p>
<p>  매출을 2가지 지표로 분해</p>
<p>  평균 전체 매출은 두 지표 통합 / 각 지표는 매출에 대해 다른 의미 가짐</p>
<ul>
<li><p><strong>사용자의 구매 여부(0/1)</strong>을 측정하는 지표</p>
<p>  → 더 많은/적은 사람들이 구입해서 매출이 증/감</p>
</li>
<li><p>구매한 경우에만 구매액을 나타내고, 그렇지 않은 경우 무효한 값을 가지는 <strong>조건부 매출 지표</strong></p>
<p>  <strong>→</strong> 평균 구매 가격이 변해서 매출이 증/감</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<h3 id="전체적인-목표와-전략적-방향에-각-팀의-지표를-일치시키는-것의-중요성">전체적인 목표와 전략적 방향에 각 팀의 지표를 일치시키는 것의 중요성</h3>
<blockquote>
<p> 각 팀은 회사의 전반적인 성공에 다르게 기여함.(어떤 팀은 채택에, 다른 팀은 보존이나 성능 지연에)</p>
</blockquote>
<ul>
<li><strong>각 팀은 팀의 지표</strong>가 <strong>전체 회사 지표</strong>에 어떻게 연결되어 있는 지 <strong>목표와 가설</strong> 밝혀야함</li>
<li>동일한 지표가 팀마다 다른 역할 할 수 있음<ul>
<li>어떤팀 :지연 시간 → 가드레일 지표 vs 인프라팀 : 지연시간 → 성능지표/목표지표</li>
</ul>
</li>
</ul>
<blockquote>
<p> 전체 목표와 팀의 지표의 일치 예시
    - 목표지표 : 장기매출 / 비즈니스 동인지표 : 사용자 참여 및 보존 인 제품 개발 중인 상황
    - 제품 지원 사이트 팀 ⇒ ‘<strong>사이트에서의 시간’</strong>을 동인 지표로 설정하려고 할 때, 더 많은 시간이 좋은 지/나쁜 지 판단하는 기준은 “회사 전체 수준의 지표와 이해관계에 일치하는가”</p>
</blockquote>
<h3 id="지표의-공식화-원리와-기법">지표의 공식화: 원리와 기법</h3>
<p>질적 개념을 구체적이고 계량화할 수 있는 정의로 가져가는 것</p>
<ul>
<li>예 ) 매출 → 장기 매출로 정의, 성공 측정 어려움 → 사용자 행복, 사용자 신뢰</li>
</ul>
<h3 id="1-지표-개발-시-주요-원칙">1. 지표 개발 시 주요 원칙</h3>
<blockquote>
<p>목표 지표</p>
<ul>
<li><strong>단순성</strong>: 모두가 쉽게 이해하고 폭넓게 수용 가능해야 함.</li>
<li><strong>안정성</strong>: 새로운 기능을 실행할 때마다 업데이트할 필요가 없어야 함.</li>
</ul>
</blockquote>
<blockquote>
<p>동인 지표</p>
<ul>
<li><strong>목표와 이해 관계 일치 여부</strong>: 동인 지표가 성공의 동인인지 검증해야 함. 이를 위해 실험을 실행하기도 함.</li>
<li><strong>행동 가능 및 관련성 여부</strong>: 어떤 행동을 통해 동인 지표를 움직일 수 있다고 믿어야 함.</li>
<li><strong>민감성 여부</strong>: 대부분의 이니셔티브로부터의 영향을 측정하기 위해 충분히 민감한지 확인(변동 가능성)</li>
</ul>
<blockquote>
<p>※이니셔티브란? : 일상적인 과업을 말하는 게 아니라, 비전/목적/방향을 향하여 과거와는 다른 특별한 과제 또는 프로젝트를 추진하지 않으면 안되는 상황에서 목표를 달성하기 위한 행동</p>
</blockquote>
<ul>
<li><strong>조작에 대한 내성 여부</strong>: 개인의 유인이나 행동이 지표를 움직이고 조작할 가능성이 없어야 함.</li>
</ul>
</blockquote>
<h3 id="2-지표-개발을-위한-유용한-기법과-고려-사항">2. 지표 개발을 위한 유용한 기법과 고려 사항</h3>
<blockquote>
<p>[1]아이디어 도출(확장성이 낮은 방법의 가설을 사용) → [2]지표의 정확한 정의(확장 가능한 데이터 분석에서 가설 검증) </p>
<blockquote>
<p>[1]아이디어 도출 단계방법 : 사용자 조사, 사용자 경험 연구(UER, User Experience Research)
내용 : 사용자 만족 사용자 작업 성공에 상관되는 행동의 유형 관찰
예: 바운스 레이트(웹사이트 단기간 체류 사용자의 비율) 관찰을 통해 짧은 체류가  불만족과 관련 있을 것이다라는 아이디어 도출 </p>
<p>[2]지표 정의 단계 방법 : 온라인 로그데이터 분석
내용 : 아이디어로 도출된 지표가 높은 수준의 지표인지 판단
예 : 지표를 정밀하게 정의하는데 필요한 정확한 임계값(1페이지뷰 OR 20초)을 결정하는데 도움을 줌 </p>
</blockquote>
</blockquote>
<blockquote>
<ol start="2">
<li>목표나 동인지표를 정의 할때 품질을 고려</li>
</ol>
</blockquote>
<ul>
<li>검색결과의 클릭이 반환버튼 →나쁜 클릭, 웹사이트 적극적 참여 → 좋은 클릭</li>
<li>지표 정의시 품질을 고려하면, 의사결정의 근거가 되는 해석으로 이어질 가능성 커짐 </li>
<li>링크드인이 사용자 대표하는 충분한 정보를 가졌음 → 클릭은 좋은 의미 </li>
</ul>
<blockquote>
<ol start="3">
<li>지표 정의에 통계적 모델을 통합할 때, 모델을 해석 가능한 상태로 유지하고 시간에 걸쳐 검증하는 것이 필수     </li>
</ol>
</blockquote>
<p> • 예시 1) LTV(생애가치)를 계산하여 장기 매출을 측정하고자 너무 복잡한 생존 함수를 사용할 경우, 이해관계자가 이해하기도 어렵고 지표의 하락을 조사하기도 어려우므로 적절치 못한 방법이다.
• 예시 2) 넷플릭스가 동인 지표로 사용하는 “버킷화된 시청 시간”은 해석 가능하고 장기적인 사용자 유지를 나타내기 때문에 적절한 지표이다. </p>
<blockquote>
<ol start="4">
<li>지표 자체가 프록시(대리)라는 것을 기억 </li>
</ol>
</blockquote>
<ul>
<li>CTR(클릭률)이라는 지표로 사용자 참여를 측정할 수 있지만, CTR을 늘리는것에 집중하면  클릭베이트(어그로성 게시물로 클릭율을 높이는 것)증가 시킬 수 있음 </li>
</ul>
<h2 id="지표의-평가">지표의 평가</h2>
<ul>
<li><p>보통 지표평가와 검증은 공식적 단계에서 이루어짐</p>
</li>
<li><p>시간이 지남에 따라 지속적으로 이루어져야 하는 작업 존재</p>
<p>  예) 새 지표를 추가하기 전에 기존 지표와 비교해 추가 정보를 제공하는지 여부 평가</p>
<ul>
<li>생애가치(LTV) 지표는 시간 경과에 따라 평가해서 예측 오류가 작게 유지되도록 해야 함.</li>
</ul>
</li>
</ul>
<pre><code>※생애가치(LTV) 지표 ?
고객이 평생 우리 서비스에 얼만큼을 지불할 것인가를 측정하는 지표



- 실험에 많이 의존하는 지표는 주기적으로 평가해 조작을 초래하는지 여부를 결정해야 함.</code></pre><h3 id="인과관계동인-지표-가드레일-지표-→-목표-지표를-검증하기-위한-접근법">인과관계(동인 지표, 가드레일 지표 → 목표 지표)를 검증하기 위한 접근법</h3>
<ol>
<li><p>설문조사 포커스 그룹, 사용자 경험 연구(UER) 등의 모든 데이터 소스가 같은 방향을 가리키고 있는지 확인</p>
</li>
<li><p>세심하게 수행된 관찰 연구에 대한 관측 자료 분석을 통해 인과관계 가설 무효화 가능
(인과관계 확립은 어려움)</p>
</li>
<li><p>다른 회사에서의 유사한 검증 확인</p>
<ol>
<li>사이트 속도가 매출과 사용자 참여에 어떤 영향을 미치는지에 대한 연구</li>
<li>앱 크기가 앱 다운로드에 미치는 영향을 보여주는 연구</li>
</ol>
</li>
<li><p><strong>지표 평가를 위한 실험</strong></p>
<ol>
<li><p>원인: 고객 충성도 프로그램 → 결과: 고객 유지율↑, 고객 LTV↑</p>
<p> ⇒ 고객 충성도 프로그램을 서서히 롤아웃(출시)하면서 유지율과 고객 LTV가 증가하는지 실험</p>
<pre><code> (실험 결과를 일반화하기 위한 작업 또한 따로 필요함.)</code></pre></li>
</ol>
</li>
<li><p>과거에 축적된 실험 자료 사용하여 지표의 민감도와 인과관계의 정합성 확인 가능
(이때, 과거 실험을 잘 이해하고 신뢰하는 것이 중요)</p>
</li>
</ol>
<h2 id="지표의-진화">지표의 진화</h2>
<h3 id="지표의-변화진화-이유">지표의 변화(진화) 이유</h3>
<ol>
<li><strong>비즈니스의 진화</strong><ul>
<li>비즈니스의 성장 → 경영의 다각화 → 비즈니스의 초점 변경 (고객의 획득(Acquisition) → 참여(Activation) 및 유지(Retention))</li>
<li>e.g.) 전기차 사용자층의 변화: 기술 수용이 빠른 얼리 어답터 → 다수의 수용으로 인한 대중화</li>
</ul>
</li>
<li><strong>환경 진화</strong><ul>
<li>경쟁 구도 변화, 사용자들의 사생활에 대한 우려, 새로운 정부 정책 시행 → 비즈니스의 초점이나 관점 변경 → 지표 변화</li>
</ul>
</li>
<li><strong>측정 기준에 대한 이해의 진화</strong><ul>
<li>개발 단계에서의 지표 측정 기준이 실제 성능을 관찰할 때 지표를 더 세분화하거나, 상이한 지표로 개선할 여지가 있음.</li>
<li>지표를 조사하고 기존 지표를 수정하는 데 들이는 시간과 노력은 EVI가 높음. 이때 올바른 방향성을 갖추는 것이 중요.<ul>
<li>EVI(정보의 기대가치, Expected Value of Information): 추가 정보나 의사결정에 어떻게 도움이 되는지를 포착하는 개념</li>
</ul>
</li>
</ul>
</li>
</ol>
<h1 id="ch07-실험을-위한-지표와-종합-평가-기준">CH07 실험을 위한 지표와 종합 평가 기준</h1>
<h3 id="intro-1"><strong>intro</strong></h3>
<ul>
<li><p>온라인 종합 대조 실험을 잘 설계하고 실행하려면 특정 특성을 만족하는 지표 필요</p>
</li>
<li><p>여러 지표를 사용하는 경우 이를 <strong>종합 평가 기준(OEC, Overall Evaluation Criterion)</strong>으로 결합하는 것이 좋음.</p>
</li>
<li><p>데이터 기반 조직은 목표 , 동인, 가드레일 지표를 사용해 투명성과 설명책임에 따라 비즈니스 목표를 조정</p>
<p>  그러나 온라인 실험에서는 실험에 대한 지표가 만족시켜야하는 조건으로 비즈니스 목표를 변환할 필요 존재</p>
</li>
</ul>
<h3 id="1-실험에-대한-지표가-만족해야-하는-조건"><strong>1. 실험에 대한 지표가 만족해야 하는 조건</strong></h3>
<blockquote>
<p><strong>측정 가능성</strong>: “구매 후 만족도”는 직접적 측정이 어려움.</p>
<p><strong>귀속(계산) 가능성</strong>: 실험의 변형군에 지표값을 귀속시킬 수 있어야 함. </p>
<p>예를 들어, 실험군과 대조군 사이의 <strong>앱 충돌율</strong>의 차이가 있다고 가정할 때, </p>
<p>실험군에게서 앱 충돌율을 측정할 수 있어야 함.</p>
<p><strong>민감도 및 적시성</strong>: 실험 지표는 시기적절하게 중요한 변화를 감지할 수 있을 정도로 <strong>민감해야 함.</strong></p>
<ul>
<li>민감도: 지표의 통계적 분산, 효과의 크기 및 무작위 추출 단위 수(샘플 사이즈)에 따라 달라짐.</li>
<li>민감하지 않은 지표의 극단적 예시: 실험 지표가 회사의 주가라면 실험 내에서의 어떤 요소로 인해 주가가 크게 달라지지 않기 때문에 민감하지 않음.</li>
<li>매우 민감한 지표의 극단적 예시: 어떤 사용자가 새로운 기능의 존재를 알고 있는지 여부를 측정하는 것은 매우 민감하지만, 존재를 알고 있음으로 인해서 창출되는 실제 가치에 대해서는 측정할 수 없음.</li>
<li>위 두 예시의 사이에 위치하는 <strong>CTR(클릭율) 지표</strong>는 민감하지만, 한 기능에 대한 CTR을 지표로 설정할 경우, 다른 기능에 부정적인 영향을 끼칠 수 있음.</li>
</ul>
<p>💡 <strong>자기 잠식 효과(cannibalization)</strong>: 한 기업에서 새롭게 출시한 기능이 기존에 그 기업에서 판매하고 있던 다른 기능의 영역까지 침범하여 해당 영역에 부정적인 영향을 끼치게 된다는 것.</p>
<ul>
<li>따라서, 전체 페이지 클릭율이나 구매와 같은 “성공”의 지표 및 성공까지의 시간은 실험을 수행하기 위한 충분한 민감도를 가진 좋은 지표임.<ul>
<li>예시 1) 클릭당 단가가 “매우 높은” 클릭의 경우 특이값에 해당하므로 분산을 부풀려 실험 효과를 탐지하는 것을 어렵게 만들 수 있음. 따라서 “<strong>사용자당 매출 상한”</strong>과 같은 지표를 고려할 수 있음.</li>
<li>예시 2) <strong>“갱신율”이라는 지표</strong>는 1년 단위로 구독을 갱신하므로 1년치 실험을 진행하지 않는한 이 지표에 미치는 영향을 측정하는 것이 매우 어렵다. 따라서 갱신율을 직접 실험에 사용하는 대신, <strong>이용도와 같이 갱신과 관련된 대리지표</strong>를 찾는 것이 더욱 적절할 수 있다.</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p>품질을 고려하지 않고 지표를 사이트에서의 “체류시간”으로 결정하는 것은 불필요한 페이지나 느린 사이트를 통해 단기적으로 체류시간을 늘려 지표를 개선할 수 있지만, 장기적으로는 사용자의 이탈 원인이 됨.</p>
</blockquote>
<h3 id="-추가로-고려할-수-있는-지표-종류">+) 추가로 고려할 수 있는 지표 종류</h3>
<ul>
<li>비즈니스 목표 및 동인을 위한 대리 지표의 추가</li>
<li>특정 기능의 움직임을 이해하는 데 도움이 되는, 보다 세분화된 지표(페이지 클릭율 → 페이지 상의 기능별 클릭율로 세분화)</li>
<li>신뢰도 가드레일 및 데이터 품질 지표의 추가</li>
<li>진단과 디버그 지표의 추가</li>
</ul>
<h2 id="2-주요-지표를-oec로-결합하기⭐">2. 주요 지표를 OEC로 결합하기⭐</h2>
<p>🩷** OEC 개념과 KPI 혼동 방지**</p>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/9f3b93db-e7a8-4e92-bbe9-0f389d7df4c6/image.png" alt=""><img src="https://velog.velcdn.com/images/shasha_malone/post/e8ca9ece-725b-4a4f-b336-f19ebd67d309/image.png" alt=""></p>
<p><a href="https://playinpap.github.io/summary-of-indicator-concepts-explained-by-bread/">예시 출처</a></p>
<blockquote>
<p>여러가지 목표와 동인지표를 가지고 있을 때 우리는 하나의 지표만 선택하면 안됨→ <strong>최적화를 위한 단순한 단일 지표는 존재하지 않음</strong></p>
<p> 예) 온라인 사업을 하는 경우 주요 목표와 동인 지표를 가짐 , 사용자 참여(활성일, 사용자당 세션, 클릭 수)와 금전적 가치(사용당 매출)을 모두 측정해야 함</p>
</blockquote>
<blockquote>
<p>여러 조직에서는 다양한 주요 지표를 고려하고 있음 → 이 때 주요 고려 사항 중 하나는 <strong>트레이드오프</strong></p>
<p>예를 들어, 실험을 통해 사용자 손실이 발생하더라도, 남은 사용자의 참여와 매출이 충분히 증가하여 손실을 상쇄할 수 있다면, 어느 정도의 사용자 손실이 허용될 수 있는지에 대한 고민이 있을 것</p>
<p>이런 상황에서 바람직한 해결책은, 다양한 지표를 종합적으로 고려한 <strong>종합 평가 기준인 OEC(Overall Evaluation Criterion)</strong>를 도입하는 것</p>
<p>⇒ OEC는 여러 지표를 사전에 정의된 범위로 정규화하고, 각 지표에 가중치를 할당하여 가중합을 구하는 방식</p>
<p>예) 농구 스코어보드2점 슛과 3점 슛별로 나타내지 않고 각 팀별 합산 점수를 기록. </p>
<p>예) FICO 신용점수는 여러 개의 지표를 300에서 850 사이의 단일 점수로 결합.</p>
<p>이를 통해 <strong>여러 지표를 하나의 단일 지표로 표현함</strong>으로써 성공을 명확하게 정의하고, 조직 내의 이해관계를 조화</p>
</blockquote>
<h3 id="3-결정을-분류하는-경우에는-네-가지-경우">3. 결정을 분류하는 경우에는 네 가지 경우</h3>
<ol>
<li>모든 핵심 지표가 양수이고 적어도 하나의 지표가 양수인 경우에는 변경이 필요합니다.</li>
<li>모든 핵심 지표가 음수이고 적어도 하나의 지표가 음수인 경우에는 변경이 필요하지 않습니다.</li>
<li>모든 핵심 지표의 변화가 0인 경우에는 변경이 필요하지 않거나, 실험 검정력을 높이거나 방향 전환을 고려해야 합니다.</li>
<li>일부 핵심 지표가 양수이고 일부가 음수인 경우에는 트레이드오프를 고려하여 결정을 내려야 합니다.</li>
</ol>
<blockquote>
<p>그러나 <strong>핵심 지표의 수가 많아지면 OEC의 문제가 발생</strong>할 수 있음 따라서 <strong>핵심 지표의 수를 최소화</strong></p>
<p>보통 <strong>5개의 핵심 지표를 제한</strong>하는 것이 좋은데, 이렇게 하면 통계적으로 한 지표가 유의미하게 될 확률이 낮아지기 때문</p>
<ul>
<li>지표 수 = 5개, 하나 이상의 지표가 통계적으로 유의하게 될 확률은 23%</li>
<li>지표 수 =10개, 위 확률은 40%까지 상승</li>
</ul>
<p>→ 지표가 많을수록, 1개 이상의 지표가 통계적으로 유의할 가능성이 커져 지표가 충돌 또는 의문을 야기하는 잠재적 문제 발생 가능성이 커짐</p>
</blockquote>
<h3 id="5-oec의-예시---아마존-이메일-프로그램"><strong>5. OEC의 예시 - 아마존 이메일 프로그램</strong></h3>
<p>아마존의 이메일 프로그램에서도 OEC의 사용이 관련됨</p>
<blockquote>
<p>초기에는 <strong>단순한 매출</strong>을 기준으로 했던 OEC가 문제가 발생</p>
<ul>
<li><p>아마존의 적합도함수는 이메일 클릭을 한 사용자로 부터 창출된 매출에 기초한 프로그램</p>
</li>
<li><p>문제 : 사용자들이 이메일을 너무 많이 받아 짜증을 내게 되면 단순 스팸으로 처리하게됨</p>
</li>
<li><p>해결 방안 :  장기적인 관점에서 <strong>사용자의 생애 가치를 고려</strong></p>
<ul>
<li>이를 위해 수신 취소의 <strong>생애 손실에 대한 모델</strong>을 만들었는데, 이를 통해 보다 정확한 판단</li>
<li>문제인식 :  클릭율 매출 OEC가 사용자 생애 가치가 아닌 단기 매출에 최적화 되고 있다 → 사용자들이 이메일 수신 취소하고 있다</li>
<li>문제 해결 과정 : </li>
</ul>
<ol>
<li><p>이메일 수신 취소시의 생애 기회 손실에 대한 하한을 설정하는 모델 OEC 만듦</p>
<p><img src="https://blog.kakaocdn.net/dn/b1S3vC/btsqtvm3unW/aNJpeEd29Nq35BQA7lnwiK/img.png" alt="https://blog.kakaocdn.net/dn/b1S3vC/btsqtvm3unW/aNJpeEd29Nq35BQA7lnwiK/img.png"></p>
<ol start="2">
<li>수신 취소가 사용자들은 큰 손실만 준다고 판단하는 것을 확인( 단 몇달러만 손해라고 할당한경우에도 참여한 절반 이상이! )</li>
</ol>
</li>
<li><p>수신취소에 대한 부정적인식 기반으로 ‘구독 취소 페이지’ 개발</p>
<ul>
<li>아마존 이메일이 아닌 ‘캠페인 군’ 이메일 수신만 취소하게함</li>
</ul>
</li>
<li><p>수신 취소 비용을 감소시킴</p>
</li>
</ol>
</li>
</ul>
</blockquote>
<p><img src="https://blog.kakaocdn.net/dn/ccwRt6/btsqm8sqqCL/2l5vkrh5xKOzYkk1aHD7D0/img.png" alt="https://blog.kakaocdn.net/dn/ccwRt6/btsqm8sqqCL/2l5vkrh5xKOzYkk1aHD7D0/img.png"></p>
<p><a href="https://shopigate.co.kr/blogs/news/%EA%B3%A0%EA%B0%9D%EC%9D%98-%EA%B5%AC%EB%A7%A4-%EC%9E%A0%EC%9E%AC%EB%A0%A5%EC%9D%84-%EB%81%8C%EC%96%B4%EB%82%B4%EB%8A%94-%EB%A7%88%EC%BC%80%ED%8C%85-%EC%83%81%ED%96%A5-%ED%8C%90%EB%A7%A4%EC%99%80-%EA%B5%90%EC%B0%A8-%ED%8C%90%EB%A7%A4">이미지출처</a></p>
<h3 id="oec의-예시--빙의-검색-엔진">OEC의 예시 : 빙의 검색 엔진</h3>
<p><strong>단기 목표</strong>와 <strong>장기 목표</strong>가 정반대 방향으로 가는 사례</p>
<ul>
<li>빙의 랭킹 알고리즘은 <strong>검색어 점유율</strong>과 <strong>매출</strong>이라는 핵심 조직 지표를 이용해 목표 달성도 추천</li>
<li>검색어 점유율과 매출은 중요하지만, 이러한 지표가 사용자의 만족도와 품질에 부정적인 영향을 미칠 수 있으므로 주의</li>
<li>따라서, 검색 엔진의 OEC는 사용자 경험과 품질을 개선하는 데 중점을 두어야 함.</li>
</ul>
<blockquote>
<p><strong>✅문제 인식 :</strong> 
빙 랭킹 알고리즘은 버그가 있어서 실험군의 사용자에게 매우 나쁜 검색 결과를 보여 줌</p>
<p>그 상황에서도, 두 핵심 조직 지표인 <strong>검색어 점유율과 매출이 크게 개선</strong></p>
<ul>
<li>사용자당 고유 검색어(결과 값이 중복되지 않은 검색어) 수 10% 이상 증가</li>
<li>사용자당 매출 30% 이상 증가</li>
</ul>
<p>⇒ 검색 엔진의 장기 목표는검색 엔진의 목표는 사용자가 자신의 답변을 확인하거나 작업을 빨리 완료할 수 있도록 하는 것.  검색어 점유율/매출 향상을 목표 지표로 사용하면 안됨.  의도적으로 검색 엔진의 품질을 떨어뜨려 해당 지표의 향상을 보여주려할 것</p>
</blockquote>
<blockquote>
<p><strong>✅문제 해결 :</strong>
검색 엔진의 OEC(Overall Evaluation Criterion)는 두 가지 핵심 지표 (<strong>검색어 점유율/매출)</strong>대신에 <strong>사용자 경험과 품질을 개선해야함</strong></p>
<p>&lt; 문제 해결에서 고려항 사항 &gt;</p>
<p>월별 검색어 점유율을 아래와같이 세 항의 곱으로 분해</p>
<ol>
<li><strong>월별 사용자</strong>: 종합 대조 실험에서 사용자 수는 실험 그룹과 대조 그룹 간에 거의 같게 유지</li>
<li><strong>세션당 고유 검색어 수</strong>: 작업을 완료하기 위해 사용자가 입력하는 검색어의 수를 최소화해야 하지만, 이는 측정하기 어려운 지표 따라서 세션당 사용자 수를 줄이는 것이 더 효과적</li>
<li><strong>사용자당 세션</strong>: 만족한 사용자가 더 자주 방문하도록 유도하는 것이 중요</li>
</ol>
</blockquote>
<p>마찬가지로, <strong>사용자당 매출 증가</strong>도 <strong>검색 및 광고 실험</strong>을 위한 <strong>OEC로 사용되어서는 안 됨</strong></p>
<p>대신 광고에 사용되는 <strong>검색어의 평균 픽셀 수를 제한</strong>하여 <strong>검색당 매출을 증가</strong>시키는 것이 목표가 되어야함</p>
<h2 id="6-굿하트의-법칙-캠벨의-법칙과-루카스-비판">6. 굿하트의 법칙, 캠벨의 법칙과 루카스 비판</h2>
<ul>
<li>OEC는 단기적으로 측정가능해야하지만, 장기적인 전략적 목표를 추진하는 원인으로 신뢰할 수 있어야한다는 원칙</li>
<li><code>굿하트의 법칙</code>, <code>루카스 비판</code>,<code>캠벨의 법칙</code>은 조직에서 OEC를 선택할 때, 상관관계를 인과관계로 잘못 판단한다는 것을 강조</li>
<li>예) 필립스 곡선 : 물가 상승 과 실업의 역사적 음의 상관관계 - 그러나 실업률이 낮아질 것이라는 희망에서 물가상승률을 올리는 것은 잘못된 인과관계 - 장기적으로 물가상승과 실업률은 인과관계가 없음(Hoover 2008)</li>
</ul>
<h3 id="추가-개념">추가 개념</h3>
<p><a href="https://brunch.co.kr/@ywkim36/25">09화 좋은PM은 &#39;허세 지표/메트릭&#39;을 사용하지 않습니다.</a>
<a href="https://playinpap.github.io/summary-of-indicator-concepts-explained-by-bread/">빵으로 설명하는 지표 개념 정리(OEC, KPI, Goal, Driver, Guardrail)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[A/B test] Ch10-11. 온라인 종합 대조 실험의 보완 방법]]></title>
            <link>https://velog.io/@shasha_malone/AB-test-Chapter-10-11.-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A2%85%ED%95%A9-%EB%8C%80%EC%A1%B0-%EC%8B%A4%ED%97%98%EC%9D%98-%EB%B3%B4%EC%99%84-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@shasha_malone/AB-test-Chapter-10-11.-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A2%85%ED%95%A9-%EB%8C%80%EC%A1%B0-%EC%8B%A4%ED%97%98%EC%9D%98-%EB%B3%B4%EC%99%84-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 05 May 2024 14:36:52 GMT</pubDate>
            <description><![CDATA[<h2 id="ch10-온라인-종합-대조-실험-보완-기법들">CH10. 온라인 종합 대조 실험 보완 기법들</h2>
<ul>
<li>AB 테스트 결과를 바탕으로 의사결정을 하기 위해서는 실험 결과의 일반화가 매우 중요하다.</li>
<li>AB 테스트를 위한 여러 보완 기법들이 존재. 보완 기법은 AB 테스트 아이디어, 지표 설정 등에 활용된다.</li>
</ul>
<h3 id="1💡모집단-추정과-실험보완-기법">1.💡모집단 추정과 실험보완 기법</h3>
<ul>
<li>표본 수, 무작위 실험, 교란 요인 통제, 대표성, 결과 일반화가 중요.</li>
<li>AB 테스트를 위한 여러 보완 기법으로 AB 테스트 아이디어, 지표 설정 활용.</li>
<li>로그 기반 분석으로 직관 확립 후 지표 구체화, 문제 발견 및 AB 테스트 아이디어 창출 가능.</li>
<li>한계점과 대안은 오직 과거를 기반으로 미래를 유추하거나, 사용자 경험 연구로 사용자 의도 포착 가능하지만 대표성의 문제 발생 가능.</li>
</ul>
<h3 id="2👨🏻🔬포커스-그룹-및-다양한-연구-방법에-대한-설명">2.👨🏻‍🔬포커스 그룹 및 다양한 연구 방법에 대한 설명</h3>
<ul>
<li>포커스 그룹은 소규모 참가자들로 구성된 질적 연구 방법으로, 마케팅과 사용자 경험 연구 등에서 활용됨.</li>
<li>토론을 통해 다양한 관점과 의견을 수집하며, 녹음이나 비디오로 데이터를 수집해 인사이트를 도출함.</li>
<li>포커스 그룹의 장단점은 심층적 데이터 수집과 주관성, 일반화의 한계 등이 있음.</li>
<li>또한, 설문조사, 외부 데이터를 활용하여 목표와 상황에 맞게 적절한 연구 방법을 선택하는 것이 중요함.</li>
</ul>
<h3 id="3️🎯기법의-중요성과-실험-준실험-설계-비교">3.️🎯기법의 중요성과 실험, &#39;준&#39;실험 설계 비교</h3>
<ul>
<li>대체 기법들(feat. 인과 추론을 위한 준실험 설계)은 실험 설계를 통해 효과적으로 &#39;인과관계&#39;를 확인하는 방법이다.</li>
<li>실험 설계는 독립변수를 조작하고 <em>무작위 배정</em>과 교란 요인 최소화를 통해 인과 효과를 추정한다.</li>
<li>&#39;준&#39;실험 설계는 실험 설계와 유사하나 무작위 배정이 어려울 때 사용되며, 인과 효과 추정에 제한이 있을 수 있다.</li>
<li>인과 추론에서의 인과 효과 추정 기본 공식은 실험군 결과에서 대조군 결과를 뺀 값으로 선택 편향을 고려하여 실험 결과를 해석한다.</li>
</ul>
<h3 id="4️🔬준실험-설계와-교차배치-실험-도구변수의-중요성과-활용">4.️🔬준실험 설계와 교차배치 실험, 도구변수의 중요성과 활용</h3>
<ul>
<li>준실험 설계의 로직은 대조군과 실험군 설정하고 인과효과 추정하는 과정이 중요하며, 교란변수를 통제해야 한다.</li>
<li>단절적 시계열과 회귀불연속 설계는 장단점이 있고, RDD는 시간에 따른 효과를, ITS는 장기 효과를 추정한다.</li>
<li>교차배치 실험 설계는 두 가지 이상의 조건을 비교하며, 알고리즘 효과 비교를 통해 사용자 반응을 측정한다.</li>
<li>도구변수를 사용하면 순수한 인과 관계를 추정할 수 있으며, 설명 변수와 종속 변수 사이의 올바른 관계를 파악할 수 있다.</li>
</ul>
<p><a href="%5B1https://medium.com/bondata/instrumental-variable-1-6c249de6ea34%5D">실무 인과추론 Toolkit : 도구변수 (Instrumental Variables</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[플레이데이터 애널리시스 33기 10월 3주차(10.16 ~ 10.22) 회고 ]]></title>
            <link>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-10%EC%9B%94-2%EC%A3%BC%EC%B0%A810.16-10.22-%ED%9A%8C%EA%B3%A0-%EB%B0%80%EB%A6%B0-%ED%95%9C%EB%8B%AC-%ED%9A%8C%EA%B3%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-10%EC%9B%94-2%EC%A3%BC%EC%B0%A810.16-10.22-%ED%9A%8C%EA%B3%A0-%EB%B0%80%EB%A6%B0-%ED%95%9C%EB%8B%AC-%ED%9A%8C%EA%B3%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 24 Oct 2023 06:36:12 GMT</pubDate>
            <description><![CDATA[<h3 id="1-전반적인-느낌--일주일-동안-한-일-">1. 전반적인 느낌 ( 일주일 동안 한 일 )</h3>
<ul>
<li>지난 주 배운 것 :
1) <strong>pytorch로 딥러닝을 학습하는 것을 끝냈음.</strong>
딥러닝 개요 -&gt; tensor다루기 -&gt; pytorch linear -&gt; gradient deceding 과정을 돌면서 딥러닝의 기본에 대해서 배움. tensor객체를 생성해 머신러닝 모델링에 사용할 데이터를 처리하고, 모델링에서 선형 layer를 생성해 여러 layer를 중첩해서 내가 원하는 값을 도출하기 위한 모델링 샘플을 직접 만들어봄. 한 번의 모델링이 끝난 후에는 파라미터의 gradient를 계산해서 최적화 과정을 진행하는데 오차함수를 미분하여 최적화값을 구하는 과정을 직접 구해봄 </li>
</ul>
<p>   2) <strong>Dataset와 Dataloader</strong>에 관해서 배움
데이터set을 sklearn이라는 패키지에서 다운로드 받으면 -&gt; dataloader를 이용해 모델에 data를 넣는 과정이 필요함. Mnist dataset의 예시를 통해 딥러닝의 과정을 다시 한 번 복습함</p>
<ul>
<li>지난 주 끝낸 일정 :
1) 사이버 보안AI 경진대회 : 총 66팀 중 22위의 정확도를 출력해냄 . BPE토큰화를 적용해봤고, 토큰화된 데이터를 벡터화해서 전처리함. 나느  이번에는 코드보다는 기획자, 도메인 지식 , 보고서 작성 등에서 기여를 했음. patload데이터라는 낯선 코드 데이터를 다뤄볼 수 있었다.</li>
</ul>
<p>   2) NH증권 빅데이터 경진대회 : 해외 주식 데이터를 이용한 전처리 및     데이터 분석 과정을 팀원들과 진행해봄. 퀀트 주식투자 기법중 모멘텀 전략과 가치 전략을 사용하여 KRS의 외부데이터를 불러와 국내 주식데이터 중 KOSPI 200데이터에 대해서만 적용해봤다. 주식 데이터는 어떤 종목의 데이터를 , 어느 정도의 기간을 기준으로 크롤링할 건지 정하는 문제가 가장 컸다.</p>
<ul>
<li>전반적인 느낌 : 이전 수업에서 openCV로 영상처리하는 것을 배울 때는 어떻게 써먹을 지 감이 안왔는데, 이번 주부터 ML분야에 직결되는 내용을 배울 수 있어서 좋았다. 경진대회를 통해 실전 데이터들에도 배운 내용을 써먹어볼 수 있었던 듯</li>
</ul>
<h3 id="2-좋았던-점-좋았거나-내가-잘했던-점-">2. 좋았던 점( 좋았거나 내가 잘했던 점 )</h3>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/0bb6a556-ec3e-4f1a-9a7b-1363d19e9c8f/image.png" alt="">
<img src="https://velog.velcdn.com/images/shasha_malone/post/a11e1701-e1c5-4b22-886f-f5d2b49b482b/image.png" alt="">
<img src="https://velog.velcdn.com/images/shasha_malone/post/232a112e-a500-47c1-95fa-cf6615833e3f/image.png" alt="">
<img src="https://velog.velcdn.com/images/shasha_malone/post/80126b44-ce8d-4303-899d-84fcc2388f3a/image.png" alt=""></p>
<p>수업 내용을 velog에는 올리지 않고 있지만 꾸준히 정리 후 노션에 업로드 중이다.
딥러닝 파트는 문법파트와 달리 구조를 이해하는 것이 더 중요해서 손으로 피릭하기 시작했는데
모든 코드를 직접 적어보니, 머릿속에 구조화가 더 빨리됨!</p>
<h3 id="3-아쉬웠던-점">3. 아쉬웠던 점</h3>
<p>타자가 느려서 아쉽다. 옆자리 친구가 타자가 진짜 너무 빠른데 어떻게 그렇게 빨리 치냐고 물어보니 아무 생각없이 문자 그대로 받아들이고 치면 빠르게 쳐지고 -&gt; 다 친다음 필기를 보면서 이해하면 도움이 된다고 해서 그렇게 쳐봤는데 정말 빨라서 신기했음</p>
<h3 id="4-개선할-점">4. 개선할 점</h3>
<p>나는 숲을 보는 것에는 강한데 나무를 보는 것은 약한 듯.
큰 틀을 짜는 것도 중요한데 , 하기로 한 일의 세부사항을 하나하나 실천하는 것이 중요하다</p>
<ol>
<li>우선 순위 생각하면서 일하기 - 쉽고 시급한 일 먼저 -&gt; 어렵고 장기간 투자해야하는 일은 주별 / 일별 일정을 촘촘히 나눠서 실천하기 </li>
</ol>
<ul>
<li>이번주는 수업 내용 따라가는 것이 가장 중요하다
수업에서는 딥러닝 모델링 구조를 익히고 + 개인 프로젝트 진행하면서 이번 주는 전처리 단계를 공부하는데 시간을 많이 투자 해야겠다 ( 현대 해양 AI 경진대회 데이터 형규랑 지우랑 전처리 공부하기 + 데이콘 python 튜토리얼 2개 정리하기)</li>
</ul>
<ol start="2">
<li>한 가지 일을 할 때 최소한 20분이상 지속하기</li>
</ol>
<h3 id="5-다음-주-계획">5. 다음 주 계획</h3>
<p>1.현대 해양 AI 경진대회 데이터 형규랑 지우랑 전처리 공부하기 
2. 데이콘 python 튜토리얼(모델링 공부) 2개 정리하기
3. 프로그래머스 입문 DAY 5<del>10
4. 선형대수학 2.3 일차독립 ~2.4 기저와 생성집합
5. SQLD DAY1</del>4 공부
6. 수업 복습 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[플레이데이터 애널리시스 33기 10월 2주차(10.10 ~ 10.15) 회고 | 밀린 한달 회고하기🐻]]></title>
            <link>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-10%EC%9B%94-2%EC%A3%BC%EC%B0%A810.10-10.15-%ED%9A%8C%EA%B3%A0-%EB%B0%80%EB%A6%B0-%ED%95%9C%EB%8B%AC-%ED%9A%8C%EA%B3%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-10%EC%9B%94-2%EC%A3%BC%EC%B0%A810.10-10.15-%ED%9A%8C%EA%B3%A0-%EB%B0%80%EB%A6%B0-%ED%95%9C%EB%8B%AC-%ED%9A%8C%EA%B3%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 18 Oct 2023 00:17:36 GMT</pubDate>
            <description><![CDATA[<h2 id="1-전반적인-느낌일주일동안-한-일">1. 전반적인 느낌(일주일동안 한 일)</h2>
<p>근 한달 간 회고를 작성하지 못했다가 오랜만에 작성!!!!!!!
걍 9월 중순 ~ 10월 중순 월간 회고됨.</p>
<p>SQL이 끝난 이후 Python에서 데이터 분석에 필요한 pandas, numpy 라이브러리를 배웠고 이후, 본격적으로 머신러닝, 딥러닝에 필요한 기초 지식들을 익혀 이번 주부터는 Deeplearning_pytorch를 배우고 있다. 
갑자기 난이도가 확 올라감. 
이젠 정말 수업에 FULL,, 집중해야한다...</p>
<p><strong>지난 한달 간 배운 것</strong></p>
<p>&lt; 데이터 분석 파트 &gt;
<strong>1) pandas</strong> : 데이터 처리와 분석을 위한 라이브러리. 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음.
<strong>2) templagte</strong> : Dataframe합치기 , Dataframe 재구조화 - pandas에행렬 데이터를 분석하는 메소드에 대해서 배운 후 dataframe에 대한 학습만 따로 진행
<strong>3) 시각화</strong> : matplotlib, 그래프 그리기,Pandas 시각화, seaborn 
<strong>4) numpy</strong> : 벡터, 행열 연산에 필요한 수치를 해석하는 라이브러리. 
<strong>5) openCV</strong> : 이미지 처리, 영상 처리 라이브러리. 이걸 왜 배우나 싶었는데 머신러닝에서 이미지 파일을 입력하고 처리할 때 기반이 되는 라이브러리 수업이였음. 행렬데이터에 대한 이해도 커졌다.</p>
<p>데이터분석 관련된 내용은 BDA 학회를 다니고 인프런에서 공공데이터 분석강의를 수강하면서 접했던 내용이 대부분이라 그래도 할만했는데, 이번 주 부터 들어가는 딥러닝 과정은 정말정말 처음!!!!(지난 학기 인딥개 수업에서 진짜 찍먹만,,)이라서 너무 중요하다!!!! </p>
<p>다음주 중으로 준비하던 공모전 2개가 마무리 되는데, 
이제는 수업 내용을 소화하고 관련 미니 프로젝트를 공부하면서 &quot;진짜 내 실력&quot;을 키워야겠다. 이잉 근데 프로그래스 좀 열심히 알걸 ㅜㅜ 알고리즘 좀 열심히할걸 ㅜㅜ 생각이 들긴하나,, 뭐어쩌겟는가 시간은 지났는걸
지금 할 수 있는 것에 집중하는 것이 최선이다..</p>
<p>플레이데이터 커리큘럼이 Python 문법, SQL문법 -&gt; 데이터분석 -&gt; 이미지처리 -&gt; 머신러닝/딥러닝 과정으로 진행되고 있는데, 11월 쯔음에  첫 중간프로젝트가 시작될 것같다. 그래서 10월은 머신러닝/딥러닝 내용을 깊게 이해하는데에 에너지를 쓸 생각이다!
10/23(월)부터는 SQLD자격증 공부를 병행해야하지만,,,</p>
<h2 id="2-좋았던-점좋았거나-내가-잘했던-점">2. 좋았던 점(좋았거나 내가 잘했던 점)</h2>
<p>이 시기에 <strong>공모전 3개</strong> (아이디어톤 1개 : K-digital Training 해커톤, 모델 생성 :사이버 보안 ai, 데이터 분석 :  NH투자증권 빅데이터 경진대회)를 준비했는데 그 과정에서 실제로 내가 수업 때 배운 내용들을 써먹어보는 감을 많이 느낀 것같다. </p>
<p>1) 배운 점: </p>
<ul>
<li><p>** &quot;도전에 대한 자세 - 견적봐서 할만하면 미쳐라(feat.침착맨)&quot;**
나는 무언가를 도전할 때 &#39;가능성&#39;을 신중하게 고민하느라 나중에는 아무것도 도전하지 않은 경우가 있다. 이번에 도전을 두려워하지 않는 좋은 팀원들 덕에 시작의 두려움을 많이 덜고 큰 대회들에도 선뜻 도전해본 것 같다...</p>
</li>
<li><p>** &quot;피드백과 소통은 대충 ASAP&quot; **
개인적으로 협업을 할 때, 중간 작업물을 선뜻 보여주는 것에 대한 두려움 + 완벽주의로 인한 병적인 미루기 가 나의 가장 안좋은 습관이라고 생각했는데 , 공모전을 통해 그 습관이 덜해진 것같다. 내가 맡은 일을 &quot;제대로&quot;해가야 한다는 모호한 기준때문에 할 일을 많이 미뤘었는데, 팀원들과 얘기를 하다보면 혼자서 있을 때 땅굴파던게 굉장히 쉽게 해결되는 경우가 많았디. + 내가 그렇게 까지 등신은 아니구나,,,같은 생각도,,ㅎㅎ 암튼, 혼자 끙끙거리는 것보다 &quot;현재 진행상황에 대한 인지 -&gt; 공유 -&gt; 재역할분담&quot; 의 과정을 반복하는 것이 협업에 더 도움된다는 것을 알게되는듯.</p>
</li>
</ul>
<ul>
<li><p>** &quot;제출에 의의를 둘 것, 어쨌든 성장했다&quot;**
공모전을 진행하면서 아직 지식적인 부분에서 큰 부족함을 느꼈다. 
사이버 보안 AI에서는 딥러닝 모델의 구조와 라이브러리, 토큰화 방법, 벡터화 방법을 아예 모르는 채로 &quot;분류 모델&quot;을 생성하려고 하다보니 아주 기초적인 부분부터 독학해야했다. 그러다 보니 수업내용은 놓치고, 새로운 내용은 독학해야하는 비효율적인 학습의 반복,,, 근데 짜치는 걸 제출하기는 싫으니 또 다시 input, input,,,, 인풋중독에 빠지지 말고 현재 할 수 있는 수준에서 정리해서 내는 것도 능력이였다. 그렇게 한번 해보고 나면 다음에는 더 잘할수있으니 걱정말고 제발 그냥 제출!!하기</p>
</li>
<li><p><strong>&quot; 데이터분석 경진대회는 도메인이 익숙할수록 할만하다!!!!&quot;</strong>
NH투자증권 경진대회를 진행하면서,,, 주식을 해본적이 없으니 데이터 EDA 및 전처리 과정에서 어떤 Feature를 써야하는지 전혀 감이 잡히지 않았다! 그래서 공부와 구글링으로 퀀트 전략, 가치 지표(Kospi200,PER, EPS)등을 공부하는 과정에 시간을 너무 많이썼다!!(데이터 분석보다 더씀) 
강사님도 feature를 선택하는 건 분석가의 도메인 지식과 경험적 감이 중요하다고 했기 때문에 다음 경진 대회에서는 좀 더 익숙한 분야로 선택해서 공부해야겠다.</p>
</li>
</ul>
<h2 id="3-아쉬웠던-점">3. 아쉬웠던 점</h2>
<p>9월 중순부터 여러가지 일들이 한번에 겹쳐서 수업 내용을 소화하는데 쓰는 시간이 줄었다는 점이 가장 아쉽다. 
중국 여행으로 인해 3일정도 출석을 하지 못했고, 
K-digital Training 해커톤에 참가하면서 수업 앞 뒤로 회의와 수업복습스터디를 진행하느라 정말정말 바빴다... 
심지어 이번 주에는 공모전만 2개,,
사이버보안ai, NH투자증권 경진대회에 참여하면서 깃허브 찾아보고 주식도메인 지식을 공부하고,,ㅜㅜㅜ 
이런 상황들이 반복되면서 현재 집중할 대상을 줄여야한다는 것을 실감한다.
우선순위를 고려하라 고려하라 하는데 나는 동시에 너무 여러개를 하려고 한다는 게 제일 문제인 듯</p>
<h2 id="4-개선할-점">4. 개선할 점</h2>
<p>한번에 한가지 일만할 것
수업 복습 1시간 + 프로그래머스 문제풀이 30분 을 기반으로
개인프로젝트 + 선형대수 공부를 셔플해서 공부하기,,,</p>
<h2 id="5-다음-달-계획">5. 다음 달 계획</h2>
<p><strong>ML/DL + 데이터분석 공부</strong></p>
<p>[데이콘]  <a href="https://dacon.io/competitions/official/235698/overview/description">📓python 튜토리얼</a> </p>
<p>[프로그래머스] <strong>파이썬 문제풀이</strong> Day 5~10(주에 20문제씩 풀기)</p>
<p>[코드잇] 인강 듣기 <strong>데이터 분석(2개)+ 머신러닝(5개) + 딥러닝(1개) → 공모전에 필요한 지식 공부</strong></p>
<p>** SQLD 자격증 따기** 
10 /23(월) 시작 4주 스터디 </p>
<p>본격적인 알고리즘 공부는 11월에 프로그래머스 문제양을 늘리면서 보완할 것, 프로그래머스 기초문제를 푸는 것 자체가 알고리즘 공부, 
11월에 SQLD공부, 딥러닝프로젝트 공부도 보완!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 07. DML (23.09.07)]]></title>
            <link>https://velog.io/@shasha_malone/07.-DML-23.09.07</link>
            <guid>https://velog.io/@shasha_malone/07.-DML-23.09.07</guid>
            <pubDate>Tue, 12 Sep 2023 02:20:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/shasha_malone/post/24ae3cbf-0ca1-4e38-b19b-1c34b3ef3cb0/image.png" alt=""></p>
<ul>
<li>drop은 테이블 아예삭제, truncate는 table틀은 존재하지만 테이블 데이터 삭제</li>
</ul>
<hr>
<h1 id="insert-문---행-추가">INSERT 문 - 행 추가</h1>
<blockquote>
<p>insert into 테이블명 (컬럼,컬럼...) values (값, 값...)</p>
</blockquote>
<pre><code class="language-sql">use hr_join;
insert into emp (emp_id, emp_name, job_id, mgr_id, 
                hire_date, salary, comm_pct, dept_id) --컬럼명
values (&#39;500&#39;, &#39;홍길동&#39;, &#39;AC_ACCOUNT&#39;, 100, &#39;2023-9-7&#39;, 5000.23, null, 100); -- 값
-- emp table에 한 행이 추가됨. 결과창 x ( 1 row(s) affected )</code></pre>
<ul>
<li><p>모든 컬럼에 값을 넣을 경우 컬럼 지정 구문 생략가능</p>
<pre><code class="language-sql">insert into emp -- 모든 컬럼에 값 넣을 시 , 컬럼명 생략가능
values (&#39;501&#39;, &#39;홍길동&#39;, &#39;AC_ACCOUNT&#39;, 100, &#39;2023-9-7&#39;, 5000.23, null, 110);</code></pre>
</li>
<li><p>조회결과를 insert </p>
<blockquote>
</blockquote>
<p>insert into 테이블명 (컬럼, 컬럼) select 구문 
```sql</p>
</li>
<li><ul>
<li>values 대신 select절을 붙이면, select된 데이터가 그대로 insert됨.
insert into emp_copy (emp_id, emp_name, salary)
select emp_id, emp_name, salary
from emp
where dept_id in (10,20,30)
order by emp_id;
```</li>
</ul>
</li>
<li><p>insert할 컬럼과 조회한 컬럼의<strong>개수</strong>와 <strong>타입</strong>이 맞아야함</p>
</li>
</ul>
<hr>
<ul>
<li>insert 결과 확인<pre><code class="language-sql">select * from emp 
order by emp_id desc; 
</code></pre>
</li>
</ul>
<pre><code>- 에러나는 것

```sql
insert into emp (emp_id, emp_name, mgr_id, hire_date)
values (502, &#39;박직원&#39;, 102,&#39;2023-08-10&#39;); -- not null 컬럼(salary)에 값을 안넣는 경우.

insert into emp (emp_id, emp_name, mgr_id, hire_date, salary)
values (502, &#39;박직원&#39;, 102, &#39;2023-08-10&#39;, 2500); -- pk(emp_id)로 존재하는 값을 insert

insert into emp (emp_id, emp_name, mgr_id, hire_date, salary)
values (503, &#39;박직원&#39;, 700, &#39;2023-08-10&#39;, 2500); -- mgr_id는 emp.emp_id를 참조하는 FK 컬럼.emp.emp_id에 없는 값을 넣으려고 해서 error.

insert into emp (emp_id, emp_name, mgr_id, hire_date, salary)
values (503, &#39;박직원&#39;, 100, &#39;2023-08-10&#39;, 2500000);
-- salary  decimal(7, 2) xxxxx.00</code></pre><ul>
<li>예제) TODO 부서별 직원의 급여에 대한 통계 테이블 생성. </li>
<li><ul>
<li>emp의 다음 조회결과를 insert. </li>
</ul>
</li>
<li><ul>
<li>집계: 합계, 평균, 최대, 최소, 분산, 표준편차</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">create table salary_stat(
    dept_id int,
    salary_sum decimal(15,2),
    salary_avb decimal(10,2),
    salary_max decimal(10,2),
    salary_min decimal(10,2),
    salary_var decimal(10,2),
    salary_std decimal(10,2)
    );

insert into salary_stat
select dept_id,
       sum(salary), round(avg(salary),2),
       max(salary), min(salary),
       round(variance(salary), 2) , round(stddev(salary),2)
from emp
group by dept_id;

delete from emp; -- 행을 지운다. delete에서는 컬럼을 알려주지 않아도됨. 행을 선택하지 않으면 모든 행을 지운다.</code></pre>
<h3 id="safe-updates-설정-해체-">Safe updates 설정 해체 :</h3>
<p>Edit &gt; Preferences &gt; SQL Editer에서 체크 해제
여러 행을 삭제 또는 수정하는 것을 막는 설정 (check되면)</p>
<h3 id="auto-commit-설정을-해제">Auto commit 설정을 해제.</h3>
<blockquote>
</blockquote>
<p>commit: insert, delete, update된 데이터를 실제 물리 디비에 영구적으로 적용.</p>
<ul>
<li>commit; -&gt; 적용, rollback; -&gt; 마지막 commit 상태로 복원.</li>
<li><strong>현재 auto commit상태 조회</strong><blockquote>
<blockquote>
<p>select @@autocommit; </p>
</blockquote>
</blockquote>
</li>
<li><ul>
<li>1: auto commit - I/U/D 쿼리가 실행되면 바로 적용</li>
</ul>
</li>
<li><ul>
<li>0: manual commit - I/U/D 쿼리가 실행되도 바로 적용하지 않고 commit 명령을 직접 실행해야 적용된다.</li>
</ul>
</li>
<li><strong>commit 설정 변경</strong>
SET AUTOCOMMIT = 1;
SET AUTOCOMMIT = 0;</li>
</ul>
<pre><code class="language-sql">use hr;
SET AUTOCOMMIT = 0;


select * from emp;
delete from emp where dept_name = &#39;Executive&#39;; -- 메모리 상에서는 삭제했지만, 영구적인 DB에서는 삭제되지 않음.
commit; -- 수동으로 commit , 영구적 삭제
</code></pre>
<hr>
<h1 id="update--테이블의-컬럼의-값을-수정">UPDATE : 테이블의 컬럼의 값을 수정</h1>
<blockquote>
<p>update 테이블명
set 변경할 컬럼 = 변경할 값
where 제약조건</p>
</blockquote>
<ul>
<li>UPDATE: 변경할 테이블 지정</li>
<li>SET: 변경할 컬럼과 값을 지정</li>
<li>WHERE: 변경할 행을 선택. </li>
</ul>
<ul>
<li><p>autocommit 해제</p>
<pre><code class="language-sql">use hr_join;
set autocommit = 0;
select @@autocommit; -- 확인</code></pre>
</li>
<li><p>예제
```sql</p>
</li>
<li><ul>
<li>직원 ID가 200인 직원의 급여를 5000으로 변경
update emp
set salary = 5000;</li>
</ul>
</li>
</ul>
<p>rollback; -- 마지막 commit이후로 돌아감
select * from emp where emp_id = 200;</p>
<pre><code>
-예제2)
```sql
-- 직원 ID가 200인 직원의 급여를 10% 인상한 값으로 변경.
update emp
set salary = salary * 1.1
where emp_id = 200;

select * from emp where emp_id = 200; -- 확인
commit; -- 메모리 영구적 저장</code></pre><ul>
<li>예제3) 컬럼이 여러개
```</li>
<li><ul>
<li>부서 ID가 100인 직원의 커미션 비율을 0.2로 salary는 3000을 더한 값으로, 상사_id는 100 변경.
update emp
set comm_pct = 0.2,
 salary = salary + 3000,
 mgr_id = 100
where dept_id = 100;</li>
</ul>
</li>
</ul>
<p>select * from emp where dept_id = 100;
commit; -- 영구적 저장</p>
<pre><code>- null은 = null로 처리</code></pre><p>-- 부서 ID가 100인 직원의 커미션 비율을 null 로 변경.
update emp
set comm_pct = null
where dept_id = 100;</p>
<p>select * from emp where dept_id = 100;
commit;</p>
<pre><code>- 응용1
```sql
-- TODO: IT 부서의 직원들의 급여를 3배 인상
-- 모르는 문제 : dept 테이블과 어떻게 연결? - t서브쿼리로 연결
update emp
set salary = salary * 3.0
where dept_id = (select dept_id from dept where dept_name = &#39;IT&#39;) ;
commit;
select * from emp where dept_id = 60;</code></pre><ul>
<li>응용2
```sql</li>
<li><ul>
<li>TODO: EMP 테이블의 모든 데이터를 MGR_ID는 NULL로 HIRE_DATE 는 현재일시로 COMM_PCT는 0.5로 수정.</li>
</ul>
</li>
<li><ul>
<li>모르는 문제 : 현재일시 - curdate()
update emp
set mgr_id = null,  -- update에서 null
 hire_date = curdate(),
 comm_pct = 0.5;
commit;<pre><code></code></pre></li>
</ul>
</li>
</ul>
<hr>
<h1 id="delete--테이블의-행을-삭제">DELETE : 테이블의 행을 삭제</h1>
<blockquote>
<p>delete from 테이블 명 [where 제약조건]</p>
</blockquote>
<ul>
<li>where: 삭제할 행을 선택</li>
</ul>
<pre><code class="language-sql">-- 부서테이블에서 부서_ID가 200인 부서 삭제
delete from dept; -- 전체 행을 지우는 명령
rollback;
delete from dept where dept_id = 200;  -- 특정행 선택
commit;

-- 부서테이블에서 부서_ID가 10인 부서 삭제
delete from dept where dept_id = 90;

select * from dept where dept_id = 90; --삭제 확인</code></pre>
<ul>
<li>null값은 is null
```</li>
<li><ul>
<li>TODO: 부서 ID가 없는 직원들을 삭제
delete from emp where dept_id is null;
```</li>
</ul>
</li>
<li>여러 조건은 where절에서 and로 연결
```sql</li>
<li><ul>
<li>TODO: 담당 업무(emp.job_id)가 &#39;SA_MAN&#39;이고 급여(emp.salary) 가 12000 미만인 직원들을 삭제. 
select * from emp where job_id = &#39;SA_MAN&#39; and salary &lt; 12000;</li>
</ul>
</li>
</ul>
<p>delete from emp where job_id = &#39;SA_MAN&#39; and salary &lt; 12000;</p>
<p>-- TODO: comm_pct 가 null이고 job_id 가 IT_PROG인 직원들을 삭제
select * from emp where comm_pct is null and job_id = &#39;IT_PROG&#39;;</p>
<p>select count(*) from emp;
select @@autocommit;
set autocommit = 0;</p>
<p>delete from emp;
select count(*) from emp;
rollback;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드잇] 선형대수학 필요한 만큼만 배우기 - numpy와 행렬/벡터]]></title>
            <link>https://velog.io/@shasha_malone/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99</link>
            <guid>https://velog.io/@shasha_malone/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99</guid>
            <pubDate>Tue, 12 Sep 2023 00:50:57 GMT</pubDate>
            <description><![CDATA[<h3 id="01-일차식과-일차함수">01. 일차식과 일차함수</h3>
<p>일차식: 가장 높은 차수가 1인 다항식
6x + 4y - 7
일차함수: 가장 높은 차수가 1인 함수
y = 3x + 6</p>
<h3 id="03-행렬과-벡터">03. 행렬과 벡터</h3>
<p>행렬 :Matrix
<img src="https://velog.velcdn.com/images/shasha_malone/post/daa483c2-9f0f-413a-a411-7606135a1fca/image.png" alt="">
행렬의 가로줄 - 행(row)
행렬의 세로줄 - 열(column)
3*4 행렬</p>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/cae5d7e2-24bf-42b0-a74f-a7d93c6ecb8a/image.png" alt="">
<img src="https://velog.velcdn.com/images/shasha_malone/post/0089a166-c248-44a8-92e3-4192a2145e2b/image.png" alt="">
예)
<img src="https://velog.velcdn.com/images/shasha_malone/post/d6da93da-17c8-4466-b837-c4b1e5c0ea29/image.png" alt="">
2행3열 - 4</p>
<p>벡터 : 행이 하나거나 열이 하나인 행열
<img src="https://velog.velcdn.com/images/shasha_malone/post/c82803ac-5b61-4f45-adbe-ffdffba7d55f/image.png" alt="">
열 벡터 - 벡터의 기본 형태, 많이 씀
5차원 열벡터, 4차원 행 벡터
<img src="https://velog.velcdn.com/images/shasha_malone/post/1d5d0a9d-87fd-4a3a-921c-795ab9ba6e9e/image.png" alt=""></p>
<h3 id="numpy로-행렬-사용하기">numpy로 행렬 사용하기</h3>
<pre><code class="language-pyhton"># 4행 3열 numpy 생성하기
import numpy as np
A = np.array ([[1,-1,2],
         [3,3,2],
         [2,5,2],
         [4,6,2]])

# 랜덤
C = np.random.rand(3, 5) # 차원 - 3행 5열 
D = np.zeros((2,4)) # 2행 4열, 모두 0, 괄호 하나더 

# 행렬 불러오기 
A[0][2] #1행 3열
&gt;&gt;&gt; 2</code></pre>
<h3 id="numpy로-행렬-연습">numpy로 행렬 연습</h3>
<pre><code class="language-python">import numpy as np
A = np.array([0,1,-1],
[1,2,3],
[2,1,0],
[-1,2,-4])

B= np.array([0,2],
[1,1], [-1,-2])

A[1][1]
A[3][0]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[플레이데이터 애널리시스 33기 6주차(9/4 ~9/10) 회고]]></title>
            <link>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-6%EC%A3%BC%EC%B0%A894-910-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@shasha_malone/%ED%94%8C%EB%A0%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%A0%EB%84%90%EB%A6%AC%EC%8B%9C%EC%8A%A4-33%EA%B8%B0-6%EC%A3%BC%EC%B0%A894-910-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Mon, 11 Sep 2023 12:17:33 GMT</pubDate>
            <description><![CDATA[<h2 id="1-전반적인-느낌일주일동안-한-일">1. 전반적인 느낌(일주일동안 한 일)</h2>
<p>6주차 끝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 SQL 개념도 끝!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 이거 잘 정리해뒀다가 한번에 SQLD 따주겟다 ㅋ.ㅋ</p>
<ul>
<li><p>자세히 요약하자면,
mysql에서  <code>03. 집계함수</code>에서 한 컬럼의 모든 값을 한번에 연산하는 함수들, sum(),avg()등을 배웠고 <code>04. join</code>에서 서로 다른 테이블을 연결한느 방법을 배웠고, <code>05. 서브쿼리</code>에서는 1) 메인쿼리안에 
where절, from절에 서브쿼리를 넣어 행에 대한 조건을 걸거나, 가상의 테이블을 형성해서 alias를 설정해 조인하는 등의 처리를 했다. 이어 상관/비상관 쿼리와 연관해서 내가 찾고 싶은 값이 테이블에 존재하는지 행을 하나씩 체크하는 쿼리를 where절에 exists와 not exists를 사용해서 찾아냈다.<code>06.집합연산자</code>에서는 테이블을 세로로 합치는 union에 대해서 배웠다. 연산의 대상이되는select문의 컬럼 수와 타입이 같아야 한다.<code>07.DML</code>과 <code>08.DDL</code>까지 진도가 나가 SQL도 거의 마무리가 되었다. 여기서 파이썬에서  SQL쿼리문을 작성하는 것을 배우니 , 파이썬에서 외부자원과 연결하는 것을 배웠던 Path파트가 새록새록 생각났다. 모든 개념이 종합적으로 적용되는 파트가 나오니 어려웠지만, 함수 짜는 과정에 익숙해지도록 연습을 더 해야할 것같다.</p>
</li>
<li><p>이번 주는 월,화에는 장염이 걸렸어서 월요일은 조퇴하고 하<del>~</del>루종일 잤다.  수,목,금,토,일이 전부 약속이 있었어서,,,장염으로 앓은 것치고 너무 알차게,,,저녁에 놀았다. 공부할 시간이 없다고 부르짖었으나 사실은 약속이 많았던 것으로,,, <strong>하루에 최소 개인공부시간 2-3시간은 확보</strong>해야할 것같다. 어째 휴학 전보다 훨씬 바쁜 것같지만 부트캠프 공부하려고 등록했으니가 6개월만 더 불태워볼 것. 그러려면 특히 집에 가는 지하철에서의 시간에 복습내용을 정리하는 공부를 하는 것이 좋겠다. 문제풀이는 좀 각잡고 해야하고 복습은 슴슴하게 하면서도 정리하면서 재미가 붙는 거니깐.</p>
</li>
</ul>
<h2 id="2-좋았던-점좋았거나-내가-잘했던-점">2. 좋았던 점(좋았거나 내가 잘했던 점)</h2>
<ul>
<li>수업복습 스터디에서 서브쿼리부분을 스터디원들이 특히 어려워해 내가 설명할 기회를 가졌다. 내가 집중해서 이해를 시키려고 할수록 목소리가 커지고 발음이 똑똑해진다는 피드백을 받았다. 아무튼 내가 준비한 자료를 보고 다른 팀원들이 잘 이해하고 얻어가는 모습을 보니 정말 뿌듯했다. 나는 정말 남을 도울 때 뿌듯함을 느끼는 성격인 것같긴하다... </li>
<li>수업이 끝나고 공부한 것을 정리하는 것에서 수업 중에 정리하는 것으로 바꾼 것에 잘 적응하고 있다. 물론 내용이 어려우면 진도를 따라가느라 급급하지만 확실히 정리하면서 이해되는 부분이 많아, 계속 틈틈히 정리를 하는 것이 좋겠다.</li>
<li>k-디지털 트레이닝 해커톤에 참여하게 되면서, 개념적 내용에만 집중하는 것이
아니라 실제 적용되는 건 어떨까?에 대한 생각을 할 수 있게 되어 좋다. 이번 주제가 &#39;모두를 위한 기술&#39;이기때문에 어떤 사람들에게 적용될 지 생각해보니 생활 속에서 개선할 수 있는 사항을 생각안하고 살았다는 생각이 조금 들었다는 점? </li>
<li>근데 결국 해결책은&#39; 문제정의&#39;를 얼마나 정확히 하냐에서 오는 것같다. 기발한 아이디어들도 큰 ,획기적인 부분이 아니라 정말 생활 속  세부적인 것에서 온다는 생각이 많이 들었음.<h2 id="3-아쉬웠던-점">3. 아쉬웠던 점</h2>
</li>
<li>선형대수학 공부를 좀 더 빠르게 시작했어야하는데 이번주에는 정말 수업만 딱! 들었던 것 같다.
(아무래도 수목금토약속이쎳으닉까,,,)
코드잇에서 선형대수학관련강의 수강 -&gt;스터디 교재 : 한걸음씩 알아가는 선형대수학 풀어볼 것!</li>
<li>장염때문에 못갔던 운동 3번 갈 것! 일단은 화 새벽, 수 새벽, 금 저녁을 계획중이다</li>
</ul>
<h2 id="4-개선할-점">4. 개선할 점</h2>
<ul>
<li><p>아쉬웠던 점과 동일! 공부 시간 늘리자.
운동은 아침에, 저녁에는 공부, 밤에는 통화 30분 이내로 </p>
</li>
<li><p>내가 이해한 부분에 대해서 생각하고 더 생각하기 자신있게 말하기!</p>
<h2 id="5-다음주-계획">5. 다음주 계획</h2>
</li>
<li><p>프로그래머스 기초 day 4,5,6,7,8,9</p>
</li>
<li><p>비전공자를 위한 이해할 수 있는 IT지식 읽기</p>
</li>
<li><p>한 걸음씩 알아가는 선형대수학 1.1 연립일차방정식 ~ 1.3 벡터연산</p>
</li>
<li><p>K-디지털 트레이닝 해커톤 아이데이션 한 거 기술 찾아서 기획서 초안 작성할 것</p>
</li>
</ul>
<hr>
<ul>
<li><p>수업 내용 velog 매일 업로드</p>
</li>
<li><p>하루 2~3시간 자습시간 확보</p>
</li>
<li><p>주3회 운동하기</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[가상환경 만들기 (23.09.11)]]></title>
            <link>https://velog.io/@shasha_malone/%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@shasha_malone/%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 11 Sep 2023 08:29:39 GMT</pubDate>
            <description><![CDATA[<h3 id="가상환경-생성">가상환경 생성</h3>
<p>conda create --name da -&gt; y 선택
conda  create --name  da  python #가상환경 설치+ 파이썬 설치</p>
<h3 id="가상환경-활성화">가상환경 활성화</h3>
<p>conda activate (이름)</p>
<p>conda activate da -&gt; da 가상환경 실행
conda activate base -&gt; base였던 가상환경 실행</p>
<h3 id="가상환경에-python-설치">가상환경에 python 설치</h3>
<p>conda install python[-y] </p>
<p>-y를 붙이면 y/n선택지 나오지 않고 자동설치됨
가상환경마다 python, pymysql 등을 설치해야함.</p>
<h3 id="패키지-lib-설치">패키지, lib 설치</h3>
<p>pip  install  pandas  notebook  matplotlib  pymysql</p>
<ul>
<li>한번에 여러개 설치할시, 띄어쓰기로 구분하여 나열</li>
<li>버전 지정하지 않으면 최신 버전, 버전 지정시 라이브러리 = 버전 </li>
</ul>
<h3 id="가상환경에서-나가기--비활성화">가상환경에서 나가기 , 비활성화</h3>
<p>conda deactivate </p>
<h3 id="현재-존재하는-가상환경-조회">현재 존재하는 가상환경 조회</h3>
<p>conda info --envs</p>
<h3 id="가상환경-삭제">가상환경 삭제</h3>
<p>onda remove -n 가상환경이름 패키지이름
conda  remove  --name  da --all</p>
<h3 id="설치된-패키지-확인">설치된 패키지 확인</h3>
<p>conda list
pip list</p>
<ul>
<li>모든 패키지 확인 </li>
</ul>
<p>pip show 패키지이름 </p>
<ul>
<li>1개의 패키지 설치 확인</li>
</ul>
<h3 id="설치된-패키지-업데이트">설치된 패키지 업데이트</h3>
<p>conda update 패키지명</p>
<hr>
<p>다음부터 실행 시,</p>
<p>1)conda activate da #da 가상환경 실행
2)jupyter notebook
-&gt; 프로젝트를 할 시, 가상환경을 새로 만들고 그 가상환경에서 필요한 라이브러리를 설치 후 시작한다. </p>
<ul>
<li>jupyter notebook을 꼭 라이브러리 설치 해줘야 da에 연결된 j/n이 실행된다.</li>
<li>필요없는 가상환경은 삭제해주기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 06.집합연산자(2023.09.08)]]></title>
            <link>https://velog.io/@shasha_malone/SQL-06.%EC%A7%91%ED%95%A9%EC%97%B0%EC%82%B0%EC%9E%902023.09.08</link>
            <guid>https://velog.io/@shasha_malone/SQL-06.%EC%A7%91%ED%95%A9%EC%97%B0%EC%82%B0%EC%9E%902023.09.08</guid>
            <pubDate>Fri, 08 Sep 2023 00:38:14 GMT</pubDate>
            <description><![CDATA[<h2 id="집합-연산자-결합-쿼리">집합 연산자 (결합 쿼리)</h2>
<ul>
<li><p>둘 이상의 select 결과를 합치는 연산</p>
</li>
<li><p>구문
select문  집합연산자 select문 [집합연산자 select문 ...] [order by 정렬컬럼 정렬방식]</p>
</li>
<li><p>컬럼이 3개, 컬럼이 3개있는 행끼리 수직적으로(세로로) 합칠건데 
같은 컬럼이니까 행으로 붙을 수있음</p>
<p>컬럼의 항목이 같을 필요는 없지만 , type은 같아야함.
컬럼명이 다를때 앞에 있는 첫번째 select문을 따른다.
[order by 정렬컬럼] - 합친 대상을 가지고 마지막에 정렬</p>
</li>
</ul>
<ul>
<li><p>연산자</p>
<ul>
<li>UNION: 두 select 결과를 하나로 결합한다. 단 중복되는 행은 제거한다. </li>
<li>UNION ALL : 두 select 결과를 하나로 결합한다. <strong>중복되는 행을 포함</strong>한다. </li>
</ul>
</li>
<li><p>규칙</p>
<ul>
<li>연산대상 select 문의 <strong>컬럼 수</strong>가 같아야 한다. </li>
<li>연산대상 select 문의 컬럼의 <strong>타입</strong>이 같아야 한다.</li>
<li>연산 결과의 컬럼이름은 첫번째 select문의 것을 따른다.</li>
<li>order by 절은 합친 이후 구문의 <strong>마지막</strong>에 넣을 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">  -- emp 테이블의 salary 최대값와 salary 최소값, salary 평균값 조회
select max(salary), min(salary), avg(salary) from emp;</code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/bc89f82b-c2a2-4869-81a0-1b02689726d6/image.png" alt="">
각 값을 세로로 합치고 싶음 -&gt; union</p>
<pre><code class="language-sql">select &#39;합계&#39; as &quot;Label&quot;, max(salary) as &quot;집계결과&quot; from emp -- 첫번째 select문의 컬럼명
union
select &#39;최소값&#39;, min(salary) from emp
union
select &#39;평균&#39;, round(avg(salary),2) from emp;
-- 컬럼 값 1개, 실수형 type 일치(컬럼 수, type 일치해야함) -&gt; union사용가능</code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/6e84c9b0-35cd-4f8e-b54b-0cfba1790f5c/image.png" alt=""></p>
<p>=&gt; union을 사용해서 라벨과 집계결과 컬럼을 가진 행 3개를 합침. 라벨 컬럼에는 문자열이, 집계결과에는 실수형이 들어온 것 처럼 컬럼 수 와 type을 일치 시켜줘야함</p>
<pre><code class="language-sql">-- full outer join 정의
-- left join과 irght join 했던 값들을join
select * from emp e left join  dept d on e.dept_id = d.dept_id
union
select * from emp e right join dept d on e.dept_id = d.dept_id;
-- union과 union all : 둘 다 상관 없으면, union all을 하는 것이 좋음(속도 향상). 중복된 것을 걸러내고 싶다면 union 


```sql
-- with rollup
select dept_id, sum(salary) as &quot;급여합계&quot;
from emp
group by dept_id 
union all
select &#39;총집계&#39;, sum(salary) from emp;
with rollup;
</code></pre>
<pre><code class="language-sql">-- order by(정렬)는 ucion으로 합치고 나서 마지막에 전체 결과에 대해 실행한다.
select * from emp e left join  dept d on e.dept_id = d.dept_id
union all
select * from emp e right join dept d on e.dept_id = d.dept_id
order by salary desc;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 05.서브쿼리 - 02. 상관/비상관쿼리 + EXISTS, NOT EXISTS연산자 ]]></title>
            <link>https://velog.io/@shasha_malone/05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%ACSQL-05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-02.-%EC%83%81%EA%B4%80%EB%B9%84%EC%83%81%EA%B4%80%EC%BF%BC%EB%A6%AC-EXISTS-NOT-EXISTS%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@shasha_malone/05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%ACSQL-05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-02.-%EC%83%81%EA%B4%80%EB%B9%84%EC%83%81%EA%B4%80%EC%BF%BC%EB%A6%AC-EXISTS-NOT-EXISTS%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Fri, 08 Sep 2023 00:37:44 GMT</pubDate>
            <description><![CDATA[<h1 id="상관연관-쿼리">상관(연관) 쿼리</h1>
<ul>
<li>메인쿼리문의 조회값을 서브쿼리의 조건에서 사용하는 쿼리.</li>
<li>메인쿼리를 실행하고 그 결과를 바탕으로 서브쿼리의 조건절을 비교한다.<ul>
<li>메인 쿼리의 where을 실행하면서 subquery가 같이 실행된다. 이때 메인쿼리 where 절에서 비교하는 그 행의 컬럼값들을 가지고 subquery가 실행된다.
```sql </li>
</ul>
</li>
<li><ul>
<li>부서별(DEPT)에서 급여(emp.salary)를 가장 많이 받는 </li>
</ul>
</li>
<li><ul>
<li>직원들의 id(emp.emp_id), 이름(emp.emp_name), 연봉(emp.salary), 소속부서ID(dept.dept_id) </li>
</ul>
</li>
</ul>
<p>조회</p>
<p>select e.emp_id, e.emp_name, e.salary, e.dept_id
from emp e 
where salary = 24000.00;</p>
<p>select max(salary) from emp where dept_id = 90;</p>
<hr>
<p>select max(salary) from emp group by dept_id;</p>
<h2 id="메인쿼리의-값을-서브쿼리의-조건에서-사용">메인쿼리의 값을 서브쿼리의 조건에서 사용</h2>
<p>select e.emp_id, e.emp_name, e.salary, e.dept_id
from emp e
where salary = (select max(salary)
                from emp 
                where ifnull(dept_id,0) = ifnull(e.dept_id,0));
#1) where절 서브쿼리가 실행될때  e.dept_id 를 사용하므로 메인 뭐리 각 행을 가져와 실행 =&gt; 메인/서브쿼리가 동시에 실행되는 상관쿼리)
#2) dept_id =&gt; 서브쿼리의 from emp에서 가져온 dept_id 컬럼
-- e.dept_id =&gt; 바깥쪽테이블의 from emp e에서 가져온 dept_id
-- =&gt; 메인쿼리에 alias를 설정해 서브쿼리와 메인쿼리의 테이블을 물리적으로 분리한다.
#3) dept_id는 null을 가질 수 있기 때문에 ifnull()로 변환해서 비교한다.
-- null != null;</p>
<pre><code>

# EXISTS, NOT EXISTS 연산자 (상관(연관)쿼리와 같이 사용된다)
-- 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건. 
-- 조건을 만족하는 행이 여러개라도 한행만 있으면 더이상 검색하지 않는다.

- 보통 데이터테이블의 값이 이력테이블(Transaction TB)에 있는지 여부를 조회할 때 사용된다.
    - 메인쿼리: 데이터테이블
    - 서브쿼리: 이력테이블
    - 메인쿼리에서 조회할 행이 서브쿼리의 테이블에 있는지(또는 없는지) 확인

고객(데이터) 주문(이력) -&gt; 특정 고객이 주문을 한 적이 있는지 여부
장비(데이터) 대여(이력) -&gt; 특정 장비가 대여 된 적이 있는지 여부


```sql
-- 직원이 한명이상 있는 부서의 부서ID(dept.dept_id)와 이름(dept.dept_name),위치(dept.loc)를 조회
-- 직원(자식)이 부서(부모)를 참조. 부서(부모)의 값이 직원(자식)

개념 )
select * from dept
where (select * from emp where dept_id = 120); -- 값이 안나오면 없는 것 =&gt; 이 쿼리를 시행했을 때 한 행이라도 나오는 쿼리 필요 
-- dept table의 행을 하나씩 체크하면서 dept에 emp table의 detp_id가 120일때와 같을 때가 있는지를 확인한다. =&gt; 상관쿼리면서 exists로 값이 존재하는 행만 출력

Exists)
select * from dept
where exists (select salary from emp where dept_id = dept.dept_id);
-- 상관쿼리 : 서브쿼리에 있는 값이 메인쿼리의 있는 값을 포함하고 있어야함.

--확인
select * from dept;
select * from emp;</code></pre><p>예) </p>
<pre><code class="language-sql">-- 직원이 한명도 없는 부서의 부서ID(dept.dept_id)와 이름(dept.dept_name), 위치(dept.loc)를 조회
select * from dept
where not exists (select dept_id from emp where dept_id = dept.dept_id);</code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/c8ff6a42-11ec-4307-8d19-4a8e076c56a8/image.png" alt=""></p>
<p>예)</p>
<pre><code class="language-sql">-- 부서(dept)에서 연봉(emp.salary)이 13000이상인 한명이라도 있는 부서의 부서ID(dept.dept_id)와 이름(dept.dept_name), 위치(dept.loc)를 조회
select  dept_id, dept_name, loc
from    dept d
where exists (select emp_id 
               from  emp 
              where dept_id = d.dept_id and salary &gt;= 13000);
;
select max(salary) from emp where dept_id = 40;
</code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/748c8121-0b5b-4c0b-a431-f623195839d3/image.png" alt=""></p>
<h3 id="todo-문제--주문-관련-테이블들-이용">TODO 문제 -주문 관련 테이블들 이용.</h3>
<pre><code class="language-sql">-- TODO: 고객(customers) 중 주문(orders)을 한번 이상 한 고객들을 조회.

select * from orders where cust_id = 150;
-- cust_Id를 하나씩 쳐가며 값이 나오면 존재,값이 나오지 않으면 존재하지 않는다 =&gt; 이를 where절에서 하나의 쿼리로 시행하고 싶음 =&gt; exists 사용


select *
from customers c
where exists (select * from orders where cust_id = c.cust_id);
-- not exists = 존재하는 행이 출력


-- TODO: 고객(customers) 중 주문(orders)을 한번도 하지 않은 고객들을 조회.
select *
from customers c
where not exists (select * from orders where cust_id = c.cust_id);
-- not exists = 존재하지 앉는 행이 출력

-- TODO: 제품(products) 중 한번이상 주문된 제품 정보 조회
select * from products p
where exists (select * from order_items
             where product_id = p.product_id);

-- TODO: 제품(products)중 주문이 한번도 안된 제품 정보 조회

select * from products p
where not exists (select * from order_items
             where product_id = p.product_id);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 05.서브쿼리 - 01. select절, where절,from절]]></title>
            <link>https://velog.io/@shasha_malone/SQL-05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-01.-select%EC%A0%88-where%EC%A0%88from%EC%A0%88</link>
            <guid>https://velog.io/@shasha_malone/SQL-05.%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-01.-select%EC%A0%88-where%EC%A0%88from%EC%A0%88</guid>
            <pubDate>Thu, 07 Sep 2023 02:36:10 GMT</pubDate>
            <description><![CDATA[<ul>
<li>ctrl+Shift+enter : block설정한 부분만 실행</li>
</ul>
<hr>
<h2 id="서브쿼리sub-query">서브쿼리(Sub Query)</h2>
<ul>
<li>쿼리안에서 select 쿼리를 사용하는 것.</li>
<li>메인 쿼리 - 서브쿼리</li>
</ul>
<h3 id="서브쿼리가-사용되는-구">서브쿼리가 사용되는 구</h3>
<ul>
<li>select절, from절, where절, having절</li>
</ul>
<h3 id="서브쿼리의-종류">서브쿼리의 종류</h3>
<p>1) 어느 구절에 사용되었는지에 따른 구분
    - <code>스칼라 서브쿼리</code> - <strong>select 절에 사용.</strong> 반드시 서브쿼리 결과가 1행 1열(값 하나-스칼라) 0행이 조회되면 null을 반환
    - <code>인라인 뷰(inline View)</code>⭐- <strong>from 절</strong>에 사용되어 <strong>테이블</strong>의 역할을 한다.
    가상테이블을 임시적으로 생성하고 그 테이블에서 select구문을 실행하는 것. 물리적테이블이 아니라 개념적테이블
    + <strong>where절</strong> : 행의 조건의 값을 가진 컬럼을 제공한다.(행 수에 따라 단행/다중행 서브쿼리)</p>
<p>2) 서브쿼리 조회결과 행수에 따른 구분</p>
<ul>
<li><code>단일행 서브쿼리</code>⭐- 서브쿼리의 조회결과 행이 한행인 것.</li>
<li><code>다중행 서브쿼리</code>⭐- 서브쿼리의 조회결과 행이 여러행인 것.<ul>
<li>= 대신 <code>in</code> : <strong>해당 행과 같은 값</strong>을 가져온다.</li>
<li>크기 비교 <code>all/any</code> : 가장 큰(작은)값보다 더 큰(작은)값을 가져올때는, <code>all/any</code>를 <strong>&gt;,&lt;부호와 함께 where절</strong>에 적어야한다. max/min을 서브쿼리의select에서 사용하면 단일 행 쿼리가 되어, &gt;&lt;를 단독으로 사용가능하다. 그래서 max/min을 더 많이 쓰는 경향</li>
</ul>
</li>
</ul>
<p>3) 동작 방식에 따른 구분</p>
<ul>
<li><p><code>비상관(비연관) 서브쿼리</code>
서브쿼리에 메인쿼리의 컬럼이 사용되지 않는다.메인쿼리에 사용할 값을 서브쿼리가 제공. 안쪽쿼리(서브쿼리)가 먼저 시행됨</p>
</li>
<li><p><code>상관(연관) 서브쿼리</code>
서브쿼리에서 메인쿼리의 컬럼을 사용한다. 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할때 주로 사용한다.</p>
<pre><code class="language-sql">비상관 쿼리ex.
select * form emp
where salary &gt; (select avg(salary) from emp);
: 메인쿼리에서 조회한 값을 where절에서 사용(메인쿼리와 서브쿼리가 동시에, 번갈아가면서 시행)</code></pre>
<ul>
<li>서브쿼리는 반드시 ( ) 로 묶어줘야 한다.</li>
</ul>
</li>
</ul>
<h2 id="select절">SELECT절</h2>
<ul>
<li>서브쿼리를 <strong>하나의 열</strong>처럼 사용<pre><code class="language-sql">emp, dept 테이블 간의 공통값만 매칭하되, dept는 모든 값을 가져오고 emp에서는 gender열만 나오게 하기
</code></pre>
</li>
</ul>
<p>-- 서브쿼리 
select * , (select gender from emp where on e.member_id = e.member_id) as &quot;gender&quot;
from dept </p>
<p>-- 조인
select d.*, e.gender
from emp e left join dept e on e.member_id = e.member_id;</p>
<pre><code>emp테이블에서 gender컬럼만 똑 떼어서 가져오고 싶을 때 사용. select절 서브쿼리는 데이터 양이 맣을 수록 실행속도가 느려져 거의 사용되지 않는 명령어
## WHERE절 (+단일 행 쿼리) 
- 일반적인 서브쿼리

-- 직원_ID(emp.emp_id)가 120번인 직원과 같은 업무(emp.job_id)를 
--   하는 직원의 id(emp_id), 이름(emp.emp_name), 업무(emp.job_id), 급여(emp.salary) 조회
```sql
-- 조회 후 where 절에 조건 설정
select job_id from emp where emp_id = 120;

select emp_id, emp_name, job_id, salary
from emp
where job_id = &#39;ST_MAN&#39;;


-- 서브쿼리로 간단히 
select emp_id, emp_name, job_id, salary
from emp
where job_id = (select job_id from emp where emp_id = 120);</code></pre><ul>
<li><strong>pair 방식 서브쿼리. 두개이상 컬럼 비교해도 된다.</strong>
```sql</li>
<li><ul>
<li>직원_id(emp.emp_id)가 115번인 직원과 같은 업무(emp.job_id)를 하고 같은 부서(emp.dept_id)에 속한 직원들을 조회하시오.</li>
</ul>
</li>
</ul>
<p>-- 조회 후 조건 설정
select job_id, dept_id from emp where emp_id = 115; -- 직원_id(emp.emp_id)가 115번인 직원의 업무와 부서 확인
select * from emp where job_id =&#39;PU_MAN&#39; and dept_id = 30;</p>
<p>select * from emp
where (job_id, dept_id) = (select job_id, dept_id 
                          from emp 
                          where emp_id = 115);</p>
<p>select * from emp
where (job_id, dept_id) = (&#39;PU_MAN&#39;, 30);
-- where job_id = &#39;PU_MAN&#39; and dept_id = 30;</p>
<pre><code>- **연습 1) where절 서브쿼리 + 단일행 서브쿼리** 
```sql
-- 직원들 중 급여(emp.salary)가 전체 직원의 평균 급여보다 적은 직원들의 
--    id(emp.emp_id), 이름(emp.emp_name), 급여(emp.salary)를 조회. 

select avg(salary) from emp;

select emp_id, emp_name, salary
from emp
where salary &lt; (select avg(salary) from emp)
order by 3 desc;</code></pre><ul>
<li><p>select avg(salary) from emp 만 실행 &gt; 단일 행 서브쿼리
<img src="https://velog.velcdn.com/images/shasha_malone/post/bb94e7e2-30c7-46b0-b10d-c30b10e1aaf0/image.png" alt=""></p>
</li>
<li><p><strong>연습2) where절 서브쿼리 + group by</strong>
```sql</p>
</li>
<li><ul>
<li>부서직원들의 평균이 전체 직원의 평균(emp.salary) 이상인 부서의 이름(dept.dept_name), 평균 급여(emp.salary) 조회.</li>
</ul>
</li>
<li><ul>
<li>평균급여는 소숫점 2자리까지 나오고 통화표시($)와 단위 구분자 출력</li>
</ul>
</li>
</ul>
<p>select d.dept_name as &quot;부서명&quot;, 
       concat(&#39;$&#39;, format(a.avg, 2)) as &quot;평균 급여&quot;
from(
    select dept_id, avg(salary) as &quot;avg&quot;
    from emp 
    group by dept_id
    having avg(salary) &gt; (select avg(salary) from emp) 
    order by 2) a left join dept d on a.dept_id = d.dept_id; -- a 테이블 형성 후 dept_name을 불러오기 위해 dept 조인</p>
<pre><code>- **연습3)**
```sql
-- TODO: 급여(emp.salary)가장 많이 받는 직원(-&gt; where)이 속한 부서의 이름(dept.dept_name), 위치(dept.loc)를 조회.
-- 헷갈린 문제
select d.dept_name, d.loc
from (select *
      from emp
      where emp_id = (select emp_id from emp where salary = max(salary)) -- -&gt;직원 정보: 소스테이블로 설정
      e left join dept d on e.dept_id = d.dept_id ;


-- 선생님 답1 : 이중 서브 쿼리 
select dept_name, loc
from dept
where dept_id = (select dept_id
                from emp
                where salary = (select max(salary)
                               from emp));
  -- 선생님 답2 : 조인
select d.dept_name,d.loc
from dept d left join emp e on d.dept_id = e.dept_id
where salary = (select max(salary) from emp);</code></pre><ul>
<li><strong>연습4)</strong>
```sql</li>
<li><ul>
<li>TODO: 전체 직원들 중 담당 업무 ID(emp.job_id) 가 &#39;ST_CLERK&#39;인 직원들의 평균 급여보다 적은 급여를 받는 직원들의 모든 정보를 조회. </li>
</ul>
</li>
<li><ul>
<li>단 업무 ID가 &#39;ST_CLERK&#39;이 아닌 직원들만 조회. 
select *
from emp
where salary &lt; any (<pre><code>             select avg(salary) 
             from emp 
             where job_id = &#39;ST_CLERK&#39;) -- 2817.647059</code></pre>and job_id != &#39;ST_CLERK&#39;
order by salary desc;</li>
</ul>
</li>
</ul>
<p>-- 선생님 답
select *
from emp
where salary &lt; any (
                    select avg(salary) 
                    from emp 
                    where job_id = &#39;ST_CLERK&#39;) -- 2817.647059
and (job_id != &#39;ST_CLERK&#39; 
or job_id is null)
order by salary desc;
-- job_id is null까지 설정 해줘야 job_id가 설정안된 null값이 나옴</p>
<pre><code>### 다중행 서브쿼리(where 절)
 - 서브쿼리의 조회 결과가 여러행
 - in 은 =,any all/any &gt;&lt;부호 로 사용됨
 - `where절` 에서의 연산자
    - `in`
    - 비교연산자 `any` : 조회된 값들 중 하나만 참이면 참 (where 컬럼 &gt; any(서브쿼리) )
    - 비교연산자 `all` : 조회된 값들 모두와 참이면 참 (where 컬럼 &gt; all(서브쿼리) )

- Join과 서브쿼리를 선택하는 것은 상황에 따라 다르다. 여기서는 서브쿼리 위주로 보자.
**예1 : in **
```sql
-- &#39;Alexander&#39; 란 이름(emp.emp_name)을 가진 관리자(emp.mgr_id)의 
-- 부하 직원들의 ID(emp_id), 이름(emp_name), 업무(job_id), 입사년도(hire_date-년도만출력), 급여(salary)를 조회

select emp_id, emp_name from emp where emp_name = &#39;Alexander&#39;; -- emp_id 103,115 두 행이 나옴


select emp_id, emp_name, job_id, year(hire_date), salary, mgr_id
from emp
where mgr_id in (select emp_id
                from emp 
                where emp_name = &#39;Alexander&#39;);
-- Subquery returns more than 1 row    
-- 에러: 서브쿼리가 1개 이상의 행을 리턴 -&gt; where절에서 서브쿼리랑 연결시, in연산자를 사용해야함. 다중행쿼리에서는 =연산자 사용 x</code></pre><p>*<em>예2 : in *</em></p>
<pre><code class="language-sql">TODO : 부서 위치(dept.loc) 가 &#39;New York&#39;인 부서에 소속된(&gt; where절 조건)
직원의 ID(emp.emp_id), 이름(emp.emp_name), 
부서_id(emp.dept_id) 를 sub query를 이용해 조회.

-- 서브 쿼리
select emp_id, emp_name, dept_id 
from emp
where dept_id in (select dept_id
                  from dept
                  where loc = &#39;New York&#39;);

-- 조인
select e.emp_id, e.emp_name, d.dept_id
from emp e left join dept d on e.dept_id = d.dept_id
where d.loc = &#39;New York&#39;;</code></pre>
<p><strong>예3: in</strong>
다른 테이블의 결과값 테이블의 컬럼이 메인쿼리에도 있다면 join없이 연결</p>
<pre><code class="language-sql">-- TODO : 최대 급여(job.max_salary)가 6000이하인 업무를 담당하는  직원(emp)의 모든 정보를 sub query를 이용해 조회.
-- 헷갈린 문제

select * 
from emp
where job_id in (select job_id
                 from job 
                 where max_salary &lt;= 6000);</code></pre>
<ul>
<li>job테이블에서 max_salary 6000이하인 업무만 가져온다(select job_id from job where max_salary &lt;= 6000)
<img src="https://velog.velcdn.com/images/shasha_malone/post/4af26e90-9220-4044-96a9-44b9acc5af07/image.png" alt=""></li>
</ul>
<p>*<em>예3 : all *</em></p>
<pre><code class="language-sql">-- 직원 ID(emp.emp_id)가 101, 102, 103 인 직원들 보다 급여(emp.salary)를 많이 받는 직원의 모든 정보를 조회.
select * from emp
where salary &gt; all (select salary 
                from emp
                where emp_id in (101, 102, 103));

 -- min,max : all, any는 max, min으로 대체가능.오히려 더 많이 사용         
select * from emp
where salary &gt;  (select max(salary) 
                 from emp
                 where emp_id in (101, 102, 103));</code></pre>
<p><strong>예4 : any</strong> 
group by로 부서별 평균값 계산 - any 그중에 가장 작은값보다 적게 </p>
<pre><code class="language-sql">부서별 급여의 평균중 가장 적은 부서의 평균 급여보다 보다 많이 받는 직원들의 이름, 급여, 업무를 서브쿼리를 이용해 조회

select emp_name, salary, job_id
from emp
where salary &lt; any (select avg(salary)
                    from emp
                    group by dept_id); -- 부서별로 평균값을 계산 -&gt; 그중에 가장 작은 값보다 적게 받아야함 :any</code></pre>
<p>부서별 평균값 계산 (select avg(salary) from emp group by dept_id)
<img src="https://velog.velcdn.com/images/shasha_malone/post/78b66c12-a351-4883-a09f-64ef2c65f132/image.png" alt="">
any 처리
<img src="https://velog.velcdn.com/images/shasha_malone/post/a9083be3-90e6-4f48-94c2-07bdb7d1b65a/image.png" alt=""></p>
<h2 id="from-절">FROM 절</h2>
<ul>
<li><strong>하나의 테이블</strong>처럼 사용. 열이름과 테이블명을 반드시 명시 해줘야한다.
```sql
select 이름
from (select emp_name as &quot;이름&quot;, salary from emp) a; </li>
<li><ul>
<li>alias반드시 사용
```</li>
</ul>
</li>
<li><em>예1*</em>
```sql</li>
<li><ul>
<li>TODO: 급여(emp.salary)가장 많이 받는 직원(-&gt; where)이 속한 부서의 이름(dept.dept_name), 위치(dept.loc)를 조회.</li>
</ul>
</li>
<li><ul>
<li>헷갈린 문제</li>
</ul>
</li>
</ul>
<p>-- 선생님 답1 : 이중 서브 쿼리 
select dept_name, loc
from dept
where dept_id = (select dept_id
                from emp
                where salary = (select max(salary)
                               from emp));
  -- 선생님 답2 : 조인
select d.dept_name,d.loc
from dept d left join emp e on d.dept_id = e.dept_id
where salary = (select max(salary) from emp);</p>
<pre><code>

**예2**
![](https://velog.velcdn.com/images/shasha_malone/post/dc4221a1-1177-4d5d-b09f-94a02894d934/image.png)
아래 서브쿼리 실행 시 해당 테이블이 생성 -&gt; 이 가상의 테이블이 메인쿼리의from에 들어가 하나의 테이블처럼 쓰임. alias반드시 설정
```sql
select dept_id, avg(salary) as &quot;avg&quot;
    from emp 
    group by dept_id
    having avg(salary) &gt; (select avg(salary) from emp) 
    order by 2</code></pre><pre><code class="language-sql">-- 부서직원들의 평균이 전체 직원의 평균(emp.salary) 이상인 부서의 이름(dept.dept_name), 평균 급여(emp.salary) 조회.
-- 평균급여는 소숫점 2자리까지 나오고 통화표시($)와 단위 구분자 출력

select d.dept_name as &quot;부서명&quot;, 
       concat(&#39;$&#39;, format(a.avg, 2)) as &quot;평균 급여&quot;
from(
    select dept_id, avg(salary) as &quot;avg&quot;
    from emp 
    group by dept_id
    having avg(salary) &gt; (select avg(salary) from emp) 
    order by 2) a left join dept d on a.dept_id = d.dept_id; -- a 테이블 형성 후 dept_name을 불러오기 위해 dept 조인</code></pre>
<p> <img src="https://velog.velcdn.com/images/shasha_malone/post/8375ecbf-687b-4982-8656-7dcf43178fca/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 04. join - todo 문제⭐ (23.09.06)]]></title>
            <link>https://velog.io/@shasha_malone/SQL-04.-join-todo-%EB%AC%B8%EC%A0%9C-23.09.06</link>
            <guid>https://velog.io/@shasha_malone/SQL-04.-join-todo-%EB%AC%B8%EC%A0%9C-23.09.06</guid>
            <pubDate>Wed, 06 Sep 2023 03:31:27 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>고객 ID가 120인 고객의 이름, 성별, 가입일과 지금까지 주문한 주문정보 중 주문_ID, 주문일, 총금액을 조회</p>
<pre><code class="language-sql">select c.cust_name, 
     if(c.gender = &#39;m&#39;,&#39;남성&#39;,&#39;여성&#39;) as &quot;gender&quot;,
     c.join_date, 
     o.order_id, 
     o.order_date, 
     format(o.order_total,0) as &quot;order_total&quot;
from customers c left join orders o on c.cust_id = o.cust_id
where c.cust_id = 120;</code></pre>
<blockquote>
<p>where c.cust_id = 150;인 경우=&gt; 고객정보는 나오지만, 주문한 적이 없으므로 null값으로 나옴
<img src="https://velog.velcdn.com/images/shasha_malone/post/beb65cfa-6610-4cd6-859d-808b66e9c024/image.png" alt=""></p>
</blockquote>
</li>
<li><p>고객 ID가 120인 고객의 정보와 지금까지 주문한 주문정보를 모두 조회
```sql</p>
</li>
</ol>
<p>-- 주의 ) * 사용 x -&gt; 주문정보는 모두 조회but 고객정보는 특정 컬럼을 보고 싶음
select c.cust_name, 
       o.*
from customers c left join orders o on c.cust_id = o.cust_id
where c.cust_id = 120;</p>
<pre><code>3. 날짜 형식 - &#39;YYYY-mm-dd&#39;
```sql
TODO : &#39;2017/11/13&#39;(주문날짜) 에 주문된 주문의 주문고객의 
고객_ID, 이름, 주문상태, 총금액을 조회-- 헷갈린문제
select c.cust_id, 
c.cust_name, 
o.order_status,
o.order_total
from customers c join orders o on c.cust_id = o.cust_id
where o.order_date = &#39;2017-11-13&#39; ;</code></pre><ol start="3">
<li>4개의 테이블을 join 
=&gt; 고객테이블, 주문테이블,상품테이블,주문제품테이블 4개를 전부 조인<pre><code class="language-sql">TODO : 주문 ID가 4인 주문의 주문 고객의 이름, 주소, 우편번호, 주문일, 주문상태, 총금액, 주문 제품이름, 제조사, 제품가격, 판매가격, 제품수량을 조회.
</code></pre>
</li>
</ol>
<p>&lt;&lt; 테이블을 묶는 방법 &gt;&gt;
고객 - 주문 : 고객아이디cust_id로 연결
주문 - 주문 제품 : 주문아이디 order_id로 연결
주문제품 - 제품 : 제품아이디product_id로 연결</p>
<p>select c.cust_name, c.address, c.postal_code, -- customers
       o.order_date, o.order_status, o.order_total, -- orders
       p.product_name, p.price, oi.sell_price, oi.quantity -- products
from customers c left join orders o on c.cust_id = o.cust_id
                left join order_items ot on o.order_id = ot.order_id
                left join products p on ot.product_id = p.product_id
where o.order_id = 4; </p>
<pre><code>

4.제품 ID가 200인 제품(order_items)이 2017년에(orders) 몇개 주문되었는지 조회. 
```sql
select count(product_id=200)
from products p left join order_items oi on p.product_id = ot.product_id
where year(o.order_date) = 2017;

-- 선생님 답
select sum(quantity) as &quot;총판매개수&quot;
from order_items oi join orders o on oi.order_id = o.order_id
where year(o.order_date) = 2017
and oi.product_id = 200;
------------------------
products 테이블도 조인해야하나 했는데 select에 해당 x이므로 where에서 and조건으로 연결
count() x -&gt; sum(quantity)를 해야 데이터값들이 더해짐 </code></pre><p>5.Group by -&gt; 제품분류별 총 주문량을 조회 </p>
<pre><code class="language-sql">select p.category,
       ifnull(sum(oi.quantity),0) as &quot;총주문개수&quot;
from products p left join order_items oi on p.product_id = oi.product_id -- 팔린 제품은 order정보 null
group by p.category;
---------------
총주문량을 합치려면 sum(quantity)를 하면됨
카테고리별로 보고싶은 것이기 때문에 group by 사용</code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/07c931f1-7f79-4b5c-a3f1-800b39722e50/image.png" alt=""></p>
<pre><code class="language-sql">select p.category,
       ifnull(sum(oi.quantity),0) as &quot;총주문개수&quot;,
       count(oi.product_id) as &quot;주문횟수&quot; 
from products p left join order_items oi on p.product_id = oi.product_id -- 팔린 제품은 order정보 null
group by p.category
order by 2 desc;
-----
주문횟수를 추가하면 product_id의 행이 몇개인지 세면되므로 count(product_id)사용 </code></pre>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/62a3f7ca-a1e8-4e4b-bb60-467926855d8a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 04. join (23.09.05)]]></title>
            <link>https://velog.io/@shasha_malone/SQL-04.-join-23.09.05</link>
            <guid>https://velog.io/@shasha_malone/SQL-04.-join-23.09.05</guid>
            <pubDate>Tue, 05 Sep 2023 12:51:14 GMT</pubDate>
            <description><![CDATA[<h3 id="sql-실행순서">sql 실행순서</h3>
<p>select + from으로 컬럼을 선택후 &gt; where로 행을 걸러냄
<img src="https://velog.velcdn.com/images/shasha_malone/post/ded50853-1b80-4b13-8826-48ba7fd35335/image.png" alt=""></p>
<h2 id="erdentity-relation-dialog">ERD(Entity Relation Dialog)</h2>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/aa03d210-8aed-46b2-bb4e-72d6fefc3b47/image.png" alt=""></p>
<ul>
<li>어플리케이션 프로그램을 로직을 짜는 것 -&gt; 데이터는 DB에 넣어두고 짜기<h2 id="foreign-key-제약조건">Foreign key 제약조건</h2>
</li>
</ul>
<blockquote>
<pre><code class="language-sql">constraint 제약조건이름 foreign key(컬럼) references 부모테이블(PK컬럼=참조컬럼명) [ON 설정]</code></pre>
</blockquote>
<pre><code> - 자식테이블에 의해 참조되는 부모테이블의 행(row)은 삭제 될 수 없다.
            - 다른 자식테이블도 그 데이터를 참조 중
 - [ON설정] : 삭제하고 싶은 경우, 어떻게 처리할 건지 설정
        - 부모테이블의 참조 row삭제 시 자식 테이블의 참조 row삭제
        1) 자식 테이블의 참조중인 컬럼을 아예 삭제 : `on delete cascade`
        2) 자식테이블의 컬럼 값 NULL 설정(참조중인 행을삭제) : `on delete set null`(f/k가 null을 허용하는 키여야함)

![](https://velog.velcdn.com/images/shasha_malone/post/b813f39b-c812-43d1-884e-d28bf477f418/image.png)

![](https://velog.velcdn.com/images/shasha_malone/post/f120b186-cf56-468e-96a8-e19e197a7530/image.png)






```sql
DROP TABLE IF EXISTS emp; -- drop 데이터베이스 객체 삭제
CREATE TABLE emp(
    emp_id       INT PRIMARY KEY,
    emp_name  VARCHAR(20) NOT NULL,
    job_id       VARCHAR(30),
    mgr_id       INT,
    hire_date DATE NOT NULL,
    salary       DECIMAL(7,2) NOT NULL,
    comm_pct  DECIMAL(2,2),
    dept_id   INT, -- foreign key
    CONSTRAINT fk_emp_dept FOREIGN KEY(dept_id) REFERENCES dept(dept_id) ON DELETE SET NULL,
    CONSTRAINT fk_emp_job FOREIGN KEY(job_id) REFERENCES job(job_id) ON DELETE SET NULL,
    CONSTRAINT fk_emp_mgr FOREIGN KEY(mgr_id) REFERENCES emp(emp_id) ON DELETE SET NULL
);</code></pre><hr>
<h1 id="조인join"><strong>조인(JOIN)</strong></h1>
<blockquote>
<p>2개 이상의 테이블에 있는 컬럼들을 합쳐서 가상의 테이블을 만들어 조회하는 방식을 말한다.조인시Source 테이블의 데이터 행 은 모두 사용하고 Target table 의 데이터 행 은 조인 조건을 만족하는 행만 나오도록 한다
     - 소스테이블 : 내가 먼저 읽어야 한다고 생각하는 테이블. 조회해야하는 주 정보(main information) 테이블
    - 타겟테이블 : 소스를 읽은 후 소스에 조인할 대상이 되는 테이블. 조회하는 주정보의 부가정보(sub information) 제공 테이블</p>
</blockquote>
<ul>
<li>각 테이블을 어떻게 합칠지를 표현하는 것을 조인 연산이라고 한다.<ul>
<li>조인 연산에 따른 조인종류<ul>
<li>Equi join , non-equi join</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>조인의 종류</strong>
    <strong>Inner Join</strong> 
        - 양쪽 테이블에서 조인 조건을 만족하는 행들만 합친다. 
        - 교집합같은 개념
    <strong>Outer Join</strong>
        - 한쪽 테이블의 행들을 모두 사용하고 다른 쪽 테이블은 조인 조건을 만족하는 행만 합친다. 조인조건을 만족하는 행이 없는 경우 NULL을 합친다.
        -합 집합과 같은 개념
        - 종류 : Left Outer Join,  Right Outer Join, Full Outer Join
    <strong>Cross Join</strong>
        - 두 테이블의 곱집합을 반환한다. 거의 사용 x, 기준행이 없기 때문에 전체를 합친다</p>
</blockquote>
<h3 id="크로스조인">크로스조인</h3>
<pre><code class="language-sql">SELECT * 
  FROM t1 CROSS JOIN t2;</code></pre>
<p>예문)</p>
<pre><code class="language-sql">select count(*)
from emp cross join dept;

select count(*) from dept; -- 27
select count(*) from emp; -- 107
select 27 * 107; -- 2889 -- emp와 dept 데이터를 곱한 값
</code></pre>
<blockquote>
<p><strong>inner join vs outer join</strong> 
    무조건 outer join을 한다 -&gt; outer join은 모든 정보를 불러오기 때문. 
    정보를 많이 봐서 나쁠 것은 없음.</p>
</blockquote>
<h2 id="inner-join">INNER JOIN</h2>
<p><img src="https://velog.velcdn.com/images/shasha_malone/post/8d0840eb-c391-46df-914a-9e27966887df/image.png" alt=""></p>
<ul>
<li>양쪽 테이블에서 조인 조건을 만족하는 행들만 합친다.(교집합)</li>
<li>타켓테이블이냐 소스테이블이냐는 보통은 메인이되는 정보를 - 조회하려는 주대상이 되는 테이블을 앞에 두고, 서브정보를가진 테이블을 뒤에 두는 것. 정해진 정보가 있는건 아님. 컬럼 순서만 바뀌는 것임</li>
</ul>
<pre><code class="language-sql">FROM  테이블a [INNER] JOIN 테이블b ON 조인조건 </code></pre>
<ul>
<li>table 별칭(alias) ⭐<pre><code class="language-sql">select e.emp_id, e.emp_name, e.hire_date, d.dept_name 
from emp e inner join dept d on e.dept_id = d.dept_id; </code></pre>
</li>
</ul>
<pre><code class="language-sql">-- 직원의 ID(emp.emp_id)가 100인 직원의 직원_ID(emp.emp_id), 이름(emp.emp_name), 입사년도(emp.hire_date), 소속부서이름(dept.dept_name)을 조회.
select e.emp_name as &quot;직원이름&quot;,
        e.hire_date as &quot;입사일&quot;,
        d.dept_name as &quot;부서명&quot;
from emp e join dept d on e.dept_id = d.dept_id
where e.emp_id = 100;</code></pre>
<ul>
<li>join된 테이블에 한번 더 join</li>
</ul>
<pre><code class="language-sql">직원_ID(emp.emp_id), 이름(emp.emp_name), 급여(emp.salary), 
담당업무명(job.job_title), 소속부서이름(dept.dept_name)을 조회


select e.emp_id,
        e.emp_name,
        e.salary,
        j.job_title,
        d.dept_name
from emp e join job j on e.job_id = j.job_id
            join dept d on e.dept_id = d.dept_id;

</code></pre>
<p>헷갈린 문제)</p>
<pre><code class="language-sql">직원의 ID(emp.emp_id), 이름(emp.emp_name), 
급여(emp.salary), 급여등급(salary_grade.grade) 를 조회. 
`급여 등급 `오름차순으로 정렬

select e.emp_id,
   e.emp_name,
   e.salary ,
   concat(s.grade, &#39;등급&#39;) as &quot;grade&quot;
from emp e join salary_grade s on e.salary between s.low_sal and s.high_sal;
</code></pre>
<ul>
<li>salary_grade table
<img src="https://velog.velcdn.com/images/shasha_malone/post/a9614249-3180-4f70-b4d3-33163c1d37ba/image.png" alt=""></li>
<li>결과 테이블
<img src="https://velog.velcdn.com/images/shasha_malone/post/e3396968-2ed3-454c-8125-04286c9d47c1/image.png" alt=""></li>
</ul>
<p><strong>Q. 급여 등급 오름차순으로 어떻게 정렬?</strong>
<code>between s.low_sal and s.high_sal</code>을 설정해 e.salary가 low_sal,high_sal어느 범위에 오느냐에 따라 grade를 emp table에 다르게 join하게 된다. 예를 들어 e.salary가 8200이였을 경우, salary_grade table에서 low_sal 5001.00 ~ high_sal10000.00 사이에 값이 존재하므로 해당 열에 2등급이 join된다.</p>
<hr>
<p><strong>inner 조건 문제(어려웠던 것만)</strong> </p>
<p>✔️on 조인 조건을 자꾸 빼먹음</p>
<pre><code class="language-sql">
-- TODO 직원 id(emp.emp_id)가 200번대(200 ~ 299)인 직원들의  
-- 직원_ID(emp.emp_id), 이름(emp.emp_name), 급여(emp.salary), 소속부서이름(dept.dept_name), 부서위치(dept.loc)를 조회. 직원_ID의 내림차순으로 정렬.

select e.emp_id, e.emp_name, e.salary,
        d.dept_name, d.loc
from emp e join dept d on e.dept_id = d.dept_id
where e.emp_id between 200 and 299
order by e.emp_id desc; -- 1 desc

select e.emp_id , e.emp_name, e.salary, d.dept_name, d.loc
from emp e join 

TODO 업무(emp.job_id)가 &#39;FI_ACCOUNT&#39;인 직원의 &gt; where 조건
ID(emp.emp_id), 이름(emp.emp_name),업무(emp.job_id), 
소속부서이름(dept.dept_name), 부서위치 (dept.loc)를 조회. &gt; select 컬럼, 서로 다른 테이블이므로 Join
직원_ID의 내림차순으로 정렬. &gt; order by

select e.emp_id, e.emp_name, d.dept_name,
        d.dept_name, d.loc
from emp e join dept d on e.dept_id = d.dept_id
where e.job_id = &#39;FI_ACCOUNT&#39;
order by e.emp_id desc;


-- TODO 커미션을(emp.comm_pct) 받는 직원들의 
직원_ID(emp.emp_id), 이름(emp.emp_name),
-- 급여(emp.salary), 커미션비율(emp.comm_pct), 
소속부서이름(dept.dept_name), 부서위치(dept.loc)를 조회. 

직원_ID의 내림차순으로 정렬.


select e.emp_id, e.emp_name, e.salary , e.comm_pct,
        d.dept_name, d.loc 
from emp e join dept d on e.dept_id = d.dept_id
where e.comm_pct is not null
order by 1 desc;

-- TODO &#39;New York&#39;에 위치한(dept.loc) 부서의 부서_ID(dept.dept_id), 부서이름(dept.dept_name), 위치(dept.loc), 
-- 그 부서에 소속된 직원_ID(emp.emp_id), 직원 이름(emp.emp_name), 업무(emp.job_id)를 조회. 
select  d.dept_id, d.dept_name, d.loc,
     e.emp_id, e.emp_name, e.job_id
from dept d join emp e on d.dept_id = e.dept_id
where d.loc = &#39;New York&#39;;

-- TODO 직원_ID(emp.emp_id), 이름(emp.emp_name), 업무_ID(emp.job_id), 업무명(job.job_title) 를 조회.
select e.emp_id , e.emp_name, e.job_id, j.job_title
from emp e join job j on e.job_id = j.job_id;


-- TODO: 직원 ID 가 200 인 직원의 직원_ID(emp.emp_id), 이름(emp.emp_name), 
-- 급여(emp.salary), 담당업무명(job.job_title), 소속부서이름(dept.dept_name)을 조회              
-- 테이블 3개를 join

select e.emp_id, e.emp_name, e.salary, -- emp
        j.job_title, -- job
        d.dept_name -- dept
from emp e join job j on e.job_id = j.job_id
            join dept d on e.dept_id = d.dept_id -- 요기까지 조회
where e.emp_id = 200;

-- TODO: &#39;Shipping&#39; 부서의 부서명(dept.dept_name), 위치(dept.loc), 
-- 소속 직원의 이름(emp.emp_name), 업무명(job.job_title)을 조회. 직원이름 내림차순으로 정렬
select d.dept_name, d.loc, e.emp_name, j.job_title
from dept d join emp e on d.dept_id = e.dept_id
            join job j on e.job_id = j.job_id
order by e.emp_name desc;


-- TODO: &#39;San Francisco&#39; 에 근무(dept.loc)하는 직원의 id(emp.emp_id), 
-- 이름(emp.emp_name), 입사일(emp.hire_date)를 조회 입사일은 &#39;yyyy년 mm월 dd일&#39; 형식으로 출력
select e.emp_id,
        e.emp_name,
        date_format(e.hire_date, &#39;%Y년 %m월 %d일&#39;) as &quot;hire_date&quot;
from emp e join dept d on e.dept_id = d.dept_id
where d.loc = &#39;San Francisco&#39;; -- 행을 걸러냄


-- TODO 부서별 급여(salary)의 평균을 조회. 부서이름(dept.dept_name)과 급여평균을 출력. 급여 평균이 높은 순서로 정렬. 
select dept_id, avg(salary)
from emp
group by dept_id;

-- 선생님 추가 답 : left join ver
select ifnull(d.dept_name,&quot;미배치&quot;),
        avg(e.salary)
from emp e left join dept d on e.dept_id = d.dept_id
group by d.dept_name;

-- TODO 직원의 ID(emp.emp_id), 이름(emp.emp_name), 업무명(job.job_title), 
-- 급여(emp.salary), 급여등급(salary_grade.grade), 소속부서명(dept.dept_name)을 조회. 등급 내림차순으로 정렬
select e.emp_id, e.emp_name, j.job_title, e.salary, s.grade, d.dept_name
from emp e join job j on e.job_id = j.job_id
           join salary_grade s on e.salary between s.low_sal and s.high_sal
           join dept d on e.dept_id = d.dept_id
order by s.grade desc;


-- TODO salary 등급(salary_grade.grade)이 1인 직원들이 부서별로 몇명있는지 조회. 직원수가 많은 부서 순서대로 정렬.
select d.dept_name,
        count(*) as &quot;직원수&quot;
from emp e join dept d on e.dept_id = d.dept_id
            join salary_grade s on e.salary between s.low_sal and s.high_sal
where s.grade = 1
group by d.dept_name
order by 2 desc;
</code></pre>
<p>/* <strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>****</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></p>
<h3 id="self-조인">Self 조인</h3>
<blockquote>
<ul>
<li>물리적으로 하나의 테이블을 두개의 테이블처럼 조인하는 것.</li>
<li>self join에서는 하나를 부하테이블, 하나를 상사테이블로 생각</li>
<li>조직 구조나 계층 구조와 관련된 데이터를 쿼리할 때 유용</li>
</ul>
</blockquote>
<pre><code class="language-sql">직원 ID가 101인 직원의 직원의 ID(emp.emp_id), 
이름(emp.emp_name), 상사이름(emp.emp_name)을 조회

select * from emp where emp_id = 101;

select emp_name as 상사이름 from emp where emp_id = 100;

select e.emp_id,
       e.emp_name as &quot;직원이름&quot;,
       m.emp_name as &quot;상사이름&quot;
from emp e join emp m on e.mgr_id = m.emp_id
where e.emp_id = 101; 

</code></pre>
<h2 id="외부-조인-outer-join">외부 조인 (Outer Join)</h2>
<ul>
<li>불충분 조인:조인 연산 조건을 만족하지 않는 행도 포함해서 합친다</li>
<li>합집합 개념
<img src="https://velog.velcdn.com/images/shasha_malone/post/a8d40944-82ca-4c6d-8e1f-7eefea19c57e/image.png" alt=""></li>
</ul>
<ul>
<li><p>종류
<code>left  outer join</code>: 구문상 소스 테이블이 왼쪽
<code>right outer join</code>: 구문상 소스 테이블이 오른쪽
<code>full outer join</code>:  둘다 소스 테이블 (Mysql은 지원하지 않는다. - union 연산을 이용해서 구현)</p>
<pre><code>   - left join 은 왼쪽에 위치한 소스테이블과 연결된 값만 살리는 것, right join은 이의 반대. full join은 모든 값을 가져옴. 예를 들어 , 나-윈터, 카리나- 닝닝 이렇게 친구사이라고 할 때, left는 나,윈터,카리나 를 가져오고, right는 윈터,카리나,닝닝을 가져오고, full은 모든 사람을 가져옴.</code></pre></li>
<li><p>구문
```sql
from 테이블 a [LEFT | RIGHT] OUTER JOIN 테이블b ON 조인조건</p>
</li>
<li><p>OUTER는 생략 가능.</p>
<pre><code>
</code></pre></li>
</ul>
<p>예문)</p>
<pre><code class="language-sql">-- 직원의 id(emp.emp_id), 이름(emp.emp_name), 급여(emp.salary), 부서명(dept.dept_name), 부서위치(dept.loc)를 조회.부서가 없는 직원의 정보도 나오도록 조회. dept_name의 내림차순으로 정렬한다.

select count(*)
from emp e join dept d on e.dept_id = d.dept_id;

select count(*) from emp where dept_id is null;</code></pre>
<ul>
<li>from emp e left join dept d on e.dept_id = d.dept_id<pre><code>                      and d.dept_id = 80; -- and 추가적인 조건 </code></pre>=&gt; where 조건과는 다르다. join조건은 어떤 값들을 붙일 것인가에 대한 조건,where 조건은 다 완성된 테이블에서 어떤 행을 필터링해서 볼 것인가.
```</li>
<li><ul>
<li>모든 직원의 id(emp.emp_id), 이름(emp.emp_name), 부서_id(emp.dept_id)를 조회하는데</li>
</ul>
</li>
<li><ul>
<li>부서_id가 80 인 직원들은 부서명(dept.dept_name)과 부서위치(dept.loc) 도 같이 출력한다. (부서 ID가 80이 아니면 null이 나오도록) </li>
</ul>
</li>
</ul>
<h1 id="부서-id가-null---직원-테이블이-소스테이블--부서테이블이-타겟-테이블">부서 id가 null -&gt; 직원 테이블이 소스테이블 , 부서테이블이 타겟 테이블</h1>
<p>select e.emp_id, e.emp_name, e.emp_id,
        d.dept_name, d.loc
from emp e left join dept d on e.dept_id = d.dept_id
                            and d.dept_id = 80; -- and 추가적인 조건 =&gt; where 조건과는 다르다. join조건은 어떤 값들을 붙일 것인가에 대한 조건
-- where d.dept_id = 80;</p>
<p>-- TODO: 직원_id(emp.emp_id)가 100, 110, 120, 130, 140인 
--  직원의 ID(emp.emp_id),이름(emp.emp_name), 업무명(job.job_title) 을 조회. 업무명이 없을 경우 &#39;미배정&#39; 으로 조회</p>
<p>-- inner join
select e.emp_id, e.emp_name, j.job_title
from emp e join job j on e.job_id = j.job_id
where e.emp_id in (100, 110, 120, 130, 140);</p>
<p>-- outer join
select e.emp_id, e.emp_name, j.job_title
from emp e left join job j on e.job_id = j.job_id
where e.emp_id in (100, 110, 120, 130, 140);
-- inner join vs outer join =&gt; outer join을 사용한다.</p>
<p>select * from emp where emp_id in (130,140);
-- e.job_id는 null값을 가지고 있기에 join이 되지 않음 =&gt; null값을 채워줘야함</p>
<p>-- TODO: 부서 ID(dept.dept_id), 부서이름(dept.dept_name)과 그 부서에 속한 직원들의 수를 조회. 직원이 없는 부서는 0이 나오도록 조회하고 직원수가 많은 부서 순서로 조회.
-- count(<em>) : 행수
select d.dept_id, d.dept_name, count(e.emp_id) as &quot;직원수&quot;
from dept d left join emp e on d.dept_id = e.dept_id
group by d.dept_id, d.dept_name;
-- 부서 테이블의 모든 내용이 다 들어가야하므로, left join을 해줘야함, emp table에서는 없지만 dept테이블에는 있는 직원이 &#39;직원수 = 1&#39; 로 컬럼에 들어가게됨
-- count(e.emp_id)를 해줘야 사람수 0, count(</em>) =&gt; 행수를 포함해서 출력</p>
<p>-- TODO: EMP 테이블에서 부서_ID(emp.dept_id)가 90 인 모든 직원들의 id(emp.emp_id), 이름(emp.emp_name), 상사이름(emp.emp_name), 입사일(emp.hire_date)을 조회. 
-- 입사일은 yyyy/mm/dd 형식으로 출력
select e.emp_id,
       e.emp_name,
       m.emp_name as &quot;상사이름&quot;,
       date_format(e.hire_date, &#39;%Y년 %m월 %d일&#39;) as &#39;hire_date&#39;
from emp e left join emp m on e.mgr_id = m.emp_id
where e.dept_id = 90;</p>
<p>-- TODO 2003년~2005년 사이에 입사한 모든 직원의 id(emp.emp_id), 이름(emp.emp_name), 업무명(job.job_title), 급여(emp.salary), 입사일(emp.hire_date),
-- 상사이름(emp.emp_name), 상사의입사일(emp.hire_date), 소속부서이름(dept.dept_name), 부서위치(dept.loc)를 조회.</p>
<p>select e.emp_id,
        e.emp_name,
        j.job_title,
        e.salary,
        e.hire_date,
        m.emp_name as &quot;상사이름&quot;,
        m.hire_date as &quot;상사입사일&quot;,
        d.dept_name,
        d.loc
from emp e left join job j on e.job_id = j.job_id
           left join dept d on e.dept_id = d.dept_id 
           left join emp m on e.mgr_id = m.emp_id 
where year(e.hire_date) between 2003 and 2005;
-- 한번 outer join -&gt; outer join하지 않으면 값이 사라지므로, 계속 해야함</p>
<pre><code>
## Q&amp;A
```sql
from emp e join dept d on e.dept_id = d.dept_id
1)조인 조건에는 id 만 들어갈 수 있는 것? id가 늘 primary key?
-부모테이블과 자식테이블은 주로 외래키를 기준으로 결합. 그렇지 않으면 데이터 무결성 문제 발생 가능
2)e와 d중에 어떤게 참조하는거고, 어떤게 참조당하는것?
    - inner table에서는 상관없음. 순서가 바뀌어도 완성된 테이블의 형태는 같음
3) join은 부모테이블과 자식테이블 개념과는 다른것?
    -&gt; 테이블 간의 부모,자식관계가 나이더라도 가능함. emp 테이블과 salary grade테이블은 서로 관계가 없지만, 업무적으로 관계를 설정할 수 있음.
4)소스테이블의 위치
select  e.emp_id, e.emp_name, e.dept_id,
        d.dept_name, d.loc
from    emp e left join dept d on e.dept_id = d.dept_id 
=&gt; 왼쪽에 위치한 emp e 가 소스테이블                  
from    emp e right join dept d on e.dept_id = d.dept_id
=&gt; 오른쪽에 위치한 dept d가 소스테이블
5)내부조인은 관계가 있어야만 합치수있음?  salary grade같은 경우에는 emp 테이블과 관계가 없으므로 연결 불가능? =&gt; 키만 있으면 가능함
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 03. 집계함수 02. group by, having(23.09.04)]]></title>
            <link>https://velog.io/@shasha_malone/SQL-03.-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-02.-group-by-having23.09.04</link>
            <guid>https://velog.io/@shasha_malone/SQL-03.-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-02.-group-by-having23.09.04</guid>
            <pubDate>Tue, 05 Sep 2023 12:43:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>group by 절</p>
</blockquote>
<ul>
<li>특정 컬럼(들)의 값별로 행들을 나누어 집계할 때 기준컬럼을 지정하는 구문.<ul>
<li>예) 업무별 급여평균. 부서-업무별 급여 합계. 성별 나이평균</li>
</ul>
</li>
<li>구문: group by 컬럼명 [, 컬럼명]<ul>
<li>컬럼: 범주형 컬럼을 사용 - 부서별 급여 평균, 성별 급여 합계</li>
<li>select의 where 절 다음에 기술한다.</li>
<li>select 절에는 group by 에서 선언한 컬럼들만 집계함수와 같이 올 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">
-- 업무(job)별 급여의 총합계, 평균, 최소값, 최대값, 표준편차, 분산, 직원수를 조회
select job,
       sum(salary),
       round(avg(salary), 2),
       min(salary),
       max(salary),
       round(stddev(salary), 2),
       round(variance(salary), 2),
       count(*)
from emp
group by job;
-- 입사연도 별 직원들의 급여 평균.
select year(hire_date) 입사년도, avg(salary) 급여평균 from emp group by year(hire_date) order by 1;
-- 부서명(dept_name) 이 &#39;Sales&#39;이거나 &#39;Purchasing&#39; 인 직원들의 업무별 (job) 직원수를 조회
select job,
       count(*) 직원수 -- 3. 집계
from emp -- 0. 테이블 선택.
where dept_name in (&#39;Sales&#39;, &#39;Purchasing&#39;) -- 1. 조건이 True인 행을 조회
group by job; -- 2. job 별로 그룹을 나눈다.
-- 부서(dept_name), 업무(job) 별 최대, 평균급여(salary)를 조회.
select dept_name,
       job,
       max(salary),
       avg(salary)
from emp    
group by dept_name, job -- dept_name과 job이 같은 직원들이 같은 그룹으로 묶인다.
order by 1;
-- 급여(salary) 범위별 직원수를 출력. 급여 범위는 10000 미만,  10000이상 두 범주.
select case when salary &lt; 10000 then &quot;10000 미만&quot;
            else &quot;10000 이상&quot; end as &quot;급여 범위&quot;,
        count(*) as &quot;직원수&quot;
from emp
group by case when salary &lt; 10000 then &quot;10000 미만&quot;
            else &quot;10000 이상&quot; end ;

select case when salary &lt; 10000 then 1
            else 2 end
from emp;        
-- TODO: 부서별(dept_name) 직원수를 조회
select dept_name 부서명,
       count(*) 직원수
from emp
group by dept_name;
-- TODO: 업무별(job) 직원수를 조회. 직원수가 많은 것부터 정렬.
select job 업무,
       count(*) 직원수
from emp
group by job
order by 2 desc;       
-- TODO: 부서명(dept_name), 업무(job)별 직원수, 최고급여(salary)를 조회. 부서이름으로 오름차순 정렬.
select dept_name 부서명,
       job 업무,
       max(salary) 최고급여
from emp
group by dept_name, job
order by dept_name;       
-- TODO: EMP 테이블에서 입사연도별(hire_date) 총 급여(salary)의 합계을 조회. 
-- (급여 합계는 정수부에 자리구분자 , 를 넣고 $를 붙이시오. ex: $2,000,000)
select year(hire_date) 입사연도,
       concat(&quot;$&quot;, format(sum(salary), 2)) as &quot;총 급여의 합계&quot;
from emp
group by year(hire_date)
order by 1;       
-- TODO: 같은해 입사해서 같은 업무를 한 직원들의 평균 급여(salary)을 조회
select year(hire_date) 입사연도,
       job 업무,
       format(avg(salary), 2) as &quot;평균 급여&quot;
from emp
group by year(hire_date), job
order by 1;     
-- TODO: 부서별(dept_name) 직원수 조회하는데 부서명(dept_name)이 null인 것은 제외하고 조회.
select dept_name 부서명,
       count(*) 직원수
from emp
where dept_name is not null
group by dept_name;       
-- TODO 급여 범위별 직원수를 출력. 급여 범위는 5000 미만, 5000이상 10000 미만, 10000이상 20000미만, 20000이상. 
-- case 문 이용
select case when salary &lt; 5000 then &quot;5000미만&quot;
              when salary &lt; 10000 then &quot;5000이상 10000미만&quot;
              when salary &lt; 20000 then &quot;10000이상 20000미만&quot;
              else &quot;20000이상&quot; end as &quot;급여범위&quot;,
        count(*) 직원수
from emp
group by case when salary &lt; 5000 then &quot;5000미만&quot;
              when salary &lt; 10000 then &quot;5000이상 10000미만&quot;
              when salary &lt; 20000 then &quot;10000이상 20000미만&quot;
              else &quot;20000이상&quot; end;

</code></pre>
<blockquote>
<p>having 절</p>
</blockquote>
<ul>
<li>group by 로 나뉜 그룹을 filtering 하기 위한 조건을 정의하는 구문.</li>
<li>group by 다음 order by 전에 온다.</li>
<li>구문
  having 제약조건  <pre><code>  - 연산자는 where절의 연산자를 사용한다. 
  - 피연산자는 집계함수(의 결과)</code></pre></li>
</ul>
<p>** where절은 행을 filtering한다.
   having절은 group by 로 묶인 그룹들을 filtering한다.</p>
<pre><code class="language-sql">-- 직원수가 10 이상인 부서의 부서명(dept_name)과 직원수를 조회
select dept_name 부서명,
       count(*) 직원수
from emp
group by dept_name
having count(*) &gt;= 10;       

-- 직원수가 10명 이상인 부서의 부서명과 그 부서 직원들의 평균 급여를 조회.
select dept_name 부서명,
       round(avg(salary), 2) as &quot;평균 급여&quot;
from emp
group by dept_name
having count(*) &gt;= 10;   
-- TODO: 20명 이상이 입사한 년도와 (그 해에) 입사한 직원수를 조회.
select year(hire_date) 입사연도,
       count(*) 직원수
from emp
group by year(hire_date)
having count(*) &gt;= 20
order by 1;       
-- TODO: 10명 이상의 직원이 담당하는 업무(job)명과 담당 직원수를 조회
select job 업무,
       count(*) 직원수
from emp
group by job
having count(*) &gt;= 10;       
-- TODO: 평균 급여가(salary) $5000 이상인 부서의 이름(dept_name)과 평균 급여(salary), 직원수를 조회
select dept_name 부서명,
       round(avg(salary), 2) as &quot;평균 급여&quot;,
       count(*) 직원수
from emp
group by dept_name
having avg(salary) &gt;= 5000
order by 2;         
-- TODO: 평균급여가 $5,000 이상이고 총급여가 $50,000 이상인 부서의 부서명(dept_name), 평균급여와 총급여를 조회
select dept_name 부서명,
       round(avg(salary), 2) 평균급여,
       format(sum(salary), 2) 총급여
from emp
group by dept_name
having avg(salary) &gt;= 5000 and sum(salary) &gt;= 50000
order by 2,3;       
-- TODO 직원이 2명 이상인 부서들의 이름과 급여의 표준편차를 조회
select dept_name 부서명,
       count(*) 직원수,
       round(stddev(salary), 2) 표준편차
from emp
group by dept_name
having count(*) &gt;= 2
order by 2;       
-- TODO  커미션이 있는 직원들의 입사년도별 평균 급여를 조회. 단 평균 급여가 $9,000 이상인 년도분만 조회.
select year(hire_date) 입사년도,
       avg(salary) 평균급여
from emp
where comm_pct is not null
group by year(hire_date)
having avg(salary) &gt;= 9000;</code></pre>
<blockquote>
<h1 id="with-rollup--group-by-뒤에-붙인다">with rollup : group by 뒤에 붙인다.</h1>
</blockquote>
<ul>
<li>group by로 묶어 집계할 때 총계나 중간 집계(group by 컬럼이 여러개일경우) 를 계산한다.</li>
<li>구문 : group by 컬럼명[, .. ] with rollup</li>
<li>ex) group by job with rollup</li>
</ul>
<blockquote>
<h1 id="grouping컬럼명--컬럼명--select-절에서-사용">grouping(컬럼명 [, 컬럼명]) : select 절에서 사용.</h1>
</blockquote>
<ul>
<li>group by  컬럼명 with rollup 으로 집계했을 때 grouping(컬럼명)의 컬럼이 집계시 값들을 그룹으로 나누는데 사용되었으면 0 사용되지 않았으면 1을 반환한다. 
1이 반환 된 경우는 그 행의 결과는 총계이거나 중간소계임을 말한다.</li>
<li>grouping(컬럼1, 컬럼2, 컬럼3) 과 같이 여러개 컬럼을 지정한 경우
  집계에 모든 세개의 컬럼이 다 사용되었으면 0
  앞의 두개만 사용되었으면 1
  앞의 한개만 사용되었으면 3
  세개 다 사용되지 않았으면 7<br>  컬럼1      컬럼2       컬럼3
   2<strong>2  +  2</strong>1    +  2**0      각각 참여하면 0, 참여 안하면 1을 곱해서 더한다.</li>
</ul>
<p>```sql
-- EMP 테이블에서 업무(job)별 급여(salary)의 평균과 평균의 총계도 같이나오도록 조회.
select ifnull(job, &quot;총 평균&quot;) as &quot;job&quot;, -- rollup으로 인해 평균의 총계가 나타난 값의 job이 null값이기에 총 평균으로 바꾼다.
       round(avg(salary), 2) as &quot;평균급여&quot;
from emp
group by job with rollup;<br>-- EMP 테이블에서 부서(dept)별 급여(salary)의 평균과 평균의 총계도 같이나오도록 조회.
select -- dept_name 부서명,
       if(grouping(dept_name) = 0, dept_name, &#39;총평균&#39;) 부서명, -- 결과값에서 1이 나온경우 그 행의 결과가 총계이거나 중간소계이다.
       round(avg(salary), 2) 평균급여
from emp
group by dept_name with rollup;<br>-- EMP 테이블에서 부서(dept_name), 업무(job) 별 salary의 합계와 직원수를 소계와 총계가 나오도록 조회
select dept_name 부서,
       job 업무,
       grouping(dept_name, job),
       sum(salary) 급여합계,
       count(<em>) 직원수
from emp
group by dept_name, job with rollup;<br>select case grouping(dept_name, job) when 0 then concat(ifnull(dept_name, &#39;미배치&#39;), &#39;-&#39;, job)
                                     when 1 then ifnull(dept_name, &#39;미배치&#39;)
                                     when 3 then &#39;총계&#39; end as &#39;구분&#39;,
       sum(salary) 급여합계, 
       count(</em>) 직원수
from emp
group by dept_name, job with rollup;<br>-- # 총계/소계 행의 경우 :  총계는 &#39;총계&#39;, 중간집계는 &#39;소계&#39; 로 출력
-- TODO: 부서별(dept_name) 별 최대 salary와 최소 salary를 조회
select ifnull(dept_name, &quot;총계&quot;) 부서명,
       max(salary) as &quot;최대 급여&quot;,
       min(salary) as &quot;최소 급여&quot;
from emp
where dept_name is not null
group by dept_name with rollup;<br>-- 강사님 버전
select  if(grouping(dept_name)=0, dept_name, &#39;총계&#39;)  as dept_name,  -- 0: group 별 집계, 1: 전체 집계
        max(salary),
        min(salary), 
        max(salary) - min(salary) as &quot;최대 최소 급여 차이&quot;
from    emp
group by dept_name with rollup; 
-- TODO: 상사_id(mgr_id) 별 직원의 수와 총계를 조회하시오.
select ifnull(mgr_id,&quot;총계&quot;) as &quot;상사_id&quot;,
       count(<em>) 직원수
from emp
where mgr_id is not null
group by mgr_id with rollup;<br>-- 강사님 버전
select if(grouping(mgr_id) = 1, &quot;총계&quot;, mgr_id) as &quot;mgr_id&quot;,
       count(</em>)
from emp
group by mgr_id with rollup;</p>
<p>-- TODO: 입사연도(hire_date의 year)별 직원들의 수와 연봉 합계 그리고 총계가 같이 출력되도록 조회.
SET sql_mode=(SELECT REPLACE(@@sql_mode,&#39;ONLY_FULL_GROUP_BY&#39;,&#39;&#39;)); -- rollup에 대한 결과값이 제대로 안나올 경우 실행
select if(grouping(year(hire_date)) = 1, &quot;총계&quot;, year(hire_date)) as &quot;입사년도&quot;,
       count(*) 직원수,
       format(sum(salary), 0) as &quot;급여 합계&quot;
from emp
group by year(hire_date) with rollup;<br>-- TODO: 부서(dept_name), 입사년도별 평균 급여(salary) 조회. 부서별 집계와 총집계가 같이 나오도록 조회
select dept_name,
       year(hire_date),
       avg(salary)
from emp
group by dept_name, year(hire_date) with rollup;
-- 강사님 버전
select case grouping(dept_name, year(hire_date)) when 0 then concat(dept_name, &quot;-&quot;, year(hire_date))
                                                 when 1 then dept_name
                                                 when 3 then &quot;총계&quot; end as &quot;구분&quot;,
       avg(salary)
from emp
group by dept_name, year(hire_date) with rollup;
-- grouping 따로 처리
select if(grouping(dept_name)=1, &#39;총계&#39;, dept_name) as &quot;dept_name&quot;,
       if(grouping(year(hire_date))=1, &#39;집계&#39;, year(hire_date)) as &quot;입사년도&quot;,
       avg(salary)
from emp
group by dept_name, year(hire_date) with rollup;   </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 03.집계함수 01. 집계함수 (230904)]]></title>
            <link>https://velog.io/@shasha_malone/SQL-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-01.-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@shasha_malone/SQL-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-01.-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 05 Sep 2023 12:11:10 GMT</pubDate>
            <description><![CDATA[<h3 id="집계aggregation-함수와-group-by-having">집계(Aggregation) 함수와 GROUP BY, HAVING</h3>
<blockquote>
<p>집계함수, 그룹함수, 다중행 함수</p>
</blockquote>
<ul>
<li>인수(argument)는 컬럼.<ul>
<li>sum(): 전체합계</li>
<li>avg(): 평균</li>
<li>min(): 최소값</li>
<li>max(): 최대값</li>
<li>stddev(): 표준편차</li>
<li>variance(): 분산</li>
<li>count(): 개수<pre><code>- 인수: 
    - 컬럼명: null을 제외한 값들의 개수.
    -  *: 총 행수 - null과 관계 없이 센다.</code></pre></li>
<li>count(distinct 컬럼명): 고유값의 개수.</li>
</ul>
</li>
<li><code>count(*)</code> 를 제외한 모든 집계함수들은 <code>null을 제외</code>하고 집계한다. <ul>
<li>(avg, stddev, variance는 주의)</li>
<li>avg(), variance(), stddev()은 전체 개수가 아니라 null을 제외한 값들의 평균, 분산, 표준편차값이 된다.=&gt;avg(ifnull(컬럼, 0))</li>
</ul>
</li>
<li>문자타입/일시타입: max(), min(), count()에만 사용가능<ul>
<li>문자열 컬럼의 max(): 사전식 배열에서 가장 마지막 문자열, min()은 첫번째 문자열. </li>
<li>일시타입 컬럼은 오래된 값일 수록 작은 값이다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>편차 : 값이 평균으로부터 얼마나 떨어져있는지.
평균 : 10, value : &#39;5&#39;
표준편차 : 편차들의 평균
분산 : 표준편차의 제곱</p>
</blockquote>
<pre><code class="language-sql">-- EMP 테이블에서 급여(salary)의 총합계, 평균, 최소값, 최대값, 표준편차, 분산, 총직원수를 조회 
select sum(salary),
       avg(salary),
       min(salary),
       max(salary),
       stddev(salary),
       variance(salary),
       count(*),
       count(emp_id)
from emp;

-- count(컬럼명) 그 컬럼에서 데이터개수(null이 아닌 값들)
select count(comm_pct) from emp;
select avg(comm_pct),  -- null을 뺀 평균, 커미션을 받는 사람들 기준 평균.
       avg(ifnull(comm_pct, 0)) -- 전체 직원 기준 평균.
from emp;
-- EMP 테이블에서 가장 최근 입사일(hire_date)과 가장 오래된 입사일을 조회
select max(hire_date), 
       min(hire_date)
from emp;       
-- EMP 테이블의 부서(dept_name) 의 개수를 조회
select count(dept_name)
from emp;
-- EMP 테이블에서 job 종류의 개수 조회
select count(distinct job)
from emp;
-- TODO:  커미션 비율(comm_pct)이 있는 직원의 수를 조회
select count(comm_pct)
from emp;
select comm_pct from emp;
-- TODO: 커미션 비율(comm_pct)이 없는 직원의 수를 조회
select count(*) - count(comm_pct) as &#39;커미션 비율이 없는 직원의 수&#39;
from emp;
select count(*) from emp where comm_pct is null;


</code></pre>
<pre><code class="language-sql">-- TODO: 가장 큰 커미션비율(comm_pct)과 과 가장 적은 커미션비율을 조회
select max(comm_pct),
       min(comm_pct)
from emp;    
-- TODO:  커미션 비율(comm_pct)의 평균을 조회. 소수점 이하 2자리까지 출력
select round(avg(comm_pct), 2)
from emp;
-- TODO: 직원 이름(emp_name) 중 사전식으로 정렬할때 가장 나중에 위치할 이름을 조회.
select max(emp_name)
from emp;
-- TODO: 급여(salary)에서 최고 급여액과 최저 급여액의 차액을 출력
select max(salary) - min(salary) 차액
from emp;
-- TODO: 가장 긴 이름(emp_name)이 몇글자 인지 조회.
select max(char_length((emp_name))) from emp;
select emp_name from emp;
-- TODO: EMP 테이블의 업무(job) 종류가 몇개 있는 조회. 고유값들의 개수
select count(distinct(job)) from emp;
select job from emp;
-- TODO: EMP 테이블의 부서(dept_name)가 몇종류가 있는지 조회. 고유값들의 개수
select count(distinct(dept_name)) -- null 빼고 계산 -&gt; null은 범주값(고유값)에 포함 안됨
       , count(distinct ifnull(dept_name, &quot;미배치&quot;)) -- null을 포함해서 계산, null이 범주값에 포함된 경우
from emp; 
select distinct ifnull(dept_name, &quot;미배치&quot;) from emp;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 02. 함수 - 단일 행 함수]]></title>
            <link>https://velog.io/@shasha_malone/SQL-02.-%ED%95%A8</link>
            <guid>https://velog.io/@shasha_malone/SQL-02.-%ED%95%A8</guid>
            <pubDate>Fri, 01 Sep 2023 07:43:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>format, round, truncate 차이</strong>
format(값,자릿수): 정수부에 단위 구분자, 표시하고 문자열을 출력
round(값, 자릿수): 자릿수이하에서 반올림 
(양수 - 실수부, 음수 - 정수부, 기본값: 0-0이하에서 반올림이므로 정수로 반올림)
truncate(값, 자릿수): 자릿수이하에서 절삭-버림
(자릿수: 양수 - 실수부, 음수 - 정수부, 기본값: 0)</p>
</blockquote>
<h2 id="함수">함수</h2>
<p><strong>단일 행 함수</strong> </p>
<ul>
<li>행 단위로 값 처리하는 함수</li>
<li>단일 행 select, where절</li>
<li>함수 안에 함수를 넣을 수 있음 CHAR_LENGTH(CONCAT(&#39;A&#39;,&#39;B&#39;))
예)</li>
</ul>
<p><strong>다중 행 함수</strong>
여러 행의 값들을 묶어서 한번에 처리하는 함수(집계함수,그룹함수)
다중 행 - select, having 절에서 사용(where 절 x)
예)sum(): 전체합계 avg(): 평균 min(): 최소값 max(): 최대값</p>
<blockquote>
<p><code>char_length(v)</code>
 <code>oncat(v1, v2[, ..])</code>
 <code>format(숫자, 소수부 자릿수)</code>
 <code>upper(v), lower(v)</code></p>
</blockquote>
<blockquote>
<p><code>insert(기준문자열, 위치, 길이, 삽입문자열)</code>
 <code>replace(기준문자열, 원래문자열, 바꿀문자열)</code>
 <code>left(기준문자열, 길이), right(기준문자열, 길이)</code>
<code>substring(기준문자열, 시작위치, 길이)</code>
 <code>substring_index(기준문자열, 구분자, 개수)</code>
 <code>ltrim(문자열), rtrim(문자열), trim(문자열)</code>
 <code>trim(방향  제거할문자열  from 기준문자열)</code>
        - 방향: both (앞,뒤), leading (앞), trailing (뒤)
<code>lpad(기준문자열, 길이, 채울문자열), rpad(기준문자열, 길이, 채울문자열)</code>: 기준문자열을 길이만큼 늘린 뒤 남는 길이만큼 채울문자열로 왼쪽(lpad), 오른쪽(rpad)에 채운다.
                                                          기준문자열 글자수가 길이보다 많을 경우 나머지는 자른다.</p>
</blockquote>
<pre><code class="language-sql">use hr;

select format(123456789.345135, 0);
select concat(&#39;홍길동&#39;, &#39;님&#39;);
select concat(&#39;나이: &#39;, 20 ,&#39;세&#39;);
select insert(&#39;123456789&#39; , 2 , 3 , &#39;안녕&#39;); -- 두번째 글자부터 3글자를 &#39;안녕&#39;으로 변경
select replace(&#39;123456789&#39;,&#39;234&#39;,&#39;안녕&#39;); -- &#39;234&#39; 문자열을 &#39;안녕&#39;으로 변경
select substring(&#39;123456789&#39;, 4); -- 4번째 글자부터 나머지를 반환
select substring(&#39;123456789&#39;,4 ,2); -- 4번째 글자부터 두글자 나머지를 반환
select substring_index(&#39;aaa-bbb-ccc-ddd-eee&#39;,&#39;-&#39;,3);
-- 문자열을 &#39;-&#39;구분자를 기준으로 나눈 뒤 앞에서 3개를 반환
select substring_index(&#39;aaa-bbb-ccc-ddd-eee&#39;,&#39;-&#39;, -3);
-- 개수: 음수 =&gt; 뒤에서부터
select left(&#39;1234567890&#39;,5); -- 왼쪽에서 5글자 반환
select right(&#39;1234567890&#39;,5); -- 오른쪽에서 5글자 반환
select trim(&#39;   aaa    &#39;), char_length(trim(&#39;    aaa    &#39;)); -- 좌우 공백
select rtrim(&#39;     aaa     &#39;) as &quot;b&quot;;
select ltrim(&#39;     aaa     &#39;) as &quot;b&quot;;
select trim(&#39;-------------aaa-------------&#39;) as &quot;b&quot;;
select trim(both &#39;-&#39; from &#39;-------------aaa--------------&#39;) as &quot;b&quot;;
select trim(leading &#39;-+&#39; from &#39;-+-+-+-+aaaa-+-+-+-+&#39;) as &quot;b&quot;;
select trim(trailing &#39;-+&#39; from &#39;-+-+-+-+aaaa-+-+-+-+&#39;) as &quot;b&quot;;
-- 어디있는 것: both(앞뒤), leading(앞), trailing(뒤)


select lpad(&#39;test&#39;, 10 , &#39; &#39;) as &quot;b&quot;;
-- 10글자로 맞춘다. 모자랄 경우 왼쪽(lpad)에 &#39;  &#39;을 붙인다.
select rpad(&#39;test&#39;, 10 , &#39; &#39;), char_length(rpad(&#39;test&#39;,10,&#39; &#39;)) as &quot;b&quot; ;
-- 10글자로 맞춘다. 모자랄 경우 오른쪽(rpad)에 &#39;  &#39;을 붙인다.
select lpad(3,2,&#39;0&#39;);
select rpad(&#39;aaaaaaaaaaaaaaa&#39;, 3, &#39;&#39;);
-- EMP 테이블에서 직원의 이름(emp_name)을 모두 대문자, 소문자, 이름 글자수를 조회
select emp_name,
       upper(emp_name),
       lower(emp_name),
       char_length(emp_name),
       lpad(emp_name, 15,&#39; &#39;)
from emp;

--  TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary),부서(dept_name)를 조회. 
--  단 직원이름(emp_name)은 모두 대문자, 부서(dept_name)는 모두 소문자로 출력.

select emp_id, 
       upper(emp_name) as &quot;emp_name&quot;, 
       salary, 
       lower(dept_name) as &quot;emp_name&quot;
from emp;


-- TODO: 직원 이름(emp_name) 의 자릿수를 15자리로 맞추고 15자가 안되는 이름의 경우 공백을 앞에 붙여 조회. 
select lpad(emp_name,15,&#39; &#39;) as &quot;emp_name&quot;
from emp;

-- TODO: EMP 테이블에서 이름(emp_name)이 10글자 이상인 직원들의 이름(emp_name)과 이름의 글자수 조회 (-- 질문)
select emp_name ,char_length(emp_name) as &quot;글자수&quot;
from emp
where char_length(emp_name) &gt;= 10 ;
</code></pre>
<hr>
<blockquote>
<p><strong>함수 - 숫자관련 함수</strong>
 <code>abs(값)</code>: 절대값 반환
 <code>round(값, 자릿수)</code>: 자릿수이하에서 반올림 (양수 - 실수부, 음수 - 정수부, 기본값: 0-0이하에서 반올림이므로 정수로 반올림)
 <code>truncate(값, 자릿수)</code>: 자릿수이하에서 절삭-버림(자릿수: 양수 - 실수부, 음수 - 정수부, 기본값: 0)
 <code>ceil(값)</code>: 값보다 큰 정수중 가장 작은 정수. 소숫점 이하 올린다. 
 <code>floor(값)</code>: 값보다 작은 정수중 가장 작은 정수. 소숫점 이하를 버린다. 내림
 <code>sign(값)</code>: 숫자 n의 부호를 정수로 반환(1-양수, 0, -1-음수)
 mod(n1, n2): n1 % n2</p>
</blockquote>
<pre><code class="language-sql">select abs(10) , abs(-10);
select round(1.23456); -- 소수점 이하에서 반올림
select round(1.23438, 2); -- 소수점 2자리 이하에서 반올림
select round(188.123, -1); -- 자리 : 음수 --&gt; 정수위치.
select ceil(50.9999); -- 올림 --&gt; 정수반환
select floor(50.9999); -- 내림 --&gt; 정수반환
select truncate(1234.567, 2); -- 절삭(내림)
select truncate(1234.567, 1); 
select truncate(1234.567, 0); 
select truncate(1234.567, -1);
select truncate(1234.567, -2);


select sign(-10), sign(0), sign(10) ; 

-- TODO: EMP 테이블에서 각 직원에 대해 직원ID(emp_id), 이름(emp_name), 급여(salary) 그리고 15% 인상된 급여(salary)를 조회하는 질의를 작성하시오.
-- (단, 15% 인상된 급여는 올림해서 정수로 표시하고, 별칭을 &quot;SAL_RAISE&quot;로 지정.)

select emp_id, 
        emp_name, 
        salary, 
        ceil(salary*1.15) as &quot;SAL_RAISE&quot;
from emp;

-- TODO: 위의 SQL문에서 인상 급여(sal_raise)와 급여(salary) 간의 차액을 추가로 조회 
-- (직원ID(emp_id), 이름(emp_name), 15% 인상급여, 인상된 급여와 기존 급여(salary)와 차액)

select emp_id, 
       emp_name, 
       ceil(salary*1.15) as &quot;SAL_RAISE&quot;, -- 올림
       ceil(salary*1.15) - salary as &quot;인상분&quot;
from emp;       

--  TODO: EMP 테이블에서 커미션이 있는 직원들의 직원_ID(emp_id), 이름(emp_name), 커미션비율(comm_pct), 커미션비율(comm_pct)을 8% 인상한 결과를 조회.
-- (단 커미션을 8% 인상한 결과는 소숫점 이하 2자리에서 반올림하고 별칭은 comm_raise로 지정)
select emp_id,
       emp_name,
       comm_pct,
       round(comm_pct * 1.08, 2) as &quot;comm_raise&quot;
from emp
where comm_pct is not null;</code></pre>
<blockquote>
<p><strong>함수 - 날짜관련 계산 및 함수</strong>
date/time/datetime: +, - 사용 =&gt; 마지막 항목(date:일, time: 초, datetime: 초)의 값을 +/- =&gt; 계산 결과가 정수형으로 반환된다.
ex) 2023-09-01 ==&gt; 20230901 + 5
<code>now()</code>: 현재 datetime
    <code>curdate()</code>: 현재 date
    <code>curtime()</code>: 현재 time
   <code>year(날짜), month(날짜), day(날짜)</code>: 날짜 또는 일시의 년, 월, 일 을 반환한다.
    <code>hour(시간), minute(시간), second(시간), microsecond(시간)</code>: 시간 또는 일시의 시, 분, 초, 밀리초를 반환한다.
    <code>date(), time()</code>: datetime 에서 날짜(date), 시간(time)만 추출한다.</p>
</blockquote>
<blockquote>
<p><strong>날짜 연산</strong>
<code>adddate/subdate(DATETIME/DATE/TIME,  INTERVAL 값  단위)</code>
    날짜에서 특정 일시만큼 더하고(add) 빼는(sub) 함수.
    단위: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER(분기-3개월), YEAR
<code>datediff(날짜1, 날짜2)</code>: 날짜1 – 날짜2한 일수를 반환
<code>timediff(시간1, 시간2)</code>: 시간1-시간2 한 시간을 계산해서 반환 (뺀 결과를 시:분:초 로 반환)
<code>dayofweek(날짜)</code>: 날짜의 요일을 정수로 반환 (1: 일요일 ~ 7: 토요일)
<code>date_format(일시, 형식문자열)</code>: 일시를 원하는 형식의 문자열로 반환</p>
</blockquote>
<pre><code class="language-sql">
-- 실행시점의 일/시를 조회 함수
select now(); -- 일시 -&gt; datetime
select curdate(); -- 날짜 -&gt; date
select curtime(); -- 시간 -&gt; time

-- 날짜 타입에서 년 월 일 조회
select year(now()), month(now()), day(curdate());

--시간 타입에서 시 분 초 조회
select hour(now()), minute(curtime()), 
        second(curtime()), microsecond(now());
select date(now()); -- datetime -&gt; date
select time(now()); -- datetime -&gt; time

-- 날짜 연산
select adddate(now(), interval 2 day);-- 기준날짜 , interval + 간격 + 기준 넣어주면 그 이후 날짜 반환
select adddate(now(), interval 2 month);
select adddate(curdate(), interval 2 year);
select adddate(curdate(), interval 2 quarter); -- 2분기 후 =&gt; 6개월 후 

select subdate(curdate(), interval 2 year); -- 2년 전
select adddate(curdate(), interval -2 year);

select adddate(curtime(), interval 10 hour);
select adddate(curtime(), interval 10 minute);

select datediff(curdate(), &#39;2023-08-18&#39;);
select datediff(curdate(), &#39;2023-08-30&#39;); -- curdate - 2023/8/30 일수 차이
select datediff(&#39;2023-08-30&#39;, curdate()); -- 앞의 것이 과거 ==&gt; 음수
select datediff(&#39;2023-12-25&#39;,&#39;2023-09-01&#39;);
#뒤-앞 빼면, 앞에있는 날짜가 미래일 경우 과거로부터 얼마나 지났는지 알 수 있음
select timediff(curtime(), &#39;11:20:10&#39;);
                        -- curtime - &#39;11:20:10&#39;차이가 나는 시간:분:초 를 반환
select dayofweek(now()); -- 요일( 1:일요일 ~7:토요일)
select now();

select date_format(now(), &#39;%Y년 %m월 %d일 %H시 %i분 %S초 $p $W&#39;); -- %p: &quot;AM&quot; 또는 &quot;PM&quot;을 표 %W: 요일의 전체 이름
select date_format(curdate(), &#39;%m/%d/%Y %w&#39;);


-- TODO: EMP 테이블에서 부서이름(dept_name)이 &#39;IT&#39;인 직원들의 &#39;입사일(hire_date)로 부터 10일전&#39;, 입사일, &#39;입사일로 부터 10일 후&#39; 의 날짜를 조회. 
select adddate(hire_date, interval -10 day) as &quot;10일전&quot;, 
        hire_date as &quot;입사일&quot;
from emp
where dept_name =&#39;IT&#39;;

-- TODO: 부서가 &#39;Purchasing&#39; 인 직원의 이름(emp_name), 입사 6개월전과 입사일(hire_date), 6개월후 날짜를 조회.
select emp_name, 
        subdate(hire_date, interval 6 month) as &quot;6개월 전&quot;,
        hire_date,
        adddate(hire_date , interval 6 month) as &quot;6개월 후&quot;
from emp
where dept_name = &#39;Purchasing&#39;;


-- TODO ID(emp_id)가 200인 직원의 이름(emp_name), 입사일(hire_date)를 조회. 입사일은 yyyy년 mm월 dd일 형식으로 출력.
select emp_name,
        date_format(hire_date, &#39;%Y년 %m월 %d일&#39;) as &#39;입사일&#39;
from emp
where emp_id = 200;

-- TODO: 각 직원의 이름(emp_name), 근무 개월수 (입사일에서 현재까지의 달 수)를 계산하여 조회. 근무개월수 내림차순으로 정렬.
select emp_name,
        datediff(curdate(), hire_date ) as &#39;근무일수&#39;,
        timestampdiff(month, hire_date, curdate()) as &quot;근무개월수&quot;,
        timestampdiff(year, hire_date, curdate()) as &quot;근무년수&quot;
from emp
order by 3 ; -- 질문

-- timestampdiff : 일시의 모든 항목에 대한 차이를 계산 ex. timestamp(year) timestamp(month) timestamp(day)

-- TODO: ID(emp_id)가 100인 직원이 입사한 요일을 조회

select  case dayofweek(hire_date) when 1 then &quot;일요일&quot;
                            when 2 then &quot;월요일&quot;
                            when 3 then &quot;화요일&quot;
                            when 4 then &quot;수요일&quot;
                            when 5 then &quot;목요일&quot;
                            when 6 then &quot;금요일&quot;
                            when 7 then &quot;토요일&quot;
        end as &quot;입사요일2&quot;
from emp
where emp_id = 100;


select dayofweek(hire_date) as &quot;입사요일&quot;,
        substring(&#39;일월화수목금토&#39; , dayofweek(hire_date),1),
        concat(substring(&#39;일월화수목금토&#39;, dayofweek(hire_date),1),&#39;요일&#39;)
from emp;
</code></pre>
<blockquote>
<p><strong>함수 - 조건 처리함수</strong>
<code>ifnull (기준컬럼(값), 기본값)</code>: 기준컬럼(값)이 NULL값이면 기본값을 출력하고 NULL이 아니면 기준컬럼 값을 출력
<code>if (조건수식, 참, 거짓)</code>: 조건수식이 True이면 참을 False이면 거짓을 출력한다.
<code>nullif(컬럼1, 컬럼2)</code>: 컬럼1과 컬럼2가 같으면 NULL을 반환, 다르면 컬럼1을 반환
<code>coalesce(ex1, ex2, ex3, .....)</code>: ex1 ~ exn 중 null이 아닌 첫번째 값 반환.</p>
</blockquote>
<pre><code class="language-sql">select ifnull(null,&quot;없음&quot;);
select ifnull(comm_pct, &#39;no commision&#39;) from emp;

-- 조건연산자 기능 함수.
select if(salary &gt; 10000, &#39;평균이상&#39;,&#39;평균미만&#39;) from emp; -- true 이면 앞의값, False 면 뒤의 값 반환
select nullif(10,10); -- 두 값이 같으면 null
select nullif(100,1); -- 두 값이 다르면 앞의 값을 반환.
-- nullif(2022년판매개수, 2021년판매개수)

-- select salary, if(sal) -- 값이 나열되었을 때 null이 아닌 첫번째 값 --질문


-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 업무(job), 부서(dept_name)을 조회. 부서가 없는 경우 &#39;부서미배치&#39;를 출력.
select emp_id, 
        emp_name ,
        job, 
        ifnull(dept_name, &#39;부서미배치&#39;) as &#39;dept_name&#39;
from emp;

-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary), 커미션 (salary * comm_pct)을 조회. 커미션이 없는 직원은 0이 조회되록 한다.
select emp_id,
        emp_name,
        format(salary,2) as &quot;salary&quot;,
        comm_pct,
        format(salary * ifnull(comm_pct, 0),2) as &quot;commission&quot;,
        format(ifnull(salary * comm_pct, 0),2) as &quot;commission2&quot;
from emp;
</code></pre>
<blockquote>
<p><strong>CASE 문</strong>
case문 동등비교</p>
</blockquote>
<pre><code class="language-sql">case 컬럼 when 비교값 then 출력값
              [when 비교값 then 출력값]
              [else 출력값]
              end</code></pre>
<blockquote>
<p>case문 조건문</p>
</blockquote>
<pre><code class="language-sql">case when 조건 then 출력값
       [when 조건 then 출력값]
       [else 출력값]
       end

```python
if dept_name==null:
    return &#39;부서없음&#39;
elif dept_name==&#39;IT&#39;:
    return &#39;전산실&#39;
elif dept_name==&#39;Finance&#39;:
    return &#39;회계부&#39;
else:
    return dept_name    </code></pre>
<pre><code class="language-sql">select case dept_name when &#39;IT&#39; then &#39;전산실&#39;
                      when &#39;Finanace&#39; then &#39;회계부&#39;
                      when &#39;Sales&#39; then &#39;영업부&#39;
                      -- else &quot;모름&quot; -- null 대신 들어갈 값
                      else ifnull(dept_name,&#39;부서없음&#39;) -- 원래값을 리턴
                      end as &quot;부서명&quot; -- 컬럼명을 설정하지않으면 select문 뒤의 문장이 컬럼에 들어감
from emp
order by 1;


-- EMP테이블에서 급여와 급여의 등급을 조회하는데 급여 등급은 10000이상이면 &#39;1등급&#39;, 10000미만이면 &#39;2등급&#39; 으로 나오도록 조회
select salary, 
        case when salary &gt;= 10000 then &#39;1등급&#39;
             when salary &lt; 10000 then &#39;2등급&#39;
             end &quot;salary 등급&quot;,
        case when salary &gt;= 10000 then &#39;1등급&#39;
        else &#39;2등급&#39;
        end &quot;salary 등급2&quot;
from   emp;


-- TODO: EMP 테이블에서 업무(job)이 &#39;AD_PRES&#39;거나 &#39;FI_ACCOUNT&#39;거나 &#39;PU_CLERK&#39;인 직원들의 ID(emp_id), 이름(emp_name), 업무(job)을 조회.  
-- 업무(job)가 &#39;AD_PRES&#39;는 &#39;대표&#39;, &#39;FI_ACCOUNT&#39;는 &#39;회계&#39;, &#39;PU_CLERK&#39;의 경우 &#39;구매&#39;가 출력되도록 조회

select  emp_id, emp_name, 
        case job when &#39;AD_PRES&#39; then &#39;대표&#39;
            when &#39;FI_ACCOUNT&#39; then &#39;회계&#39;
            when &#39;PU_CLERK&#39; then &#39;구매&#39;
            end as job
from emp
where job in (&#39;AD_PRES&#39;,&#39;FI_COUNT&#39;,&#39;PU_CLERK&#39;);          



-- TODO: EMP 테이블에서 부서이름(dept_name)과 급여 인상분을 조회.
-- 급여 인상분은 부서이름이 &#39;IT&#39; 이면 급여(salary)에 10%를 &#39;Shipping&#39; 이면 급여(salary)의 20%를 &#39;Finance&#39;이면 30%를 나머지는 0을 출력

select dept_name,
       case dept_name when &#39;IT&#39; then salary * 1.1
                      when &#39;Shipping&#39; then salary * 1.2
                      when &#39;Finance&#39; then salary * 1.3
                      else 0 
        end as &#39;급여인상금액&#39;
from emp;


-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary), 인상된 급여를 조회한다. 
-- 단 급여 인상율은 급여가 5000 미만은 30%, 5000이상 10000 미만는 20% 10000 이상은 10% 로 한다.

select emp_id, emp_name, salary , 
        case salary when salary &lt; 5000 then salary*1.3
                    when 5000 &lt;= salary &lt;10000 then salary*1.2 -- 질문 
                    when salary between 5000 and 9999.99 then salary * 1.2
                    when 10000 &lt;= salary then salary*1.1
        end as &#39;인상된 급여&#39;
from emp;</code></pre>
<blockquote>
<p>** case 를 이용한 정렬**
직원들의 모든 정보를 조회한다. 단 정렬은 업무(job)가 
&#39;ST_CLERK&#39;, &#39;IT_PROG&#39;, &#39;PU_CLERK&#39;, &#39;SA_MAN&#39; 순서대로 먼저나오도록 한다. (나머지 JOB은 상관없음)</p>
</blockquote>
<pre><code>select * from emp
order by case job when &#39;ST_CLECK&#39; then 1
                when &#39;IT_PROG&#39; then 2
                when &#39;PU_CLECK&#39; then 3
                when &#39;SA_MAN&#39; then 4
                else job
                end; -- 자기값 리턴



&gt; **타입 변환** 
case(값 as 변환할 타입)
convert(값, 변환할 타입)
```sql
select &#39;1000&#39; + &#39;2000&#39;, &#39;a&#39;+&#39;b&#39;;
select curdate() + 10;
select convert(curdate(), signed);
select convert(20230901, date);
select convert(102030, time);
select cast(102030 as time); -- convert == cast</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 코딩 기초 테스트 Day 4 연산,조건문(230829)]]></title>
            <link>https://velog.io/@shasha_malone/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9-%EA%B8%B0%EC%B4%88-%ED%85%8C%EC%8A%A4%ED%8A%B8-Day-4-%EC%97%B0%EC%82%B0%EC%A1%B0%EA%B1%B4%EB%AC%B8230829</link>
            <guid>https://velog.io/@shasha_malone/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9-%EA%B8%B0%EC%B4%88-%ED%85%8C%EC%8A%A4%ED%8A%B8-Day-4-%EC%97%B0%EC%82%B0%EC%A1%B0%EA%B1%B4%EB%AC%B8230829</guid>
            <pubDate>Thu, 31 Aug 2023 10:03:03 GMT</pubDate>
            <description><![CDATA[<ul>
<li>n의 배수<pre><code class="language-python"># 정수 num과 n이 매개 변수로 주어질 때, num이 n의 배수이면 1을 return n의 배수가 아니라면 0을 return하도록 solution 함수를 완성해주세요.
</code></pre>
</li>
</ul>
<p>def solution(num, n):
    return 1 if num % n ==0 else 0</p>
<pre><code>
- 공배수
```python
# 정수 number와 n, m이 주어집니다. number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 return하도록 solution 함수를 완성해주세요.

def solution(number, n, m):
    return 1 if number%n == 0 and number%m == 0 else 0</code></pre><ul>
<li><p>홀짝에 따라 다른 값 반환하기</p>
<pre><code class="language-python"></code></pre>
</li>
<li><p>조건 문자열</p>
<pre><code class="language-python"></code></pre>
</li>
<li><p>flag에 따라 다른 값 반환하기</p>
<pre><code class="language-python"></code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 01.basic_select - 기본구문, WHERE절, ORDER BY절]]></title>
            <link>https://velog.io/@shasha_malone/SQL-01.basicselect-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EB%AC%B8-WHERE%EC%A0%88-ORDER-BY%EC%A0%88</link>
            <guid>https://velog.io/@shasha_malone/SQL-01.basicselect-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EB%AC%B8-WHERE%EC%A0%88-ORDER-BY%EC%A0%88</guid>
            <pubDate>Thu, 31 Aug 2023 06:39:34 GMT</pubDate>
            <description><![CDATA[<h2 id="select-기본-구문---연산자-컬럼-별칭">SELECT 기본 구문 - 연산자, 컬럼 별칭</h2>
<blockquote>
<p>select 컬럼명 from 테이블명 [as 별칭]
 select 컬럼명, 컬럼명 [, .....]  =&gt; 조회할 컬럼 지정. *: 모든 컬럼
  from   테이블명                 =&gt; 조회할 테이블 지정.
  컬럼명 [as 별칭] ==&gt; 컬럼명에서 조회한 것을 별칭에 저장해서 보여준다.</p>
</blockquote>
<ul>
<li>SQL: 대소문자 구분 안함. (값은 구분)</li>
</ul>
<pre><code class="language-sql">use hr; # hr 데이터 베이스를 사용
#emp테이블의 모든 칼럼의 모든 항목을 조회
select * from emp;

#emp테이블의 직원 ID(emp_id), 직원 이름 (emp_name), 업무(job) 컬럼의 값을 조회

select emp_id,
         emp_name,
        job
from emp;
```sql 

## 연산자 
&gt; 산술 연산자 
    `- +, -, *, /, %, mod(나머지), div(몫)` - 30 div 5, 30 mod 5
- date/time/datetime 
    - +, - : 마지막 항목(date:일, time: 초, datetime: 초)의 값을 +/- =&gt; 계산 결과가 정수형으로 반환된다. (ex:20100102)
- 여러개 값을 합쳐 문자열로 반환
    - `concat(값, 값, ...) ` =&gt; python의 join
- 피연산자가 null인경우 결과는 null
- 연산은 그 컬럼의 모든 값들에 일률적으로 적용된다.
- 같은 컬럼을 여러번 조회할 수 있다.



## select TODO

```sql

select emp_id as ID,
        emp_name as 이름,
        salary as 급여,
        comm_pct as 커미션_PCT,
        salary * comm_pct as &quot;commission&quot; -- 컬럼 * 컬럼 : 행별로 연산.



#2 . [as 별칭]: 테이블 값을 조회한 result set의 별칭
- select에서 나열되는 컬럼명은 중복되어도 된다 =&gt; 조회결과를 저장하는 result set이라는 임시테이블이 일시적으로 생성되는 것이기 때문에 그 테이블의 컬럼명을 지정하는 것

select salary , salary, salary * comm_pct from emp;

--  TODO: EMP 테이블의 업무(job)이 어떤 값들로 구성되었는지 조회 - 동일한 값은 하나씩만 조회되도록 처리

select * from emp;

select distinct job from EMP;

-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary), 커미션_PCT(comm_pct), 급여에 커미션_PCT를 곱한 값을 조회

select emp_id as ID,
        emp_name as 이름,
        salary as 급여,
        comm_pct as 커미션_PCT,
        salary * comm_pct as &quot;commission&quot; -- 컬럼 * 컬럼 : 행별로 연산
from EMP;


-- TODO:  EMP 테이블에서 급여(salary)을 연봉으로 조회. (곱하기 12)
select salary *12 as &quot;연봉&quot; 
from EMP;

--TODO: EMP 테이블에서 직원이름(emp_name)과 급여(salary)을 조회. 급여 앞에 $를 붙여 조회.

select emp_name as 직원이름 ,
        concat(&#39;$&#39;,salary) as 급여
from EMP;
</code></pre>
<hr>
<h2 id="select-조회">select 조회</h2>
<blockquote>
<p>** where 절은 행에 제약조건을 거는 것이고, order by절은 컬럼의 정렬기준(ASC,DESC)을 거는 것이다**</p>
</blockquote>
<h2 id="where절--조회할-행에-대한-선택-조건">WHERE절 : 조회할 행에 대한 선택 조건</h2>
<blockquote>
<p>SELECT 조회컬럼 [별칭] [,조회컬럼,...]
FROM 테이블이름 [별칭]
[WHERE 제약조건]
[GROUP BY 그룹화할 기준컬럼 ]
[HAVING 조건]
[ORDER BY 정렬기준컬럼 [ASC |DESC]]</p>
</blockquote>
<blockquote>
<p>** WHERE절 검색조건 주요 연산자**</p>
</blockquote>
<ul>
<li>=, &lt;&gt; (!=)⭐, &gt;, &lt;, &gt;=, &lt;=
= :같은 것 조회 , != 같지 않은 것 조회 &gt; : 큰 값들 조회 , &lt; : 작은 값들 조회</li>
<li>BETWEEN a AND b | a이상 b이하 값 조회</li>
<li>IN(list - 쉼표로 값들 구분) | 값 들중 하나와 일치하는 데이터 조회</li>
<li>LIKE </li>
<li>IS NULL ⭐ | NULL 값을 가진 데이터를 조회</li>
</ul>
<blockquote>
<ul>
<li>NOT BETWEEN a AND b | a미만 b 초과 값 조회 
NOT IN (list) | list 값과 일치하지 않는 데이터를 조회
NOT LIKE | 문자 형태와 일치하지 않는 데이터를 조회
IS NOT NULL | </li>
</ul>
</blockquote>
<ul>
<li>연산자 우선 순위 :() <ul>
<li>AND( OR  ) &gt; OR부분을 먼저 연산</li>
</ul>
</li>
</ul>
<pre><code class="language-sql"># where 절을 이용한 행 선택 
-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110

select emp_name,
        dept_name
from emp 
where emp_id = 110; -- 조회 안될 시 빈표 출력</code></pre>
<p>1) 데이터 베이스에서 EMP 테이블 존재하는지 확인 : from
2) emp_id = 110 인 행이 존재하는 지 위에서 부터 순차적으로 확인 : where
3) 해당 행의 emp_name, dept_name 값을 불러서 result set에 불러옴 : select</p>
<h3 id="sql-쿼리예시로-where절을-배워보자">SQL 쿼리예시로 where절을 배워보자</h3>
<pre><code class="language-sql">select * from emp; -- 테이블 전체 확인용

-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110

select emp_name,
        dept_name
from emp
where emp_id = 110; -- 조회 안될 시 빈표 출력


-- EMP 테이블에서 &#39;Sales&#39; 부서에 속하지 않은 직원들의 ID(emp_id), 이름(emp_name),  부서명(dept_name)을 조회.
select emp_id,
        emp_name,
        dept_name
from emp
where dept_name &lt;&gt; &#39;Sales&#39;;
-- where dept_name != &#39;Sales&#39;;


-- EMP 테이블에서 커미션비율(comm_pct)이 0.2~0.3 사이인 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.

select emp_id, 
        emp_name,
        comm_pct
from emp 
where comm_pct between 0.2 and 0.3;

-- where comm_pct &gt;= 0.2
-- and comm_pct &lt;= 0.3;


--  0.2 초과 0,3 이하 값 조건 =&gt; and 연산자 사용
-- where comm_pct between 0.20001 and 0.3;

-- EMP 테이블에서 커미션을 받는 직원들 중 커미션비율(comm_pct)이 0.2~0.3 사이가 아닌 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.
select emp_id,
        emp_name,
        comm_pct
from emp
where comm_pct not between 0.2 and 0.3; # comm_pct &lt;0.2 or comm_pct &gt; 0.3

-- EMP 테이블에서 업무(job)가 &#39;IT_PROG&#39; 거나 &#39;ST_MAN&#39; 인 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id,
        emp_name,
        job
from emp
where job in (&#39;IT_PROG&#39;, &#39;ST_MAN&#39;); 
-- where job = &#39;IT_PROG&#39;
-- or    job = &#39;IT_MAN&#39;;

-- EMP 테이블에서 업무(job)가 &#39;IT_PROG&#39; 나 &#39;ST_MAN&#39; 가 아닌 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.

select emp_id,
        emp_name,
        job
from emp
where job not in (&#39;IT_PROG&#39;,&#39;ST_MAN&#39;);
-- where job &lt;&gt; &#39;IT_PROG&#39;
-- and  job &lt;&gt; &#39;ST_MAN&#39;;


-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하는 직원의  ID(emp_id), 이름(emp_name)을 조회.
select emp_id,
        emp_name
from emp
where emp_name like &#39;S%&#39;; -- S% = S[0개 이상의 모든 글자] 


-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하지 않는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id,
        emp_name
from emp
where emp_name not like &#39;S%&#39;;


-- EMP 테이블에서 직원 이름(emp_name)이 en으로 끝나는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id,
        emp_name
from emp
where emp_name like &#39;%en&#39;;

-- EMP 테이블에서 직원 이름(emp_name)의 세 번째 문자가 “e”인 모든 사원의 이름을 조회
select emp_name
from emp
where emp_name like &#39;__e%&#39;; -- &#39;_&#39; : 한개의 모든 글자 

-- EMP 테이블에서 직원의 이름에 &#39;%&#39; 가 들어가는 직원의 ID(emp_id), 직원이름(emp_name) 조회
select emp_id,
       emp_name
from emp
where emp_name like &#39;%#%%&#39; escape &#39;#&#39;; 
-- #%,#_ 
-- %나 _ 자체를 검색하는 문자(상수)로 사용할 경우. 특수문자%, 특수문자_ (특수문자는 escape 다음에 지정)
/*
XX로 시작하는지 : like &#39;XX%&#39;
XX로 들어갔는지: like &#39;%XX%&#39;
XX로 끝나는지 : like &#39;%XX&#39;
글자수명시 -&gt; &#39;_&#39; like &#39;__AB__BB___가&#39; 
*/



-- 패턴 문자를 조회조건에서 사용해야하는 경우 escape 구문을 이용해 패턴문자를 검색문자로 표시하는 특수문자를 지정한다.
</code></pre>
<ul>
<li>날짜 데이터 제한 조건에 걸기
```sql</li>
<li><ul>
<li>TODO: EMP 테이블에서 2007년 이후 입사한 직원들의  ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.</li>
</ul>
</li>
<li><ul>
<li>참고: date/datatime에서 년도만 추출: year(값). ex) year(&#39;2020-10-10&#39;) =&gt; 2020</li>
</ul>
</li>
<li><ul>
<li>year(now()), month(now()),day(now()) -- 현재 날짜 정보
select * from emp;</li>
</ul>
</li>
</ul>
<p>select emp_id,
        emp_name, 
        hire_date
from emp
where year(hire_date) &gt;= 2007;</p>
<p>-- TODO: EMP 테이블에서 2004년에 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.</p>
<p>select * from emp;</p>
<p>select emp_id, emp_name, hire_date
from emp
where year(hire_date) = 2004;
-- where hire_date between &#39;2004-01-01&#39; and &#39;2004-12-31&#39;;</p>
<pre><code>

 ## WHERE 조건이 여러개인 경우 : AND OR

-  참 and 참 -&gt; 참: 조회 결과 행
- 거짓 or 거짓 -&gt; 거짓: 조회 결과 행이 아님.

-  연산 우선순위 : and &gt; or

-  where 조건1 and 조건2 or 조건3
 1. 조건 1 and 조건2
 2. 1결과 or 조건3

 - or를 먼저 하려면 where 조건1 and (조건2 or 조건3)

 ```sql

 --  EMP 테이블에서 업무(job)가 &#39;SA_REP&#39; 이고 급여(salary)가 $9,000인 직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
--      직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
select emp_id,
        emp_name,
        job,
        salary
from emp
where job = &#39;SA_REP&#39;
and salary = 9000;

        --  EMP 테이블에서 업무(job)가 &#39;FI_ACCOUNT&#39; 거나 급여(salary)가 $8,000 이상인 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.

        select emp_id,
                emp_name,
                job,
                salary
        from emp
        where job = &#39;FI-ACCOUNT&#39; 
        or salary &gt;= 8.000 ;


-- TODO: EMP 테이블에서 업무(job)에 &#39;MAN&#39;이 들어가는 직원들 중 급여(salary)가 $10,000 이하이 거나 2008년 이후 입사한 
--  직원의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date), 급여(salary)를 조회

select emp_id, emp_name, job, hire_date, salary
from emp
where job like &#39;%MAN%&#39;
and (salary &lt;= 10000
or year(hire_date) &gt;= 2008);
</code></pre><pre><code>## order by를 이용한 정렬

&gt;- order by절은 select문의 마지막에 온다.
- order by 정렬기준컬럼 정렬방식 [, ...]
    - 정렬기준컬럼 지정 단위: 컬럼이름, 컬럼의순번(select절의 선언 순서)
     select salary, hire_date from emp ...
     에서 salary 컬럼 기준 정렬을 설정할 경우. 
     order by salary 또는 1
    - 정렬방식
        - ASC : 오름차순, 기본방식(생략가능)
        - DESC : 내림차순

&gt;문자열 오름차순 : 숫자 -&gt; 대문자 -&gt; 소문자 -&gt; 한글     
Date 오름차순 : 과거 -&gt; 미래
null 오름차순 : null이 먼저 나온다.
    ex)    order by salary asc, emp_id desc
      salary로 전체 정렬을 하고 salary가 같은 행은 emp_id로 정렬.


```sql

    --  직원들의 전체 정보를 직원 ID(emp_id)가 큰 순서대로 정렬해 조회

    select * from emp
    order by emp_id desc;

    --  직원들의 id(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 
    --  업무(job) 순서대로 (A -&gt; Z) 조회하고 업무(job)가 같은 직원들은 급여(salary)가 높은 순서대로 2차 정렬해서 조회.

    select emp_id,
            emp_name,
            job,
            salary
    from emp
    order by job asc, salary desc; -- emp_name desc;


    -- 부서명을 부서명(dept_name)의 오름차순으로 정렬해 조회하시오.
    select dept_name
    from emp
    order by dept_name; -- desc;
    -- null은 가장 작은값(정렬에서).
    select dept_name as &quot;부서명&quot;
    from emp
    order by 1;  -- &quot;부서명&quot;


    -- TODO: 급여(salary)가 $5,000을 넘는 직원의 ID(emp_id), 이름(emp_name), 급여(salary)를 급여가 높은 순서부터 조회
    select emp_id, emp_name, salary 
    from emp
    where salary &gt; 5000
    order by salary desc;



</code></pre>]]></description>
        </item>
    </channel>
</rss>