<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Learning Journey</title>
        <link>https://velog.io/</link>
        <description>성장과 회고를 기록하는 일기장</description>
        <lastBuildDate>Wed, 17 Dec 2025 04:28:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Learning Journey</title>
            <url>https://velog.velcdn.com/images/da_leesunho/profile/f2274d25-2c0a-4ee0-a151-06321fbcd1e7/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Learning Journey. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/da_leesunho" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[251217_데일리 학습]]></title>
            <link>https://velog.io/@da_leesunho/251217%EB%8D%B0%EC%9D%BC%EB%A6%AC-%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@da_leesunho/251217%EB%8D%B0%EC%9D%BC%EB%A6%AC-%ED%95%99%EC%8A%B5</guid>
            <pubDate>Wed, 17 Dec 2025 04:28:53 GMT</pubDate>
            <description><![CDATA[<h1 id="✔️-원칙">✔️ 원칙</h1>
<ul>
<li><strong>집중력</strong>에 치우치지 말자</li>
<li>학습의 난이도를 <strong>&quot;공부한다&quot;</strong> 가 아닌 <strong>&quot;열어본다&quot;</strong> 수준으로</li>
<li>휴식을 끊지 말자 (허용하되, <strong>시간을 격리</strong>한다)</li>
</ul>
<h2 id="1️⃣-0900--1200-핵심-집중">1️⃣ 09:00 ~ 12:00 (핵심 집중)</h2>
<ul>
<li>목표 : 미진행</li>
</ul>
<hr>
<h2 id="2️⃣-1300--1500-저부하">2️⃣ 13:00 ~ 15:00 (저부하)</h2>
<ul>
<li><p>할 일
1) 전처리 과정
2) 머신러닝 (지도/비지도 학습) 복습</p>
</li>
<li><p>15:00 ~ 16:00
1) 유튜브 시청</p>
</li>
</ul>
<hr>
<h2 id="3️⃣-1600--1800-실습--질문고정">3️⃣ 16:00 ~ 18:00 (실습 / 질문고정)</h2>
<ul>
<li>할 일
1) 지도, 비지도 학습 종류 학습
2) 지도, 비지도 종류 별 하나 씩 코드 진행해보기</li>
</ul>
<hr>
<h2 id="4️⃣-1900--2100-정리">4️⃣ 19:00 ~ 21:00 (정리)</h2>
<h2 id="결과-요약">결과 요약</h2>
<ul>
<li></li>
<li></li>
</ul>
<hr>
<h3 id="✔-내일-아침-첫-행동-정하기">✔ 내일 아침 첫 행동 정하기</h3>
<ul>
<li>SQL 코트카타 이후 질문 1개 고정</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[251204_통계_1]]></title>
            <link>https://velog.io/@da_leesunho/251204%ED%86%B5%EA%B3%841</link>
            <guid>https://velog.io/@da_leesunho/251204%ED%86%B5%EA%B3%841</guid>
            <pubDate>Thu, 04 Dec 2025 10:25:48 GMT</pubDate>
            <description><![CDATA[<p>목표</p>
<ul>
<li><input disabled="" type="checkbox"> 통계를 왜 배워야하는지 답을 할 수 있다.</li>
<li><input disabled="" type="checkbox"> 기술 통계와 추론 통계 차이를 답 할수 있다.</li>
<li><input disabled="" type="checkbox"> 정규분포와 표준화에 대해 이해하고 간단히 설명할 수 있다.</li>
</ul>
<p><strong>Why 를 달고 살자.</strong></p>
<h1 id="통계-정의-및-쓰임">통계 정의 및 쓰임</h1>
<blockquote>
<p><em>통계란? → 데이터를 해석하게 해주는 도구</em>
<strong>1) 신뢰할 수 있는 추론과 검증을 위함
2) 데이터의 이해를 위함
3) 모델링과 머신러닝의 기반
4) 청자 설득을 위함</strong></p>
</blockquote>
<h2 id="✔️-숙지해야하는-내용">✔️ 숙지해야하는 내용</h2>
<ul>
<li>통계에 대한 모든 것을 익힌다는 생각은 버리기</li>
<li>해석을 어떻게 할지(수식에 집중 x) 초점 맞추기</li>
</ul>
<h1 id="통계-기초">통계 기초</h1>
<h2 id="통계학">통계학</h2>
<blockquote>
<p>&#39;모집단&#39;의 성질을 추정, 설명하는 것을 목표</p>
</blockquote>
<h2 id="모집단">모집단</h2>
<blockquote>
<p>알고자 하는 대상 전체</p>
</blockquote>
<h3 id="추정-방법">추정 방법</h3>
<p> : 전수 조사 (모집단 기준) vs 표본 조사 (일부 기준)</p>
<h2 id="표본">표본</h2>
<blockquote>
<p>모집단의 일부</p>
</blockquote>
<h3 id="표본-추출">표본 추출</h3>
<p>: 모집단에서 표본(일부)를 뽑는 것
: 표본 크기 → 샘플 수 (행의 갯수)</p>
<h1 id="기술통계-vs-추론통계">기술통계 vs 추론통계</h1>
<h2 id="기술통계">기술통계</h2>
<blockquote>
<p><strong>현재의 데이터를 요약 / 설명하는 통계</strong>
<strong>중심 경향치 (평균, 중앙값, 최빈값) + 흩어진 정도(분산, 표준편차) + 분포(왜도 / 첨도)</strong></p>
</blockquote>
<h3 id="중심-경향치">중심 경향치</h3>
<p>중앙값 : 데이터 크기를 순서대로 나열 시 <strong>정확히 가운데 위치하는 값</strong>
<strong>→ 이상치 영향을 덜 받음</strong></p>
<h3 id="흩어진-정도">흩어진 정도</h3>
<ul>
<li><p>모집단 분산
: 각 데이터가 평균에서 얼마나 떨어져 있는지 = $σ^2$
: $(a - 평균)^2 + (b - 평균)^2 ... /전체 데이터 개수$</p>
</li>
<li><p>표준 편차
: 분산에 루트를 씌운 값 = $σ$</p>
</li>
<li><p>분산 확인 그래프(시각화)
: 히스토그램, 박스플랏, 밀도곡선, 바이올릿플랏 등</p>
</li>
</ul>
<h3 id="분포">분포</h3>
<ul>
<li>왜도 : 데이터 분포의 좌우 비대칭성을 나타내는 척도</li>
<li>첨도 : 뾰족함이나 완만함의 정도를 나타내는 척도</li>
</ul>
<h2 id="추론-통계">추론 통계</h2>
<blockquote>
<p>일부(표본) 를 바탕으로 모집단 추정(예측)하거나 주장이 맞는지 검정하는 통계</p>
</blockquote>
<ul>
<li>기술통계와의 차이점
: 일부를 가지고 모집단을 예측</li>
</ul>
<p>해당 표본이 얼마나 신뢰할 수 있는 정보인지 추정해야 함.
→ 확률로 불확실성을 다루는 통계</p>
<h1 id="확률-기초">확률 기초</h1>
<h2 id="확률">확률</h2>
<blockquote>
<p>발생 여부가 불확실한 사건의 발생 가능성을 숫자로 표현
0&lt;=P(A)&lt;=1 --&gt; 모든 사건의 확률을 전부 더하면 1</p>
</blockquote>
<h2 id="확률변수">확률변수</h2>
<blockquote>
<p>사건의 결과에 따라 값이 확률적으로 정해지는 변수</p>
</blockquote>
<h3 id="이산형">이산형</h3>
<ul>
<li>하나 씩 셀 수 있는 변수 ex&gt; 주사위, 나이</li>
</ul>
<h3 id="연속형">연속형</h3>
<ul>
<li>무한히 쪼갤 수 있는 변수, 연속적으로 존재 ex&gt; 키, 수면시간</li>
</ul>
<h3 id="실현값">실현값</h3>
<ul>
<li>실제로 그 확률변수가 가진 구체적인 값</li>
</ul>
<h2 id="확률-분포">확률 분포</h2>
<blockquote>
<p>확률 변수가 가질 수 있는 값과 그에 대한 발생 확률 간의 관계를 정리
x축 : 확률변수, y축 : 값이 나올 가능성(확률 or 밀도)</p>
</blockquote>
<ul>
<li><p>이산형 : 셀 수 있음(유한) - 막대</p>
</li>
<li><p>연속형 : 셀 수 없음(무한) - 곡선
→ 구간(그래프 너비)로 확률을 계산해야 함</p>
</li>
</ul>
<h3 id="✔️추론-통계-확률분포-가-중요한-이유">✔️추론 통계-확률분포 가 중요한 이유</h3>
<ul>
<li>현실 모집단 관찰 불가 (확률분포로 가정)</li>
<li>표본은 해당 확률 분포에서 나온 실현 값으로 생각</li>
<li>통계적 추론 : 실현값을 바탕, 어떤 분포에서 나왔는지 추정하는 과정</li>
</ul>
<h2 id="기댓-값">기댓 값</h2>
<blockquote>
<p>확률 변수가 오랜 반복에서 평균적으로 기대되는 값</p>
</blockquote>
<p>** 실현 값이 많을수록 평균은 기댓 값에 가까워진다. **</p>
<h2 id="🔑조건부확률">🔑조건부확률</h2>
<ul>
<li><p>동시확률분포 (확률변수 2개)
= 변수 2개를 엮을 때의 확률 분포
: 독립적이다 = P(X,Y) = P(X) * P(Y)</p>
</li>
<li><p>조건부확률
: P(X|Y) = Y가 주어졌을 때, X가 일어날 확률</p>
</li>
</ul>
<h1 id="추론통계">추론통계</h1>
<ul>
<li><p>추정</p>
<blockquote>
<p>모집단 특성을 알 수 없기에 표본을 통해 추정</p>
</blockquote>
</li>
<li><p><em>범위를 정하기 위해 표본 평균의 분포가 정규분포를 따른다는 전제 사용*</em></p>
</li>
<li><p>가설검정</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python Basic #1]]></title>
            <link>https://velog.io/@da_leesunho/Python-Basic-1</link>
            <guid>https://velog.io/@da_leesunho/Python-Basic-1</guid>
            <pubDate>Wed, 03 Dec 2025 11:12:15 GMT</pubDate>
            <description><![CDATA[<p><em>복습 겸 중요사항 정리</em></p>
<hr>
<h1 id="가상환경-설치">가상환경 설치</h1>
<pre><code class="language-python">### 터미널 경로 확인 필요
python -m venv venv        # 설치
venv\scripts\activate   # 실행
deactivate                # 실행종료</code></pre>
<blockquote>
<p><em>여러 프로젝트 진행 시 호환성 문제가 없도록 (관리하기 용이하도록)
각 폴더(프로젝트 별) 내 가상환경 구성</em></p>
</blockquote>
<h1 id="자료형">자료형</h1>
<blockquote>
<p><em><strong>문자, 숫자(정/실수), 논리형, None</strong>
크롤링 진행 시 대부분 문자열(str) 로 추출 (추후 진행시 유의하기)
문자열 연산 (+ , *) -&gt; 문자 이어붙이기, 반복하기</em></p>
</blockquote>
<h2 id="문자열str">문자열(str)</h2>
<p>인덱스와 순서가 존재
슬라이싱 가능</p>
<pre><code class="language-python">email=&quot;da_leesunho@velog.io&quot;
email[:11]        # da_leesunho
email[11:]        # @velog.io
email[:-1]        # da_leesunho@velog.i
email[::-1]        # li.golev@ohnuseel_ad</code></pre>
<pre><code class="language-python">&quot;python&quot;.upper()            # PYTHON
&quot;    abc de    &quot;.strip()    # abc de
&quot;a,b,c&quot;.split(&quot;,&quot;)            # [a, b, c]</code></pre>
<p><strong>split 함수의 경우, 리스트로 담아준다</strong></p>
<h1 id="자료-구조">자료 구조</h1>
<h2 id="리스트">리스트</h2>
<blockquote>
<p>여러 개의 데이터, 순서가 있으며 값 변경이 가능하다
-&gt; 비슷한 값들을 다룰 때 사용</p>
</blockquote>
<pre><code class="language-python">scores=[60, 40, 20, 40, 70]
scores.append(100)      # [60, 40, 20, 40, 70, 100]
scores.count(40)        # 2
scores[0:3]                # [60, 40, 20]</code></pre>
<h3 id="리스트-컴프리헨션">리스트 컴프리헨션</h3>
<blockquote>
<p>반복문 + 조건문 -&gt; 한 줄로 줄여주는 것
이름이 필요 없을 때, 효율적으로 작성하고자 할 때
<strong>[표현식 반복문 조건식]</strong></p>
</blockquote>
<h2 id="딕셔너리">딕셔너리</h2>
<blockquote>
<p>키:값 -&gt; 값에 대한 정보를 자세히 표현해 줄 때, 순서 x</p>
</blockquote>
<pre><code class="language-python">user={&quot;name&quot;:&quot;Tom&quot;,&quot;age&quot;:25}
user[&quot;name&quot;]         # &quot;Tom&quot;
user[&quot;job&quot;]            # Error 발생 (프로그램 종료)
user.get(&quot;job&quot;)        # None (밑 코드로 진행 유지)
user[&quot;job&quot;] = developer        # 새 키/값 추가</code></pre>
<h1 id="문자열-파싱-연습">문자열 파싱 연습</h1>
<pre><code class="language-Python">email = da_leesunho@velog.io
username = email.split(&quot;@&quot;)[0]
domain = email.split(&quot;@&quot;)[1]
# or
username, domain = email.split(&quot;@&quot;)
    # username = da_leesunho, domain = velog.io</code></pre>
<h1 id="문자열-숫자-정규화">문자열 숫자 정규화</h1>
<pre><code class="language-Python">data1=&quot;1,200&quot;
data2=&quot;10.5%&quot;
data3=&quot;   300  &quot;

data1_=int(data1.replace(&quot;,&quot;,&quot;&quot;))            # 1200
data2_=float(data2.replace(&quot;%&quot;,&quot;&quot;))/100        # 0.105
data3_=int(data3.strip())                    # 300
</code></pre>
<h1 id="🔑-리스트-필터링--컴프리헨션">🔑 리스트 필터링 &amp; 컴프리헨션</h1>
<blockquote>
<p><strong>[표현식 반복문 조건식]</strong></p>
</blockquote>
<pre><code class="language-Python">## 60 이상만 추출한 리스트 생성 -&gt; for 문
scores=[95, 50, 82, 100, 59, 88]
passed = []
for i in scores:
    if i &gt;= 60:
        passed.append(i)                    ## [95, 82, 100, 88]        
or
## 리스트 컴프리헨션
scores=[95, 50, 82, 100, 59, 88]
passed = [i for i in scores if i&gt;=60]         # [95, 82, 100, 88]</code></pre>
<pre><code class="language-Python">## 90 이상 PASS 이외 FAIL
scores=[95, 50, 82, 100, 59, 88]
result = []
for i in scores:
    if i&gt;=90:
        result.append(&quot;PASS&quot;)
    else:
        result.append(&quot;FAIL&quot;)        # [&#39;PASS&#39;, &#39;FAIL&#39;, &#39;FAIL&#39;, &#39;PASS&#39;, &#39;FAIL&#39;, &#39;FAIL&#39;]
or
result=[&quot;PASS&quot; if i&gt;=90 else &quot;FAIL&quot; for i in scores]    # [&#39;PASS&#39;, &#39;FAIL&#39;, &#39;FAIL&#39;, &#39;PASS&#39;, &#39;FAIL&#39;, &#39;FAIL&#39;]</code></pre>
<h1 id="🔑-딕셔너리-변환">🔑 딕셔너리 변환</h1>
<pre><code class="language-Python">info = &quot;name=Tom, age=20, city=Seoul&quot;
items = info.split(&quot;,&quot;)        # [&#39;name=Tom&#39;, &#39; age=20&#39;, &#39; city=Seoul&#39;]
result={}
for i in items:
    key, value = i.split(&quot;=&quot;)
    result[key.strip()] = value
or
result = {k.strip():v for k, v in (i.split(&quot;=&quot;) for i in items)}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[20251202_데일리 학습 프레임]]></title>
            <link>https://velog.io/@da_leesunho/20251202%EB%8D%B0%EC%9D%BC%EB%A6%AC-%ED%94%84%EB%A0%88%EC%9E%84</link>
            <guid>https://velog.io/@da_leesunho/20251202%EB%8D%B0%EC%9D%BC%EB%A6%AC-%ED%94%84%EB%A0%88%EC%9E%84</guid>
            <pubDate>Tue, 02 Dec 2025 02:21:05 GMT</pubDate>
            <description><![CDATA[<h1 id="📘-오늘의-데일리-학습-프레임">📘 오늘의 데일리 학습 프레임</h1>
<p><em>(날짜: 2025-12-02)</em></p>
<hr>
<h2 id="1️⃣-오늘의-최종-목표-outcome">1️⃣ 오늘의 최종 목표 (Outcome)</h2>
<ul>
<li>오늘 학습이 끝나면 <strong>무엇을 할 수 있어야 하는가?</strong>  <ul>
<li><input disabled="" type="checkbox"> 데이터 분석에 있어 통계가 왜 중요한지 설명할 수 있다.</li>
<li><input disabled="" type="checkbox"> 기술통계와 추론 통계에 대한 개념 이해, 각각 차이점 설명 가능하다.</li>
<li><input disabled="" type="checkbox"> 통계 분석 방법의 다양한 종류를 이해하고 간단히 얘기해 볼 수 있다.</li>
<li><del>[ ] SQL 기본 구조문에 대한 작성, 설명이 가능하다.</del></li>
<li><del>[ ] Python 특징과 변수, 자료형, 자료구조를 작성하고 설명할 수 있다.</del></li>
</ul>
</li>
</ul>
<hr>
<h2 id="2️⃣-핵심-3가지-포커스-focus-targets">2️⃣ 핵심 3가지 포커스 (Focus Targets)</h2>
<ol>
<li>통계학 기초 1챕터
<del>2.  SQL 1 ~ 4회차</del>
<del>3.  Python 이론/실습 2회차</del></li>
</ol>
<hr>
<h2 id="3️⃣-타임-박스-time-box">3️⃣ 타임 박스 (Time Box)</h2>
<table>
<thead>
<tr>
<th>구간</th>
<th>내용</th>
<th>시간</th>
</tr>
</thead>
<tbody><tr>
<td>Warm-up</td>
<td>데일리 학습 프레임 작성</td>
<td>20분</td>
</tr>
<tr>
<td>Deep Work 1</td>
<td>통계 1챕터 수강</td>
<td>1시간 30분</td>
</tr>
<tr>
<td>Break</td>
<td>휴식</td>
<td>30분</td>
</tr>
<tr>
<td>Deep Work 2</td>
<td>SQL / Python 기본 복습</td>
<td>1시간 30분</td>
</tr>
<tr>
<td>Wrap-up</td>
<td>오늘 배운 것 3줄 요약</td>
<td>20분</td>
</tr>
</tbody></table>
<p><strong>총 예상:</strong> 약 3시간 40분</p>
<hr>
<h2 id="4️⃣-학습-시작-전-체크리스트-environmentattention">4️⃣ 학습 시작 전 체크리스트 (Environment/Attention)</h2>
<ul>
<li><input disabled="" type="checkbox"> 알림 OFF (카톡·메일·유튜브)  </li>
<li><input disabled="" type="checkbox"> 휴대폰은 바깥 방에 두기  </li>
<li><input disabled="" type="checkbox"> 책상 위 불필요한 물건 치우기  </li>
<li><input disabled="" type="checkbox"> 오늘 필요한 파일·노트·브라우저만 열기  </li>
<li><input disabled="" type="checkbox"> 이어폰 또는 백색소음 설정  </li>
<li><input disabled="" type="checkbox"> 물 준비  </li>
</ul>
<hr>
<h2 id="5️⃣-실습--학습-기록-feedback-loop">5️⃣ 실습 &amp; 학습 기록 (Feedback Loop)</h2>
<ul>
<li>오늘 해결한 문제/과제  <ul>
<li>통계학 기초 1챕터 완료</li>
<li>판다스 과제 필수 4문제 완료</li>
</ul>
</li>
<li>막힌 지점  <ul>
<li>SQL, Python 복습 실패</li>
</ul>
</li>
<li>해결 방법 또는 다시 찾아볼 부분  <ul>
<li>우선순위 조정 및 시간 분배 최적화</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6️⃣-학습-종료-요약-reflection">6️⃣ 학습 종료 요약 (Reflection)</h2>
<h3 id="✔-배운-점-10개-이내">✔ 배운 점 10개 이내</h3>
<ol>
<li>기술 통계 vs 추론 통계
→ 데이터 요약, 설명 vs 표본 데이터 통해 모집단 특성 추정, 가설 검증</li>
<li>표준편차는 분산의 제곱근을 취한 값</li>
<li>모집단은 전체 데이터, 분석가는 표본 데이터를 이용한다.</li>
<li>신뢰구간 : 모집단의 평균이 특정 범위 내 있을 확률</li>
<li>가설검정 : 귀무가설(H0), 대립가설(H1)</li>
<li>이진(값이 2개) / 범주 데이터 구분</li>
<li>숫자형 : 히스토그램/막대형, 범주형 : 파이/막대그래프</li>
<li>상관관계(np.corrcoef) &amp; 상관계수 &amp; 인과관계</li>
<li>다변량 분석 : df화, sns.pairplot or heatmap</li>
</ol>
<h3 id="✔-아직-명확하지-않은-부분-3개">✔ 아직 명확하지 않은 부분 3개</h3>
<ol>
<li></li>
<li></li>
<li></li>
</ol>
<h3 id="✔-다음-학습-최우선-과제">✔ 다음 학습 최우선 과제</h3>
<ul>
<li>SQL 코드카타</li>
<li>판다스 도전 2문제</li>
</ul>
<hr>
<h2 id="7️⃣-감정컨디션-체크-energy">7️⃣ 감정/컨디션 체크 (Energy)</h2>
<ul>
<li>현재 에너지 레벨 (1~10):  10</li>
<li>집중 방해 요소는 무엇이었나?  과식</li>
<li>다음을 위한 에너지 조절 계획:  <ul>
<li>음식량 조절</li>
</ul>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 전처리 & 시각화 4]]></title>
            <link>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-4</link>
            <guid>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-4</guid>
            <pubDate>Tue, 18 Nov 2025 11:31:42 GMT</pubDate>
            <description><![CDATA[<p><em>해당 세션을 진행하는 동안에는 Anaconda Jupyter Notebook 으로 진행한다.</em></p>
<p><em>데이터 EDA (이상치, 결측치 확인 및 처리 방식)을 살펴보자</em></p>
<p><strong><em>실습은 별도로 진행, 나만의 ipynb 생성을 목표로 한다</em></strong></p>
<blockquote>
<p><em><strong>1) 손코딩은 반드시 진행해볼 것
2) 하나의 코드에 대해 다양한 함수와 값을 변형하여 살펴보기</strong></em></p>
</blockquote>
<hr>
<h2 id="eda-"><em>EDA ?</em></h2>
<blockquote>
<p><em>Exploratory Data Analysis, 탐색적 데이터 분석
: 수집한 데이터가 들어왔을 때, 다양한 각도에서 관찰 및 이해하는 과정</em></p>
</blockquote>
<p><em>다시 말해, 데이터를 분석하기 전
<strong>그래프나 통계적인 방법으로 자료를 직관적으로 바라보는 과정</strong>을 말한다.</em></p>
<h3 id="data-eda-과정"><em>Data EDA 과정</em></h3>
<blockquote>
<p><em>① 분석의 목적, 변수 확인
<strong>② 취합데이터 문제 확인 (ex&gt; df.head, tail, 이상/결측치 확인)</strong>
③ 데이터 개별속성 확인, 패턴화(시각화)</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/d619c375-c793-434b-b567-411ff6fb8840/image.png" alt=""></p>
<p><em>오늘은 EDA 과정 ② 에 해당하는, Cleaning (데이터 정제) 를 통한 
<strong>이상,결측치 확인과 처리 방안</strong>을 살펴 볼 것이다.</em></p>
<h2 id="이상치--결측치"><em>이상치 &amp; 결측치</em></h2>
<blockquote>
<p><em><strong>이상치</strong></em>
<em>: 전체 데이터 <strong>범위에서 벗어난 아주 작은 or 큰 값</strong></em>
<em><strong>결측치</strong></em>
<em>: 데이터 수집 과정에서 <strong>측정되지 않거나 누락된 데이터</strong>
보통 Null 혹은 NaN, NA</em></p>
</blockquote>
<h3 id="결측치-식별--처리"><em>결측치 식별 &amp; 처리</em></h3>
<p><em>결측치를 처리하는 방법은 두 가지다.
→ ① 제거 ② 대체</em></p>
<p><em>처리 - &#39;① 제거&#39; 로 할 경우 코드를 알아보자</em></p>
<pre><code class="language-Python"># 컬럼별 결측치 식별 
df3.isnull().sum()

# 결측치 제거1 - 열 제거하기 
df3 = df3.drop(&#39;Unnamed: 4&#39;, axis=1)


# 결측치 제거2 - 결측치가 있는 행들은 모두 제거
df3.dropna()
# 같은 표현
df3.dropna(axis=0, how=&#39;any&#39;)

# 결측치 제거3 - 결측치가 있는 열을 모두 제거 
# 열로 제거하면 컬럼이 제거되는 현상이 발생하므로 매우 위험합니다.  
# df3.dropna(axis=1)

# 결측치 제거4 - 전체 행이 결측값인 경우만 삭제하고 싶은 경우
# how=&#39;all&#39;을 사용해줍니다. 
df3.dropna(how=&#39;all&#39;)

# 결측치 제거5 - 결측치 제거 후 결과를 바로 저장하고 싶을 때
# inplace=True 조건을 넣어줍니다. 
df3.dropna(inplace=True)

# drop 이후 결측치가 잘 제거되었는지 체크가 필요하겠죠? 
df3.isnull().sum()</code></pre>
<p><em>처리 - &#39;② 대체&#39; 로 하는 경우</em></p>
<pre><code class="language-Python"># 결측치 대체: 최빈값
# mode 는 최빈값을 의미
# df3 의 Interaction type 컬럼을 fillna함수를 이용하여 채워주되, mode() 함수를 사용하여 최빈값으로 넣어줌
# mode 함수는 시리즈를 output으로 가집니다. 
# 따라서,[0]을 통해 시리즈 중 단일값을 가져와야 합니다. 
df3 = df3[&#39;Interaction type&#39;].fillna(df3[&#39;Interaction type&#39;].mode()[0])
df3.isnull().sum()

# 결측치 대체: 평균값
df[&#39;sw&#39;] = df[&#39;sw&#39;].fillna(df[&#39;sw&#39;].mean())
df.isnull().sum()

# 결측치 대체: 중간값
# inplace=True 로 하면 원본 데이터가 바뀌게 됩니다.
df[&#39;sw&#39;] = df[&#39;sw&#39;].fillna(df[&#39;sw&#39;].median())
df.isnull().sum()

# 결측치 대체: 바로 위 값으로 대체
df[&#39;sw&#39;] = df[&#39;sw&#39;].fillna(method=&#39;ffill&#39;)
df.isnull().sum()

# 결측치 대체: 바로 아래 값으로 대체
df[&#39;sw&#39;] = df[&#39;sw&#39;].fillna(method=&#39;bfill&#39;)
#df.isnull().sum()

# 결측치 대체: group by 값으로 대체
# 사전 데이터 확인
df.groupby(&#39;Is Amazon Seller&#39;)[&#39;sw&#39;].median()

# group by한 데이터를 데이터프레임의 컬럼으로 추가하기 위해 
# transform 함수 사용
df[&#39;sw&#39;] = df[&#39;sw&#39;].fillna(df.groupby(&#39;Is Amazon Seller&#39;)[&#39;sw&#39;].transform(&#39;median&#39;))
df.isnull().sum()</code></pre>
<h3 id="이상치-식별--처리"><em>이상치 식별 &amp; 처리</em></h3>
<blockquote>
<p><em>*<em>① Z-score (StandardScaler)
② IQR(Interquartile Range) *</em></em></p>
</blockquote>
<p><em>그 외) Isolation Forest, DBScan 등 (필요시 서치)</em></p>
<h4 id="z-score">Z-score</h4>
<blockquote>
<p><em><strong>정규 분포 환경**</strong>에서 데이터의 표준 편차를 이용해 탐지하는 방법
scikit-learn 라이브러리 지원</em></p>
</blockquote>
<pre><code class="language-python">df = pd.read_csv(&quot;p.csv&quot;)

# string -&gt; float -&gt; int 
df[&#39;sw&#39;] = df[&#39;Shipping Weight&#39;].str.split().str[0]
df[&#39;sw&#39;] = pd.to_numeric(df[&#39;sw&#39;] , errors=&#39;coerce&#39;).fillna(0.0).astype(int)

# z-score 를 적용할 컬럼 선정
df1 = df[[&#39;sw&#39;]]

# 표준화 진행
# 표준화 :  평균을 0으로, 표준 편차를 1로 
# 데이터를 0을 중심으로 양쪽으로 데이터를 분포시키는 방법
# 표준화를 하게 되면 각 데이터들은 평균을 기준으로 얼마나 떨여져 있는지를 나타내는 값으로 변환
scale_df = StandardScaler().fit_transform(df1)

merge_df = pd.concat([df1, pd.DataFrame(StandardScaler().fit_transform(df1))],axis=1)
merge_df.columns = [&#39;Shipping Weight&#39;, &#39;zscore&#39;]

# 이상치 감지 
# Z-SCORE 기반, -3 보다 작거나 3보다 큰 경우를 이상치로 판별 
mask = ((merge_df[&#39;zscore&#39;]&lt;-3) | (merge_df[&#39;zscore&#39;]&gt;3))

# mask 메소드 사용
strange_df = merge_df[mask]

# 총 55 건 탐지 
strange_df.count()</code></pre>
<h4 id="iqr">IQR</h4>
<blockquote>
<p><em><strong>정규 분포 환경이 아닐 때 사용</strong>
데이터의 25 ~ 75% 범위는 정상, 이외 값은 이상치로 간주</em></p>
</blockquote>
<p><em>Box Plot
IQR(Q3) : 제 3사분위 값 - 제 1사분위 값(Q1)</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/ded45666-e44c-4d54-b7a1-79eb92e84d9f/image.png" alt=""></p>
<pre><code class="language-python">df = pd.read_csv(&quot;p.csv&quot;)

# string -&gt; float -&gt; int 
df[&#39;sw&#39;] = df[&#39;Shipping Weight&#39;].str.split().str[0]
df[&#39;sw&#39;] = pd.to_numeric(df[&#39;sw&#39;] , errors=&#39;coerce&#39;).fillna(0.0).astype(int)

# 이상치를 감지할 컬럼 선정
df1 = df[[&#39;sw&#39;]]

# Q3, Q1, IQR 값 구하기
# 백분위수를 구해주는 quantile 함수를 적용하여 쉽게 구할 수 있음
# 데이터프레임 전체 혹은 특정 열에 대하여 모두 적용이 가능

q3 = df1[&#39;sw&#39;].quantile(0.75) 
q1 = df1[&#39;sw&#39;].quantile(0.25)

iqr = q3 - q1
q3, q1, iqr

# 이상치 판별 및 dataframe 저장 
# Q3 : 100개의 데이터로 가정 시, 25번째로 높은 값에 해당합니다.
# Q1 : 100개의 데이터로 가정 시, 75번째로 높은 값에 해당합니다.
# IQR : Q3 - Q1의 차이를 의미합니다.
# 이상치 : Q3 + 1.5 * IQR보다 높거나 Q1 - 1.5 * IQR보다 낮은 값을 의미

def is_outlier(df1):
    score = df1[&#39;sw&#39;]
    if score &gt; 7 + (1.5 * 6) or score &lt; 1 - (1.5 * 6):
        return &#39;이상치&#39;
    else:
        return &#39;이상치아님&#39;

# apply 함수를 통하여 각 값의 이상치 여부를 찾고 새로운 열에 결과 저장
df1[&#39;이상치여부&#39;] = df1.apply(is_outlier, axis = 1) # axis = 1 지정 필수

# IQR 방식으로 구한 이상치 개수는 349 개 
df1.groupby(&#39;이상치여부&#39;).count()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 전처리 & 시각화 3]]></title>
            <link>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-3</link>
            <guid>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-3</guid>
            <pubDate>Mon, 17 Nov 2025 11:55:46 GMT</pubDate>
            <description><![CDATA[<p><em>해당 세션을 진행하는 동안에는 Anaconda Jupyter Notebook 으로 진행한다.</em></p>
<p><em>오늘은 SQL 의 JOIN 기능과 같은 Pandas 함수를 배웠다
간단히 이론부분만 정리하고 실습은 노트북 환경에서 진행한다</em></p>
<blockquote>
<p><em>각 라이브러리의 함수에 대한 모든 문법을 외울 수는 없다</em>
<strong><em>어떠한 기능을 필요로 할 때,
어떤 라이브러리에 어떤 함수를 사용하면 되는지를 알아두자</em></strong></p>
</blockquote>
<hr>
<h2 id="merge"><em>MERGE</em></h2>
<blockquote>
<p><em><strong>SQL 의 JOIN 과 같은 기능
Pandas에 내장된 함수
테이블의 공통컬럼을 기준으로 병합</strong>한다</em></p>
</blockquote>
<p><em>주요 파라미터는 다음과 같다.</em>
 <em>: on
 : how
 : left / right on
 : <strong>sort : (병합 후) 인덱스 정렬 여부</strong>
 : <strong>suffixes : 중복 컬럼 이름 처리</strong>
 : indicator</em></p>
<pre><code class="language-Python"># how, on 옵션을 통해 구체적으로 지정 가능
merge_df = pd.merge
(df2,df3, how=&#39;inner&#39;, left_on=&#39;Customer ID&#39;, right_on=&#39;user id&#39;)</code></pre>
<h2 id="join"><em>JOIN</em></h2>
<blockquote>
<p><em>SQL 의 JOIN 과 *<em>유사
df(데이터프레임)의 메소드
인데스 기준으로 병합한다
*</em></em></p>
</blockquote>
<p><em>주요 파라미터는 다음과 같다.</em>
 _: on
 : how
 : lsuffix / rsuffix : 이름 같은 컬럼, 문자열 지정 부여
 : <strong>sort : (병합 후) 인덱스 정렬 여부</strong>
 : <strong>suffixes : 중복 컬럼 이름 처리</strong></p>
<pre><code class="language-Python"># join시 이름이 같은 컬럼이 있을 경우, 옵션으로 설정하여 조인 가능
df.join(df2)
# 위 코드는 오류가 남
df.join(df2,how=&#39;left&#39;, lsuffix=&#39;1&#39;, rsuffix=&#39;2&#39;)
# 동일명 컬럼 지정 후 오류발생 x</code></pre>
<hr>
<h2 id="concat"><em>CONCAT</em></h2>
<blockquote>
<p><em>SQL 의 UNION 과 같은 기능
DF(데이터프레임) 혹은 특정 축을 연결하는데 사용</em></p>
</blockquote>
<p><em>주요 파라미터는 다음과 같다.
 : <strong>axis : 수직(=0) / 수평(=1)결합</strong>
 : join : 조인방식
 <strong>: join_axes : 조인 축 지정</strong>
 <strong>: keys : df 축이름 지정</strong>
 : ignore_index : 인덱스 재배열</em></p>
<pre><code class="language-Python"># 수직결합
pd.concat([df2, df3], axis=0, ignore_index=True, join=&#39;inner&#39;)

# 수평결합
pd.concat([df2, df3], axis=1, ignore_index=True, join=&#39;inner&#39;)</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 전처리 & 시각화 2]]></title>
            <link>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-2</link>
            <guid>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-2</guid>
            <pubDate>Fri, 14 Nov 2025 11:38:32 GMT</pubDate>
            <description><![CDATA[<p><em>데이터 전처리 강의 수강 중, 세션이 오늘부터 진행되었다.
직접 작성해보면서 복습한다는 생각으로 작성하려한다.</em></p>
<p><em>이전 VSC 내 Jupyter Notebook 실습 환경을 구성하여 진행하였고,
해당 세션을 진행하는 동안에는 Anaconda Jupyter Notebook 으로 진행한다.</em></p>
<p><em>각 라이브러리의 함수에 대한 모든 문법을 외울 수는 없다</em>
<strong><em>어떠한 기능을 필요로 할 때,
어떤 라이브러리에 어떤 함수를 사용하면 되는지를 알아두자</em></strong></p>
<hr>
<h2 id="python--library"><em>Python &amp; Library</em></h2>
<blockquote>
<p><em>일전 Python 장점을 얘기한 적이 있었다.
 <strong>: 수많은 커뮤니티 &amp; 라이브러리(모듈 집합체) 존재</strong></em></p>
</blockquote>
<p><em>그에 따라 Python을 사용하는 유저는 언제든지 필요에 따라,
기존 라이브러리를 호출하여 사용이 가능하다.</em></p>
<hr>
<h3 id="import-호출"><em>import (호출)</em></h3>
<pre><code class="language-Python">import 라이브러리 명 as 별칭</code></pre>
<p><em>라이브러리를 호출하는 명령어로, 기본 구문은 위와 같다.
<strong>오늘은 pandas 와 time 라이브러리를 사용할 예정</strong>으로 호출해준다.</em></p>
<blockquote>
<p>_Pandas
 : R(프로그래밍 언어) 의 데이터프레임을 참고하여 만듬
 : <strong>데이터 프레임은 열, 행, 인덱스로 구성된 테이블 형식</strong>이다
_</p>
</blockquote>
<pre><code class="language-Python">import pandas as pd
import time</code></pre>
<p><em>Jupyter Notebook 환경에서 최초 import를 진행하면, 해당 ipynb 파일에서는 더 이상 호출 할 필요가 없다.
참고하도록 하자</em></p>
<hr>
<h3 id="✔️-import-from">✔️ <em>import? from?</em></h3>
<p><em>라이브러리를 호출할 때 <code>import</code> 를 사용한다고 했다.
<code>from</code> 의 경우, <strong>라이브러리의 특정 함수를 호출하고자 할 때</strong> 사용한다.</em></p>
<pre><code class="language-python">from matplotlib.pyplot as plt        # matplotlib 라이브러리의 pyplot 함수를 호출</code></pre>
<p><em>그럼 <code>import</code>로 호출하면 되지않나? 라고 생각하겠지만,
코드가 너무 길어지게 된다.</em></p>
<hr>
<h3 id="라이브러리-지원함수"><em>라이브러리 지원함수</em></h3>
<blockquote>
<p><em>라이브러리. 이후 tab 을 하면 사용할 수 있는 함수리스트를 볼 수 있다.</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/682e6025-0c46-46c1-ae5e-0d79593d3cd9/image.png" alt=""></p>
<h3 id="magic-command"><em>Magic Command</em></h3>
<blockquote>
<p><em>IPython Kernel 에서 제공되는 명령어
<code>%, %%</code> 를 통해 실행</em></p>
</blockquote>
<p><em>IPython 커널의 경우,
Jupyter Notebook 및 Lab과 같은 웹 기반 대화형 환경을 위한 표준 커널이다.
즉, Jupyter 환경에서만 사용가능한 특수 커맨드라고 생각하자</em></p>
<p><em>자주쓰이는 커맨드 중 time (코드 실행시간 측정) 을 사용해보았다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/49603f5b-8384-43b9-88a0-f45613da66a3/image.png" alt=""></p>
<p><em><code>%%time</code> : 셀 전체 수행 후 소요 시간</em></p>
<h2 id="eda-시작"><em>EDA 시작</em></h2>
<p><em>EDA는 Exploratory Data Analysis 의 약자
데이터를 이해하기 위해, <strong>요약 통계와 시각화를 활용</strong>하여
<strong>데이터의 주요 특성, 변수 간의 잠재적 관계, 패턴, 이상치 등을 찾아내는 초기 분석 단계이다.</strong></em></p>
<p><em>즉 본격적인 데이터 분석을 하기 위해 데이터를 체크한다는 개념이다</em></p>
<h3 id="데이터-프레임-만들기"><em>데이터 프레임 만들기</em></h3>
<blockquote>
<p><em>데이터프레임은 테이블 형태로 만들 수 있고,
리스트와 딕셔너리 활용할 수 있다.</em></p>
</blockquote>
<pre><code class="language-Python">data1 = [[&#39;Choi&#39;,22],[&#39;Kim&#39;,48],[&#39;Joo&#39;,32]]
df4 = pd.DataFrame(data1, columns=[&#39;Name&#39;,&#39;Age&#39;])

data2 = {&#39;Name&#39; : [&#39;Choi&#39;,&#39;Kim&#39;,&#39;Joo&#39;],&#39;Age&#39;:[22,48,32]}
df5 = pd.DataFrame(data2)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/e1cb655c-8846-410b-85d9-ef513072dc33/image.png" alt=""></p>
<p><em>리스트 및 딕셔너리로 이루어진 데이터를 데이터프레임(테이블)화 한 것을 볼 수 있다.</em></p>
<p><em>추가적으로,
Display 내장함수를 쓰면 여러 개의 데이터 셋을 볼 수 있다.
<code>display(df1, df2 ...)</code></em></p>
<h3 id="csv-파일을-통한-load"><em>CSV 파일을 통한 LOAD</em></h3>
<blockquote>
<p><em>pandas의 read_csv 함수를 이용해 읽어온 파일을 출력한다.</em>
<code>pd.read_csv(파일명)</code></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/7e6a04ff-8aed-4307-a9d2-d5bc74c656c7/image.png" alt="">
<img src="https://velog.velcdn.com/images/da_leesunho/post/6ea338a6-9101-4074-9d2d-bdaf02208af1/image.png" alt=""></p>
<h3 id="처음마지막-기준-5줄-출력"><em>처음/마지막 기준 5줄 출력</em></h3>
<blockquote>
<p>SQL Limit 절과 비슷, 기본 값 5로 지정
<code>df.head() / df.tail()</code></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/0fff22a4-dcbe-4743-9f30-c3ba5fbad9dd/image.png" alt=""></p>
<h3 id="구조-파악하기"><em>구조 파악하기</em></h3>
<blockquote>
<p><em>행의 갯수를 출력</em>
<code>len(df)</code></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/914f5e35-531c-4377-bc02-d88a4c5573ae/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL_Programmers 코딩 테스트 5]]></title>
            <link>https://velog.io/@da_leesunho/SQLProgrammers-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-5</link>
            <guid>https://velog.io/@da_leesunho/SQLProgrammers-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-5</guid>
            <pubDate>Thu, 13 Nov 2025 01:09:22 GMT</pubDate>
            <description><![CDATA[<BR>
학습사이트 > https://school.programmers.co.kr/
</BR>



<hr>
<h3 id="경기도에-위치한-식품창고-목록-출력하기">경기도에 위치한 식품창고 목록 출력하기</h3>
<blockquote>
<p><em>FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, &#39;N&#39;으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.</em></p>
</blockquote>
<pre><code class="language-SQL">SELECT
    WAREHOUSE_ID,
    WAREHOUSE_NAME,
    ADDRESS,
    CASE WHEN FREEZER_YN IS NULL THEN &#39;N&#39;
    ELSE FREEZER_YN END AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE &#39;%경기도%&#39;
ORDER BY WAREHOUSE_ID ASC</code></pre>
<p><em>Case When 구문을 통해 Null 대체 값을 지정해주어야하는 문제였다.
또한 <strong>Null처리함수 IFNULL</strong> 을 사용할 수도 있다.</em></p>
<pre><code class="language-SQL">SELECT IFNULL(FREEZER_YN, &quot;N&quot;)        # 해당 컬럼이 NULL 일 경우 문자열 N으로 표기</code></pre>
<p><em>하지만 INFULL 함수는 MYSQL에서만 사용이 가능하다
<strong>모든 DBMS에서 사용할 수 있는 COALESCE 함수를 기억해두자</strong></em></p>
<pre><code class="language-SQL">SELECT COALESCE(FREEZER_YN, &#39;N&#39;)        # 해당 컬럼이 NULL 일 경우 문자열 N으로 표기</code></pre>
<hr>
<h3 id="datetime-에서-date로-형-변환">DATETIME 에서 DATE로 형 변환</h3>
<p><em>ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.
날짜 컬럼은 시각(시-분-초)을 제외한 날짜(년-월-일)만 보여주세요</em></p>
<pre><code class="language-SQL">SELECT
    ANIMAL_ID,
    NAME,
    DATE_FORMAT(DATETIME, &#39;%Y-%m-%d&#39;) AS &#39;날짜&#39;
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
;
&#39;&#39;&#39;
SELECT
    ANIMAL_ID,
    NAME,
    SUBSTR(DATETIME, 1, 10) AS  &#39;날짜&#39;
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
;
&#39;&#39;&#39;</code></pre>
<p><em>두 가지 방법으로 풀어보았다.
<strong>1) DATE_FROMAT 함수를 이용하여 날짜 형식 변환</strong>
<strong>2) SUBSTR 함수를 이용하여 앞에서부터 지정한 문자열 추출</strong></em></p>
<h3 id="흉부외과-또는-일반외과-의사-목록-출력하기">흉부외과 또는 일반외과 의사 목록 출력하기</h3>
<blockquote>
<p><em>DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.</em></p>
</blockquote>
<pre><code class="language-SQL">SELECT
    DR_NAME,
    DR_ID,
    MCDP_CD,
    DATE_FORMAT(HIRE_YMD, &#39;%Y-%m-%d&#39;) AS HIRE_YMD    # 문제에서 제시한 조건(날짜형식)을 위해 DATE_FORMAT 함수 사용
FROM DOCTOR
WHERE MCDP_CD IN (&#39;CS&#39;, &#39;GS&#39;)
ORDER BY HIRE_YMD DESC, DR_NAME ASC</code></pre>
<p><em>문제를 끝까지 읽는 습관을 들여야겠다..
날짜형식 맞춤 조건을 보지 못해서 바로잡는데 오래걸렸다</em></p>
<h3 id="가격이-제일-비싼-식품의-정보-출력하기">가격이 제일 비싼 식품의 정보 출력하기</h3>
<blockquote>
<p><em>FFOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.</em></p>
</blockquote>
<pre><code class="language-SQL">SELECT *
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1

&#39;&#39;&#39;
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE =
        (SELECT
            MAX(PRICE)
        FROM FOOD_PRODUCT
        )
&#39;&#39;&#39;</code></pre>
<p><em>처음엔 &#39;너무 쉽다&#39; 하면서 첫 번째 쿼리(<strong>가격 내림차 순 &amp; LIMIT 활용</strong>) 으로 풀었다.
이후 1분 정도 다른 방법을 고민하다가 <strong>중첩 서브쿼리</strong>를 사용해 풀어보았다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 전처리 & 시각화 1]]></title>
            <link>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-1</link>
            <guid>https://velog.io/@da_leesunho/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%8B%9C%EA%B0%81%ED%99%94-1</guid>
            <pubDate>Wed, 12 Nov 2025 09:01:31 GMT</pubDate>
            <description><![CDATA[<p><em>데이터 전처리 &amp; 시각화 강의를 수강하고,
배운 내용 및 실습을 진행한 부분을 작성하고자 한다.</em></p>
<p><em>이전 Jupyter Notebook 실습 환경을 구성했는데, 해당 환경에서 진행한다.</em></p>
<hr>
<h2 id="pandas">Pandas</h2>
<blockquote>
<p><em>Python 내 라이브러리
표 형태(관계형) 의 데이터 분석을 할 때 가장 많이 사용 됨
Excel, csv, tsv, pickle 등과 함께 사용할 수 있음</em></p>
</blockquote>
<p><em><strong>데이터의 결측치를 쉽게 처리</strong>할 수 있고,
<strong>데이터의 시각화 및 문자열 및 날짜, 시간 처리도 간편</strong>하다.</em></p>
<p><em>Jupyter Note 터미널에서,
<code>pip install pandas</code> 를 통해 설치가 가능하다.</em></p>
<h3 id="라이브러리-불러오기">라이브러리 불러오기</h3>
<blockquote>
<p><em>보통 별칭은 &quot;pd&quot; 로 사용한다.</em></p>
</blockquote>
<pre><code class="language-Python">import pandas as pd</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/5c7ca56e-88dc-43f6-9e2b-3e6a29468992/image.png" alt=""></p>
<h3 id="데이터-셋-불러오기">데이터 셋 불러오기</h3>
<blockquote>
<p><em>현재 사용 가능한 데이터셋이 없기에, &#39;seaborn&#39; 라이브러리를 가져온다.
이후 &#39;tips&#39;라는 이름을 가진 데이터를 가져와 data 변수에 지정</em></p>
</blockquote>
<pre><code class="language-Python">import seaborn as sns
data = sns.load_dataset(&#39;tips&#39;)
data</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/c6577a0a-4a37-4cca-ad65-8281858015c1/image.png" alt=""></p>
<h3 id="데이터-불러오기저장하기">데이터 불러오기/저장하기</h3>
<blockquote>
<p><em>to_csv( ) 메소드를 통해 데이터를 파일화
( ) 안에는 경로\파일명 을 지정하면 된다.</em></p>
</blockquote>
<pre><code class="language-Python"># to_csv 메소드(데이터를 저장)
data.to_csv(&quot;tips_data.csv&quot;)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/d5a3e61e-1a2b-4785-a0ec-9bfde2f42842/image.png" alt="">
<img src="https://velog.velcdn.com/images/da_leesunho/post/95f6d200-1d83-40ef-b1fb-c2c0e4f066ce/image.png" alt="">
<em>데이터 전치리를 완료하고 나서, 위와 같이 파일을 저장할 수 있다.</em></p>
<blockquote>
<p>pandas에 내장된 read_csv 함수를 통해 데이터 불러오기</p>
</blockquote>
<pre><code class="language-Python">df=pd.read_csv(&quot;tips_data.csv&quot;)
df</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/6ea27409-e133-41e9-8ef3-2eba6921b1ed/image.png" alt=""></p>
<p><em>불러오기를 진행했을 때 새로운 컬럼(&#39;Unnamed:0&#39;) 이 생성된 것을 볼 수 있다.
파일 저장 시 index 생성여부에 대해 지정 해 줄 수 있는데,
<strong>기본 값이 True 이므로 index 가 생성된 것</strong>이다.</em></p>
<p><em>저장 시 index=False 를 통해 인덱스 생성이 되지 않게 해보자</em></p>
<pre><code class="language-Python">data.to_csv(&quot;tips_data.csv&quot;, index=False)
df=pd.read_csv(&quot;tips_data.csv&quot;)
df</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/4f37b978-69f6-4557-a17d-62fbb49a044e/image.png" alt=""></p>
<p><em>반대로 불러오기 시에도 가능하다.</em></p>
<pre><code class="language-Python">data.to_csv(&quot;tips_data.csv&quot;)
df=pd.read_csv(&quot;tips_data.csv, index_col = 0&quot;)
df</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/374c4f24-d815-44c8-9159-4197c6b44bf6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 컴프리헨션 & 예외 처리 (1/2)]]></title>
            <link>https://velog.io/@da_leesunho/Python-%EC%BB%B4%ED%94%84%EB%A6%AC%ED%97%A8%EC%85%98-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC-12</link>
            <guid>https://velog.io/@da_leesunho/Python-%EC%BB%B4%ED%94%84%EB%A6%AC%ED%97%A8%EC%85%98-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC-12</guid>
            <pubDate>Tue, 11 Nov 2025 10:50:37 GMT</pubDate>
            <description><![CDATA[<p><em>오늘 배우게 된
Python - <strong>컴프리헨션(Comprehension) 과 예외 처리</strong></em></p>
<p><em>바로 복습을 해야 할 정도로 어려웠다.</em>
<em>그래서 이 전 과정은 잠깐 뛰어 넘고, 복습해보려고 한다.</em></p>
<p><em>이론 먼저 진행해보고,
익숙해지기 위해 실습도 따로 진행해볼 예정이다</em></p>
<hr>
<p><em>세 줄 요약 &gt;</em>
_1) 컴프리헨션(comprehension) 
2) 파이써닉 코딩을 위함
3) 너무 복잡해지면 쓰지마라
_</p>
<hr>
<p><em>환경 : VSC (Visual Studio Code)</em></p>
<p><em>** 코드 실행은 .py 파일을 실행한다는 개념으로 터미널에서 실행</em></p>
<h2 id="컴프리헨션-comprehension">컴프리헨션 (Comprehension)</h2>
<blockquote>
<p><em>짧게 한 줄로 작성할 수 있는 파이썬의 문법
간결성 과 가독성을 확보
for 문보다 미세하게 빠른 경우가 많음 (내부루프 활용)
<strong>식 자체가 너무 복잡해지면 사용하면 안 됨</strong></em></p>
</blockquote>
<p><em>저 영단어를 처음 들어봤다.. 공부 필요성을 느끼며 사전적의미를 검색해봤다.
 : <strong>이해, 포함, 독해 / 이해력(문맥에 따라)</strong>
사전적 의미와 설명이 유의미한 연관이 있는지는 모르겠다.</em></p>
<p><em>일단, 어느정도 개념은 파악했으니 예문을 통해 확인해보자</em></p>
<pre><code class="language-Python"># 길이가 5인 리스트 생성
# 0~5까지 순회하면서 각 인덱스 값에 x2 를 진행
size = 5
arr = [0]*size
for i in range(len(arr)):
    arr[i]=i*2
print(arr)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/a76e9798-d03d-423b-88f7-352996a21090/image.png" alt="">
<em><strong>리스트 선언</strong>, <strong>for~in range 구문을 통해 각각의 인덱스에 값을 할당</strong>한 코드이다.
다음 코드를 보자.</em></p>
<pre><code class="language-Python">size=5
arr=[i*2 for i in range(len(arr))]
print(arr)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/66c0f79d-90f3-4e3e-bb18-c07b96b5bac4/image.png" alt="">
<em>똑같은 과정과 결과를 목표로 작성한 코드이다.
얼핏봐도, 코드 행 수가 줄었다.
이처럼 <strong>&#39;선언과 할당, 조건&#39;의 순차적인 작업을 일원화하여 짧고 간략하게 작성하는 것</strong>이다.</em></p>
<blockquote>
<p><em>기본 구조는 다음과 같다.
→ <strong>변수를 활용한 값(표현식)</strong> for <strong>변수</strong> in <strong>반복대상</strong> if <strong>조건</strong></em></p>
</blockquote>
<p><em>조건을 사용한 추가 예시를 하나 더 보도록 하자</em></p>
<pre><code class="language-Python">size=[i for i in range(1,11)]    # size 리스트의 선언과 할당까지 진행
print(size)
arr=[l for l in range(len(size)) if l%2==0] # arr 리스트의 선언과 할당, 조건을 진행
print(arr)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/e707800b-17d1-4fea-85fa-56e96ebbc883/image.png" alt=""></p>
<p><em>어느정도 작성하다보니 익숙해졌다.
그런데 자료구조가 &#39;리스트&#39;인 경우를 제외하고, 다른 자료구조도 사용이 가능할까?
마찬가지로 가능하다.</em></p>
<blockquote>
</blockquote>
<p><em><strong>딕셔너리 컴프리헨션</strong>
 : {키 표현식: 값 표현식  for 변수 in 반복대상  if 조건}
<strong>세트(집합) 컴프리헨션</strong>
 : {표현식  for 변수 in 반복대상  if 조건}</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 자료구조]]></title>
            <link>https://velog.io/@da_leesunho/Python-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@da_leesunho/Python-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Mon, 10 Nov 2025 08:44:53 GMT</pubDate>
            <description><![CDATA[<p><em>네 줄 요약 &gt;</em>
_1) 리스트와 튜플은 시퀀스(순서가 있는) 자료형이며, 
2) 튜플은 수정 불가
3) 딕셔너리는 키와 값의 쌍으로 이루어진 자료형
4) 자료형 별 메소드 확인하자 (특히 dictionary.pop)
_</p>
<hr>
<p><em>환경 : VSC (Visual Studio Code)</em></p>
<p><em>Python 자료구조에 대해 학습해보자.
** 코드 실행은 .py 파일을 실행한다는 개념으로 터미널에서 실행</em></p>
<h2 id="리스트-list">리스트 (List)</h2>
<blockquote>
<p><em>여러 값을** 순서대로 저장할 수 있는** 자료형 (Data Type)
<strong>대괄호 [ ]</strong> 를 사용
<strong>수정 &amp; 삭제 가능 (Mutable)</strong></em></p>
</blockquote>
<pre><code class="language-Python">list_a = [&quot;apple&quot;, &quot;banana&quot;, 56, &quot;abc&quot;, &quot;leesunho&quot;, &quot;data&quot;, &quot;Analyst&quot;]
print(list_a)
print(list_a[0])
print(list_a[-1])
print(list_a[0:7:2])        # 0~6(7-1) 인덱스까지 두 칸 간격의 데이터 출력</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/22c9d54d-34a5-4cbc-a977-b00947dce120/image.png" alt=""></p>
<p><em>리스트 자료형에 <strong>자주 사용하는 메소드</strong>를 학습하고 알아두자</em></p>
<table>
<thead>
<tr>
<th>메소드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>append(a)</strong></td>
<td><strong>맨 뒤에 추가</strong></td>
</tr>
<tr>
<td>insert(i,a)</td>
<td>지정 위치에 추가</td>
</tr>
<tr>
<td>remove(a)</td>
<td>해당 요소 삭제</td>
</tr>
<tr>
<td><strong>pop()</strong></td>
<td><strong>마지막 요소 꺼내기</strong></td>
</tr>
<tr>
<td>sort()</td>
<td>오름차 순 정렬</td>
</tr>
</tbody></table>
<h3 id="✔️-메소드method-">✔️ <em>메소드(Method) ?</em></h3>
<p><em>Object(객체) 와 연관되어 사용된다.
→ &quot; . &quot;으로 연결되어 있어야 한다</em></p>
<p><em>str, float, list 등 자료형은 모두 객체
ex&gt; .split() , .append 등</em></p>
<h3 id="✔️-메소드-vs-함수">✔️ <em>메소드 vs 함수</em></h3>
<p>_ 함수는 독립적으로 정의 → 이름만으로 호출이 가능함
그러나 메소드는 이름만으로 호출되지 않음.
정의된 클래스와 연관되어 호출이 가능하다_</p>
<p><em>즉 메소드는 클래스 내에서 정의되므로, 해당 클래스에 종속된다.</em></p>
<h3 id="✔️-pop">✔️ <em>pop()</em></h3>
<p><em>해당 메소드의 실행결과를 보자.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/723d0f96-f580-4376-9ebc-5d0732c73385/image.png" alt=""></p>
<p>_Python 실행 시 동작 과정은, <strong>위에서부터 아래로 진행</strong>된다.</p>
<p>1) 첫 번째 print 문 : list_a 의 리스트가 출력
2) 두 번째 print(pop) 문 : 리스트의 마지막 자료 출력
3) 마지막 print 문 : 마지막 자료가 빠진 리스트 출력_</p>
<p><em>다음 실행 결과를 보자</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/8892105a-b8fe-46fe-b4d9-2ecc9c4fe21b/image.png" alt=""></p>
<p><em>결론적으로
pop() 메소드는 단순히 마지막 데이터를 추출하여 리스트에서 제거하는게 아닌,
추출하여 <strong>재사용을 위한 용도</strong>로도 사용할 수 있다.</em></p>
<hr>
<h2 id="튜플-tuple">튜플 (Tuple)</h2>
<blockquote>
<p><em><strong>변경이 불가능한 리스트</strong>
<strong>소괄호 ( )</strong> 를 사용
<strong>수정 &amp; 삭제 불가능 (Immutable)</strong>
→ 데이터 보호 목적</em></p>
</blockquote>
<pre><code class="language-Python">a = (&quot;apple&quot;, &quot;banana&quot;, 56, &quot;abc&quot;, &quot;leesunho&quot;, &quot;data&quot;, &quot;Analyst&quot;)
print(type(a))
print(a)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/5aa7913b-86d0-4194-886e-25e0217664ec/image.png" alt=""></p>
<h3 id="list-vs-tuple">List vs Tuple</h3>
<ul>
<li><em>변경 가능 vs 불가능</em></li>
<li><em>실행 속도 : 약간 느림 vs 빠름</em></li>
<li><em>활용 예시 : 학생 점수 목록 vs 좌표, 고정 데이터</em></li>
</ul>
<hr>
<h2 id="딕셔너리-dictionary">딕셔너리 (Dictionary)</h2>
<blockquote>
<p>_키와 값의 쌍으로 이루어진 자료형
순서가 (의미) 없다
중괄호 { } 로 선언
키로 접근
_</p>
</blockquote>
<pre><code class="language-Python">student = {
    &quot;name&quot; : &quot;Lee sun ho&quot;,
    &quot;age&quot; : &quot;31&quot;,
    &quot;job&quot; : &quot;da&quot;
    }
print(type(student))
print(student)
student[&quot;name&quot;] = &quot;sun ho LEE&quot;      # name 키의 값을 변경
print(student)
student[&quot;grade&quot;] = 95               # 현재 없는 grade 키에 95 지정
print(student)
print(len(student))                 # student 딕셔너리의 키 개수 구하기</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/1c1cdde3-8aaf-40ed-b623-2b4c197a0d02/image.png" alt=""></p>
<p>딕셔너리의 주요 메소드는 다음과 같다.</p>
<table>
<thead>
<tr>
<th>메소드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>keys()</td>
<td>모든 키 가져오기</td>
</tr>
<tr>
<td>values()</td>
<td>모든 값 가져오기</td>
</tr>
<tr>
<td>items()</td>
<td>키와 값 모두 가져오기</td>
</tr>
<tr>
<td>get(key)</td>
<td>특정 키의 값 가져오기</td>
</tr>
<tr>
<td>pop(key)</td>
<td>특정 키 삭제</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/15b8a1f7-a659-4282-9958-655550195e40/image.png" alt=""></p>
<h3 id="✔️-_dictionary-키-제거-방법-_">✔️ _Dictionary 키 제거 방법 _</h3>
<p><em>1) pop 메소드 이용</em></p>
<pre><code class="language-Python">student = {
    &quot;name&quot; : &quot;Lee sun ho&quot;,
    &quot;age&quot; : &quot;31&quot;,
    &quot;job&quot; : &quot;da&quot;
    }
student.pop(&quot;age&quot;)
print(student)        </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/35aba2e3-580b-40ea-9d4d-0701b5acdae0/image.png" alt=""></p>
<blockquote>
<p><em>만약, 딕셔너리의 없는 키를 pop 으로 제거한다면?</em>
<em>→ 당연히 에러가 발생한다. 확인 해보자</em></p>
</blockquote>
<pre><code class="language-python">student = {
    &quot;name&quot; : &quot;Lee sun ho&quot;,
    &quot;age&quot; : &quot;31&quot;,
    &quot;job&quot; : &quot;da&quot;
    }
print(student)
student.pop(&quot;id&quot;)           ## 없는 키 값 pop 메소드 사용 
print(student)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/ab472c6a-8c9c-43ed-99f8-614816e5807a/image.png" alt="">
<em>해당 error 는 딕셔너리를 다룰 때 실무에서도 많이 발생하는 문제라고 한다.
<strong>당연히 에러가 나서 동작 안하는게 맞지 않나??</strong> 라고 생각하겠지만,
에러가 발생하면 실행은 아예 중단이 된다.</em></p>
<blockquote>
</blockquote>
<p><em><strong>없는 키 값이라면서 에러 없이 진행하는 방법은 뭐가 있을까?</strong>
<strong><span style = "color:red">pop (&quot;키&quot; , None) 을 사용</strong></span>하는 것이다.
삭제하려는 키가 없는 키라면, None 을 던지는 것이다.
정확히는 NonType의 None 이라는 값의 반환하는 것</em></p>
<blockquote>
</blockquote>
<p><em>참고사이트 : <a href="https://docs.python.org/3.14/library/constants.html#None">https://docs.python.org/3.14/library/constants.html#None</a></em></p>
<blockquote>
</blockquote>
<pre><code class="language-python">student = {
    &quot;name&quot; : &quot;Lee sun ho&quot;,
    &quot;age&quot; : &quot;31&quot;,
    &quot;job&quot; : &quot;da&quot;
    }
print(student)
student.pop(&quot;id&quot;, *****None*****)           ## 없는 키 값 pop 메소드 사용 
print(student)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/aeacae9d-c5f5-4d87-b17d-667796b9f6d5/image.png" alt="">
<em>에러코드 발생하지 않고, 아래 print 문까지 출력된 걸 볼 수 있다.
반드시 알아두자</em></p>
<p><em>2) del 함수 이용</em></p>
<pre><code class="language-Python">student = {
    &quot;name&quot; : &quot;Lee sun ho&quot;,
    &quot;age&quot; : &quot;31&quot;,
    &quot;job&quot; : &quot;da&quot;
    }
print(student)
del student[&quot;age&quot;]
print(student)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/09429f9c-3452-427f-9772-995cfb43ba4c/image.png" alt="">
<em>del 함수 사용 시, 없는 키 값이라면 에러 발생한다.
pop 메소드를 통해 삭제하는 방법을 연습하도록 하자</em></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기본 문법 및 자료형]]></title>
            <link>https://velog.io/@da_leesunho/Python</link>
            <guid>https://velog.io/@da_leesunho/Python</guid>
            <pubDate>Mon, 10 Nov 2025 06:38:40 GMT</pubDate>
            <description><![CDATA[<p><em>세 줄 요약 &gt;</em>
_1) print f문자열을 통해 이쁘고 효율적으로 출력하자 (3.6버전부터~)
2) 변수 선언 주의사항 숙지하고,
3) 자료형 (Data Type) 확인 잘하자
_</p>
<hr>
<p><em>환경 : VSC (Visual Studio Code)</em></p>
<p><em>오늘은 Python 기본 문법과 자료형에 대해 학습해 볼 예정이다.
코드 실행은 .py 파일을 실행한다는 개념으로 터미널에서 실행할 것이다.</em></p>
<h2 id="python-실행">Python 실행</h2>
<blockquote>
<p><em>print(&quot;Hello, Python!&quot;)
기본적으로 내장되어있는 출력 함수
→ 문자열은 &quot;&quot;(따옴표)를 통해 표기한다.</em></p>
</blockquote>
<pre><code class="language-Python">print(&quot;Hello, Python!&quot;)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/295384fd-982b-4f27-8482-d5c82808d967/image.png" alt=""></p>
<p><em>파이썬 파일을 저장 후, 터미널에서 실행 할 수 있다.</em>
<code>python [py 파일명]</code></p>
<h3 id="print-f-문자열">print f 문자열</h3>
<blockquote>
<p><em>보다 직관적으로 지정할 수 있게 f&quot;문자열 폼&quot; 형태료 표현 가능하다.
변수를 넣을 위치에는 중괄호 { } 를 사용하여 작성
☆ 변수 개념은 뒤에서!</em></p>
</blockquote>
<pre><code class="language-Python">a = &quot;Hello&quot;
b = &quot;Python!&quot;
print(f&quot;시작해보자! {a},{b}&quot;)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/add6c8f7-79ac-4fdf-9e6d-3e9b5d043083/image.png" alt=""></p>
<hr>
<h2 id="주석-comment">주석 (Comment)</h2>
<blockquote>
<p><em>코드에 설명을 달 때 사용함
실행에 영향을 주지 않음.
&quot;#&quot; 을 사용하여 한 줄을 대상으로, &quot; &#39;&#39;&#39; &quot; 통해 구간을 주석 처리할 수 있다.</em></p>
</blockquote>
<pre><code class="language-Python"># 출력문 실행
print(&quot;Hello, Python!&quot;)     # 코드 오른쪽에서도 사용 가능
&#39;&#39;&#39;
Python 가보자~
&#39;&#39;&#39;</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/0a51ba06-0c02-4c6c-b51d-b3eee6ee5484/image.png" alt=""></p>
<p><em>주석 처리를 할 코드를 블록으로 잡아 *<em>ctrl + / *</em> 입력하면 한 번에 처리 가능하다.</em></p>
<hr>
<h2 id="변수-variable">변수 (Variable)</h2>
<blockquote>
<p><em>값을 지정하여 사용하기 위함 (재활용)
ex&gt; 변수 (바구니) 에 값을 담아 (지정) 하여 필요할 때 재사용을 할 수 있다.</em></p>
</blockquote>
<pre><code class="language-Python">a = &quot;Hello&quot;            # a 라는 변수에, &quot;Hello&quot; 문자열을 지정
b = &quot;Python!&quot;        # b 라는 변수에, &quot;Python!&quot; 문자열을 지정
print(a, b)</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/8220b5f3-5ae8-4cdb-aea1-fc204dd2447c/image.png" alt=""></p>
<p><em><strong><span style = "color:red">변수 선언 시, 주의 사항</span></strong> 이 있다. 익혀두도록 하자</em></p>
<table>
<thead>
<tr>
<th>허용</th>
<th>예시</th>
<th>비고</th>
</tr>
</thead>
<tbody><tr>
<td>영문, 숫자, _</td>
<td>user_name, age1</td>
<td>O</td>
</tr>
<tr>
<td><span style = "color:red"><strong>숫자로 시작</strong></span></td>
<td>1name</td>
<td><span style = "color:red"><strong>X</strong></span></td>
</tr>
<tr>
<td><span style = "color:red"><strong>공백 포함</strong></span></td>
<td>my name</td>
<td><span style = "color:red"><strong>X</strong></span></td>
</tr>
<tr>
<td>대소문자 구분</td>
<td>Name != name</td>
<td>O</td>
</tr>
</tbody></table>
<hr>
<h2 id="자료형-data-type">자료형 (Data Type)</h2>
<blockquote>
<p><em>값의 데이터 타입이라고 생각하자
대표적인 자료형(Data Type) 은 다음과 같다.
→ int (정수), float (실수), str (문자열), bool (논리값)</em></p>
</blockquote>
<pre><code class="language-Python">a = 10
b = 3.14
c = &quot;Sun ho&quot;
d = True

print(type(a))        # type 함수를 통해 변수가 지정하는 데이터의 타입을 확인
print(type(b))
print(type(c))
print(type(d))</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/a5e1e59b-1fc4-4319-b914-d1036445bb23/image.png" alt=""></p>
<p><em>각 변수의 데이터 타입을 확인 할 수 있다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/c233a043-2c6e-472d-a9be-54860116a67e/image.png" alt=""></p>
<hr>
<h2 id="문자열">문자열</h2>
<blockquote>
<p><em>문자열은 문장, 단어 같이 텍스트 데이터를 나타내는데 사용된다.
따옴표(&#39; or &quot;) 감싸져 있다.
또한 위 데이터 타입 도식을 보면, <strong>문자열은 시퀀스 형에 포함</strong>된다.
시퀀스 형(Sequence Type) : <strong>순서가 존재</strong></em></p>
</blockquote>
<pre><code class="language-Python">text = &quot;leesunho&quot;
print(text[0])      # 0 번째 인덱스 &quot;l&quot; 출력
print(text[-1])     # 가장 끝의 인덱스 &quot;o&quot; 출력
print(text[0:4])    # 0 번째 인덱스부터 4-1(3) 인덱스까지 출력
print(text[::-1])   # 문자열 뒤집기</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/35698ba3-a525-4579-bd22-0c946abcfb5a/image.png" alt=""></p>
<h3 id="✔️-인덱스">✔️ <em>인덱스</em></h3>
<p><em><strong>자료의 위치 값</strong> 이라고 생각하자.
Python 의 경우, 문자열의 인덱스가 0부터 시작,
SQL 의 경우, 1부터 시작한다.</em></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 실습 환경 구성]]></title>
            <link>https://velog.io/@da_leesunho/Python-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@da_leesunho/Python-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Fri, 07 Nov 2025 08:24:24 GMT</pubDate>
            <description><![CDATA[<p><em>세 줄 요약 &gt;</em>
_1) 환경 구성 많이 어렵지 않았음
2) <strong>가상환경을 왜 사용하는지 이해 했음</strong>
3) 괜찮은 학습 사이트를 알게 됨 (코딩도장 - <a href="https://dojang.io">https://dojang.io</a>)
_</p>
<hr>
<p><em>파이썬 실습을 위해 편집기 프로그램을 설치했다.</em></p>
<p><em>강의 3회차 까지 진행하면서,
눈으로 보고 이해하는 것과 직접 작성하는 것은 별개라는 걸 느꼈다.</em></p>
<p><em>반드시 설치하는 것을 권장한다. (VSC 를 이용 할 예정)</em>
 공식사이트 &gt;&gt; <a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a></p>
<p>Window 환경기준으로, 다른 OS 구성은 알아서 찾아보자.</p>
<h2 id="visual-studio-code">Visual Studio Code</h2>
<blockquote>
<p>_Visual Studio Code (VSCode)</p>
</blockquote>
<p>1) 마이크로스프트가 만든 무료 코드 편집기
2) 파이썬, 자바스크립트, HTML 등을 지원함_</p>
<h3 id="①-vsc-내-python-설치">① VSC 내 Python 설치</h3>
<p><em>[확장] - python 검색 후 설치
→ 코드실행(ctrl + F5) 가능해짐</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/f716d20e-d048-4554-a840-63603a91b17a/image.png" alt=""></p>
<h3 id="②-작업-폴더-생성">② 작업 폴더 생성</h3>
<p><em>1) 바탕화면 &quot;python_study&quot; 폴더 명 생성</em>
<em>2) VSC [file] - [Open Folder] 로 해당 폴더 열기</em>
_3) [file] - [New Text File] 클릭
→ 앞으로 생성하는 파일은 해당 폴더 내 저장됨</p>
<h3 id="③-가상-환경-생성">③ 가상 환경 생성</h3>
<p>_ 1) [Terminal] - [New Terminal] 클릭하여 터미널 생성_
_ 2) 경로 ~~ 폴더명&gt; 로 되어있는지 확인_
_ 3) 가상 환경 생성하기_</p>
<pre><code class="language-python">python -m venv [가상 환경이름]        -- 폴더 내 [가상환경 이름] 폴더 생성
[가상환경 이름]\Scripts\activate        -- 가상환경 활성화
deactivate        -- 가상환경 비활성화</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/3e0fdf21-80d4-41bd-aa4c-3e45a158920c/image.png" alt=""></p>
<p><em>터미널 프롬프트 시작에 (가상환경 이름) 이 보여야 실행 된 상태다. <strong>(없으면 비활성화 상태)</strong></em></p>
<h3 id="✔️-_span-style--colorred가상환경span-왜-써야함_">✔️ _<span style = "color:red">가상환경</span> 왜 써야함?!_</h3>
<blockquote>
</blockquote>
<p><em>가상환경을 사용하지 않으면 무슨 문제가 발생할까??
이해를 위해 아래 그림을 보자 (글로벌 vs 가상)</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/e291e8f3-4383-4e43-8edc-88e54e871a3a/image.png" alt="">
<img src="https://velog.velcdn.com/images/da_leesunho/post/92d58572-0ab5-4674-956a-829e7eb88604/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp<span style = "color:gray">그림 출처 : <a href="https://dojang.io/mod/">https://dojang.io/mod/</a></span></p>
<blockquote>
</blockquote>
<p><em>먼저 <strong>&quot;글로벌 파이썬 환경&quot; 그림</strong>에서 <strong>&#39;파이썬 설치 폴더&#39; 와 내부에 있는 &#39;인터프리터&#39;를 살펴보자</strong></em></p>
<blockquote>
</blockquote>
<p><em><strong>&quot;스크립트B.py&quot; 파일</strong> 은
<strong>패키지X 2.0 부터 존재하는 모듈을 사용</strong> 하고 <strong>python 3.8 버전 기능 필요 함</strong>
→ <strong>호환 문제로 오류 발생 및 진행 어려움</strong></em></p>
<blockquote>
</blockquote>
<p><em>그에 반해, <span style = "color:red">&quot;가상환경&quot;</span> 은
<strong>프로젝트 별 인터프리터와 패키지</strong>가 <strong>각 파이썬 실행파일에 적합한 것으로 설정</strong>되어 있어 문제가 발생하지 않는다~</em></p>
<blockquote>
</blockquote>
<p><em>결론은, 프로젝트가 많아지게 되면
<strong>제각각 패키지 버전 과 파이썬 버젼 (인터프리터) 이 다양해질 가능성이 높기에, 새로운 프로젝트를 할 때마다 가상환경을 구성해주는 것이 바람직스럽겠다~</strong></em></p>
<blockquote>
</blockquote>
<p><em>😁 프로젝트 별 폴더 관리 ok,
인터프리터는 어떻게 지정하지 몰라서 찾아보았다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/9ff03e45-de71-4807-ab78-3cc90c7c5a66/image.png" alt="">
<img src="https://velog.velcdn.com/images/da_leesunho/post/e465fc1f-afc7-4431-a947-3553c52a78c8/image.png" alt="">
<img src="https://velog.velcdn.com/images/da_leesunho/post/7974a42f-a4f0-4a5b-ba46-2e24c2313870/image.png" alt="">
<em>위 과정을 토대로 진행한 가상환경(venv) 과 글로벌 인터프리터가 보인다. 알아두자</em></p>
<hr>
<p><em>참고사이트 &gt;</em>
<a href="https://dojang.io">https://dojang.io</a>
<a href="https://mr-spock.tistory.com/19">https://mr-spock.tistory.com/19</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 개요]]></title>
            <link>https://velog.io/@da_leesunho/Python-%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@da_leesunho/Python-%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Fri, 07 Nov 2025 06:18:03 GMT</pubDate>
            <description><![CDATA[<p> _두 줄 요약 &gt;</p>
<p> 1) 컴퓨터도 이해하면서, 사람도 쉽게 작성, 관찰 할 수 있는 언어
 2) 대형 커뮤니티로 참고 할 수 있는 데이터도 겁나게 많고,
&amp;nbsp&amp;nbsp&amp;nbsp    다들 쓰기 때문에 사용을 안할 수가 없다._</p>
<hr>
<h2 id="python-이란"><em>Python 이란?</em></h2>
<h3 id="정의"><em>정의</em></h3>
<blockquote>
<p><em>사람이 읽기 쉬운 문법을 가진 고급 프로그래밍 언어로
데이터 분석, 인공지능, 웹 개발, 자동화 등 다양한 분야에 활용</em></p>
</blockquote>
<hr>
<h3 id="주요-특징"><em>주요 특징</em></h3>
<blockquote>
<p><em><strong>간결성, 범용성, 풍부한 라이브러리, 오픈소스</strong></em></p>
</blockquote>
<ul>
<li><em>문법이 짧고 직관적 (간결성)</em></li>
<li><em>데이터 분석, 웹, AI 등 여러 분야에서 사용 (범용성)</em></li>
<li><em>또한 다양한 확장 모듈을 제공 (라이브러리)</em></li>
<li><em>무료로 사용이 가능 (오픈소스)</em><br>
#### ✔️ _라이브러리, 패키지, 모듈_

</li>
</ul>
<p><em>패키지는 모듈의 집합이며, 라이브러리는 패키지와 모듈의 집합체이다.</em></p>
<p><em><strong>모듈 (datetime, math, random 등)</strong>
: 여러 클래스, 함수, 변수를 가지고 있는 (.py) 파일
<strong>패키지 (NumPy, Pandas)</strong>
: 단일 혹은 복수 개의 py 파일
<strong>라이브러리 (matplotlib, PyTorch, Beautiful Soup)</strong>
: 재사용이 가능한 코드 모음집</em></p>
<p><code>import [모듈 or 패키지 or 라이브러리]</code>  <em>를 통해 불러올 수 있다.</em></p>
<hr>
<h3 id="_사용-목적-이유-_">_사용 목적 (이유) _</h3>
<blockquote>
<p><em>데이터 처리 강점, 풍부한 라이브러리, 자동화 등</em></p>
</blockquote>
<h3 id="✔️-전세계-1등">✔️ <em>전세계 1등</em></h3>
<p><em>프로그래밍 언어 중 1위인 이유가 무엇일까? → <strong>&quot;생산성&quot;</strong></em>
<em>: 직관적인 코드 (한마디로 쉽다)</em>
<em>: 압도적으로 많은 라이브러리 및 프로젝트 (<a href="https://pypi.org/">https://pypi.org/</a>) _
_: 차세대 기술분야 적용의 생산성과 편리성 (by 라이브러리)</em>
<code>참고) C 언어 - &quot;성능&quot;이 우선시 될때 많 이 사용</code></p>
<blockquote>
<p><em><strong>대표적인 라이브러리 종류</strong></em>
<em><strong>1) NumPy</strong>
수치 계산을 위한 라이브러리
다차원 배열과 행렬 연산을 지원하여 데이터 분석, 머신 러닝 등에 널리 사용
<strong>2) Pandas</strong>
데이터 조작과 분석을 위한 라이브러리 (데이터프레임 중심)
<strong>3) Matplotlib</strong>
데이터 시각화를 위한 라이브러리
각종 그래프와 차트를 생성하는 데에 널리 사용
<strong>4) Tensor Flow</strong>
구글에서 개발한 머신 러닝 프레임워크
딥 뉴럴 네트워크를 구축하고 학습하는 데에 사용
<strong>5) PyTorch</strong>
Facebook에서 개발한 머신 러닝 프레임워크 (텐서 연산)
<strong>6) Scikit-learn</strong>
기계 학습 알고리즘을 모아놓은 라이브러리 (머신 러닝 모델 구축)
<strong>7) Keras</strong>
딥 뉴럴 네트워크를 구축하고 학습 (Tensor 와 같이 자주 사용)
<strong>8) Seaborn</strong>
Matplotlib을 기반으로 한 통계 데이터 시각화 라이브러리(디자인 강점) 
<strong>9) SciPy</strong>
과학적 계산, 최적화, 통계, 신호 처리 등의 기능을 제공
<strong>10) OpenCV</strong>
이미지 및 비디오 처리와 관련된 다양한 작업에 사용</em></p>
</blockquote>
<hr>
<p><em>참고사이트 &gt;</em>
<a href="https://coding-factory.tistory.com/952">https://coding-factory.tistory.com/952</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL_Programmers 코딩 테스트 4]]></title>
            <link>https://velog.io/@da_leesunho/251106%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8413%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EC%BD%94%EB%93%9C%ED%85%8C%EC%8A%A4%ED%8A%B84</link>
            <guid>https://velog.io/@da_leesunho/251106%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8413%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EC%BD%94%EB%93%9C%ED%85%8C%EC%8A%A4%ED%8A%B84</guid>
            <pubDate>Thu, 06 Nov 2025 01:37:11 GMT</pubDate>
            <description><![CDATA[<BR>
학습사이트 > https://school.programmers.co.kr/
</BR>



<hr>
<h3 id="한-해에-잡은-물고기-수-구하기">한 해에 잡은 물고기 수 구하기</h3>
<p>FISH_INFO 테이블에서 2021년도에 잡은 물고기 수를 출력하는 SQL 문을 작성해주세요.
이 때 컬럼명은 &#39;FISH_COUNT&#39; 로 지정해주세요._</p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
    COUNT(ID) AS FISH_COUNT
FROM FISH_INFO
WHERE YEAR(TIME) = &#39;2021&#39;</code></pre>
<blockquote>
</blockquote>
<p><em>해당 문제에서 포인트는 <strong><span style = "color:BLUE">YEAR 함수</strong></SPAN> 이다.
FISH_INFO 테이블은 아래와 같다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/aa8264f9-4cb6-4cdc-9281-f6069923d32c/image.png" alt=""></p>
<p><em>YEAR 함수를 이용하여 연도(4자리) 값을 추출, 조건절에 사용하여 풀었다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/b2625699-9036-495e-b32a-6699caf1a9f5/image.png" alt=""></p>
<hr>
<h3 id="분기별-분화된-대장균의-개체-수-구하기">분기별 분화된 대장균의 개체 수 구하기</h3>
<p><em>각 분기(QUARTER)별 분화된 대장균의 개체의 총 수(ECOLI_COUNT)를 출력하는 SQL 문을 작성해주세요. 이때 각 분기에는 &#39;Q&#39; 를 붙이고 분기에 대해 오름차순으로 정렬해주세요.
대장균 개체가 분화되지 않은 분기는 없습니다.</em></p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
    CASE WHEN A.EXT_MONTH BETWEEN 1 AND 3 THEN &#39;1Q&#39;
    WHEN A.EXT_MONTH BETWEEN 4 AND 6 THEN &#39;2Q&#39;
    WHEN A.EXT_MONTH BETWEEN 7 AND 9 THEN &#39;3Q&#39; ELSE &#39;4Q&#39; END AS QUARTER,
    COUNT(A.ID) AS ECOLI_COUNT
FROM
    (
    SELECT 
        ID,
        MONTH(DATE_FORMAT(DIFFERENTIATION_DATE, &#39;%Y-%m-%d&#39;)) AS EXT_MONTH
    FROM ECOLI_DATA
    ) A
GROUP BY QUARTER
ORDER BY QUARTER</code></pre>
<blockquote>
</blockquote>
<p><em>해당 문제에서 포인트는 <strong><span style = "color:BLUE">CASE 구문, 날짜 함수</strong></SPAN> 이다.</em>
ECOLI_DATA 테이블은 아래와 같다._
<img src="https://velog.velcdn.com/images/da_leesunho/post/b15beb84-0b18-48fe-ade5-c4effb19889f/image.png" alt=""></p>
<blockquote>
</blockquote>
<p><BR></BR></p>
<blockquote>
<p><em>문제의 목적과 그에 따른 조건들을 살펴보면서, <strong>데이터 추출에 필요한 작업을 정리</strong>해보았다.</em></p>
</blockquote>
<p><em>1) DIFFERENTIATION_DATE 컬럼에서 월 값 출력
2) CASE WHEN 구문으로 각 분기 데이터 추출
3) COUNT 함수 사용</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/a7f0bcda-9a52-4146-988f-3c3b36b1a08b/image.png" alt=""></p>
<p><em>쿼리 작성에 대한 부분은 다양하다.</em>
<em>코드테스트를 목적으로 한다면, 문제에 명시된 조건들을 토대로 작성을 하면 된다.</em></p>
<p><em>실무에서는,
쿼리를 날리는 매순간 비용(리소스) 이 들기 때문에, 줄일 수 있는 형태로 작성되어야 한다고 함.</em>
<code>EX&gt; 하나의 쿼리에서 테이블을 참고하는 횟수를 최소화 (WITH 구문 등)</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 끄적끄적]]></title>
            <link>https://velog.io/@da_leesunho/251105%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8412%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81</link>
            <guid>https://velog.io/@da_leesunho/251105%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8412%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81</guid>
            <pubDate>Wed, 05 Nov 2025 06:04:11 GMT</pubDate>
            <description><![CDATA[<p><em>근 3주 간의 SQL 세션이 끝났다.
코드카타를 통해 흐름은 놓치지 않을 예정.</em></p>
<p><em>그 동안 진행한 이론을 쭉 보면서 <strong>놓쳤던 부분이나, 되새기기가 필요한 부분</strong>을 끄적여보자.</em></p>
<hr>
<h2 id="데이터-분석가의-주요-업무역량"><em>데이터 분석가의 주요 업무&amp;역량</em></h2>
<ul>
<li><em>데이터 추출</em></li>
<li><em>데이터 가공</em></li>
<li><em>데이터 시각화</em></li>
<li><em>인사이트 도출</em></li>
</ul>
<blockquote>
<p><em>SQL = 데이터 추출 / 가공에 있어 필수 역량
→ 데이터 추출과 전처리 정합성 검증</em></p>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>상세</th>
</tr>
</thead>
<tbody><tr>
<td>언어</td>
<td>SQL, PYTHON</td>
</tr>
<tr>
<td>통계지식</td>
<td>이론에 대한 이해, 필요한 부분은 학습이 필요</td>
</tr>
<tr>
<td>자격증 취득</td>
<td>SQLD, ADsP 등 정량적 구분을 위함</td>
</tr>
<tr>
<td>프로젝트 경험</td>
<td><strong>가장 중요</strong></td>
</tr>
<tr>
<td></td>
<td>앞선 언어, 통계지식 등이 선행 되어야 함</td>
</tr>
</tbody></table>
<p><em>★ 코딩테스트 필수 진행, 시간 내 추출 등 숙달 필요</em></p>
<p><code>ROW DATA : 가공되지 않은 데이터를 의미</code>
<code>DBMS : DB에 규칙성과 정합성을 부여 → 데이터 등록/정리/검색 을 용이하게 해주는 소프트웨어</code>
<img src="https://velog.velcdn.com/images/da_leesunho/post/70037246-39b4-4bb8-b5b4-32f7e6586547/image.png" alt=""></p>
<ul>
<li><em>DBMS 저장방식 : 관계형, 계층형, 망형으로 구분
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp 그 중 관계형 저장방식이 대중적</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/b6e0dc5c-e5f4-4878-84b8-ca17e67a6758/image.png" alt=""></li>
</ul>
<blockquote>
<p>_<strong>관계형(RDBMS)</strong></p>
</blockquote>
<p>1) 행과 열로 이루어진 2차원 구조
2) 계층형, 망형 구조가 발전된 형태
3) 데이터 구성, 복구가 가능
4) 정규화를 통한 중복제거 및 이상치 제거 가능_</p>
<blockquote>
</blockquote>
<p><em><strong>SQL (Structured Query Language)</strong>
RDBMS 에서 데이터를 관리하고 처리하기 위한 표준화된 언어</em></p>
<h2 id="sql-의-작동-및-작성순서"><em>SQL 의 작동 및 작성순서</em></h2>
<p><em>다시 한 번 작성하지만
SQL을 작성하고 오류를 찾아내는데 많은 도움이 된다. <strong>숙지하자</strong>.</em>
<em>작동 순서</em></p>
<blockquote>
<p>FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY</p>
</blockquote>
<p> <em>작성 순서</em></p>
<blockquote>
</blockquote>
<p>SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL_Programmers 코딩 테스트 3]]></title>
            <link>https://velog.io/@da_leesunho/251105%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8412%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@da_leesunho/251105%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8412%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 05 Nov 2025 01:07:40 GMT</pubDate>
            <description><![CDATA[<BR>
학습사이트 > https://school.programmers.co.kr/
</BR>



<hr>
<h3 id="대장균들의-자식의-수-구하기">대장균들의 자식의 수 구하기</h3>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
     A.ID, COUNT(B.ID) AS CHILD_COUNT
FROM ECOLI_DATA A
LEFT JOIN
     ECOLI_DATA B
ON A.ID = B.PARENT_ID
GROUP BY A.ID
HAVING (CHILD_COUNT IS NULL) = 0</code></pre>
<blockquote>
</blockquote>
<p><em>해당 문제에서 포인트는 <strong><span style = "color:BLUE">JOIN</strong></SPAN> 이다.
ECOLI_DATA 는 아래와 같다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/7223f22f-de8c-49b2-af82-bdb99c2dc0a7/image.png" alt="">
<em>목적에 맞는 결과 값을 얻기 위해서는, <strong>ID 와 PARENT_ID 칼럼을 활용</strong>해야 한다.
JOIN을 통해 ID 와 PARENT_ID 칼럼을 PK, FK 로 지정해서 출력해보자</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/7b42a7ee-04bc-4cd3-899f-f52c0cc5c3d4/image.png" alt="">
<em>매핑된 테이블이 출력 되었다.
자식의 수를 구하는 목적을 해결하기 위한 조건은 완성된 것이다.
_
_자식의 수 = 0 인 경우, NULL 이 아닌 숫자 0을 출력해야 하는 조건도 있기에,
HAVING 절로 조건도 명시 해야한다.
이후 집계함수 COUNT, GROUP BY 를 통한 ID 컬럼 별로 출력 할 수 있게 진행하면 된다.</em>
<img src="https://velog.velcdn.com/images/da_leesunho/post/3d0f112b-4c44-45b1-b692-2af907d057e4/image.png" alt=""></p>
<hr>
<h3 id="대장균들의-크기에-따라-분류하기1">대장균들의 크기에 따라 분류하기1</h3>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
    ID,
    CASE WHEN SIZE_OF_COLONY &lt;= 100 THEN &#39;LOW&#39;
         WHEN SIZE_OF_COLONY &lt;= 1000 THEN &#39;MEDIUM&#39;
    ELSE &#39;HIGH&#39; END AS SIZE
FROM ECOLI_DATA
ORDER BY ID</code></pre>
<blockquote>
</blockquote>
<p><em>해당 문제에서 포인트는 <strong><span style = "color:BLUE">CASE 구문</strong></SPAN> 이다.</em>
<em>대장균 개체의 크기가 
<strong>① 100 이하라면 &#39;LOW&#39;, 100 초과 1000 이하라면 &#39;MEDIUM&#39;, 1000 초과라면 &#39;HIGH&#39; 분류
② ID 별 오름차순 정렬</strong> 의 조건이 명시</em>
<em>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp// 테이블은 (ECOLI_DATA) 동일함</em></p>
<blockquote>
</blockquote>
<p><em>어렵지 않은 문제였다.
<strong><span style = "color:BLUE">CASE 구문의 동작 로직을 상기하도록 하자</SPAN></strong>
아래를 통해 살펴보자</em></p>
<pre><code class="language-SQL">CASE WHEN 조건1 THEN 결과
     WHEN 조건2 THEN 결과2        --- **조건1 에 해당하는 데이터는 걸러진 상태**
     ...
     ELSE 결과3
END</code></pre>
<p><strong><em>조건1 에 해당되는 데이터는 고려하지 않고, 이후 조건 부분을 작성한다.</em></strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL WINDOW FUNCTION, WITH]]></title>
            <link>https://velog.io/@da_leesunho/251104%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8411%EC%9D%BC%EC%B0%A8SQL-4%EC%9D%BC%EC%B0%A8WINDOW-FUCTION-WITH</link>
            <guid>https://velog.io/@da_leesunho/251104%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%8411%EC%9D%BC%EC%B0%A8SQL-4%EC%9D%BC%EC%B0%A8WINDOW-FUCTION-WITH</guid>
            <pubDate>Tue, 04 Nov 2025 10:47:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
<br> <em>SQL 동작 순서를 명시
알아두고 항시 습관화하기</em></p>
</blockquote>
<p><em>오늘한 SQL, PYTHON 이론 및 실습을
복습하고 다시 한 번 풀어보았다.</em></p>
<p><em>눈으로는 당연하지만, 내 머릿 속에서 찾아 표현하는 것은 당연하지가 않다..</em></p>
<p><em>(학습에 한정하지 않고)
앞으로  행동하고 발생하는 모든 현상에 대해 논리적으로 생각하고, &#39;왜?&#39; 를 계속 떠올리자..!
<strong>물음에 대한 답변을 하지 못 하면 모르는 것이고, 부족한 것이다.</strong></em></p>
<hr>
<h2 id="sql-window-fuction">SQL WINDOW FUCTION</h2>
<blockquote>
<p><em><strong>테이블의 행과 행 간의 관계를 정의</strong>하기 위해 제공되는 함수
→ 여러 행의 관계를 파악하기 위해 사용, 분석 OR 순위 함수로 알려져 있음</em></p>
</blockquote>
<p><em>종류는 다음과 같다.</em></p>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>종류</th>
<th>함수</th>
</tr>
</thead>
<tbody><tr>
<td><code>순위</code></td>
<td><span style = "color:BLUE"><strong>RANK, DENSE_RANK, ROW_NUMBER</strong></SPAN></td>
</tr>
<tr>
<td><code>집계</code></td>
<td><span style = "color:BLUE"><strong>SUM, MAX, MIN, AVG, COUNT</strong></SPAN></td>
</tr>
<tr>
<td><code>순서</code></td>
<td>FIRST_VALUE, LAST_VALUE, <span style = "color:BLUE"><strong>LAG, LEAD</strong></SPAN></td>
</tr>
<tr>
<td><code>비율</code></td>
<td>RATIO_TO_REPORT, PERCENT_RANK, CUME_DIST, NTILE</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p><em>우리가 기존에 알고 있던 집계함수 역시 마찬가지로, 윈도우 함수이다.
순위, 합계, 평균, 행 위치 등을 조작하는 역할이다.</em></p>
<blockquote>
</blockquote>
<p><em>종류는 확인했고, <span style = "color:BLUE"><strong>특징</strong></SPAN>을 알아보자</em></p>
<ul>
<li><em>집계함수 : GROUP BY 구문과 병행하여 사용 <strong>가능</strong></em></li>
<li><em>순위, 순서, 비율함수 : GROUP BY 구문과 병행하여 사용 <strong>불가</strong></em>
<em>→ 윈도우 함수와 GROUP BY 구문은 <strong>둘 다 파티션을 분할한다는 의미에서 유사</strong></em><blockquote>
</blockquote>
```SQL</li>
<li>--- WINDOW FUNCTION 예시
SELECT WINDOW_FUNCTION () OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
FROM 테이블명            ## PARTITION BY 생략 가능<pre><code>&gt; _윈도우 함수를 언제 써야하는지, 사용해야하는 이유는?_
_&lt;span style = &quot;color:RED&quot;&gt;**집계함수처럼 계산은 하되, 원본 행들을 그대로 유지하면서 계산 결과를 함께 보고 싶을 때**&lt;/SPAN&gt;_
```SQL
SELECT department,
      AVG(salary)
FROM employees
GROUP BY department;        -- 부서별 평균 급여만 남고, 개인별 행은 표출하지 않음</code></pre><blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT 
 employee_name,
 department,
 salary,
 AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM employees;                -- SELECT 문의 행을 유지하면서, 각 부서별 평균 급여를 같이 표출</code></pre>
</li>
</ul>
<p><em>위에 종류를 나타낸 표를 참고
색 강조를 한 함수를 볼 수 있는데, 실무에서 <strong>자주쓰이는 함수</strong>가 대상이다.</em></p>
<p><em>먼저 순위함수를 살펴보자.</em></p>
<hr>
<h3 id="순위함수-rank">순위함수 (RANK)</h3>
<blockquote>
<p><em>특정 컬럼의 순위를 구하는 함수
<strong>동일한 값에</strong> 대해서는 <strong>같은 순위를 부여, 중간 순위를 비운 값이 출력</strong></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    rank() over(partition by JOB order by SALARY) as rank1
from basic.window1 </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/2515a5ed-7caf-40fc-91dd-59a84a73cac2/image.png" alt=""> <em>SALARY 값이 2등인 두 개의 행에 대해, <strong>2가 아닌 3으로 표기가 된 것을 볼 수 있다.</strong></em></p>
<h3 id="순위함수-dense_rank">순위함수 (DENSE_RANK)</h3>
<blockquote>
<p><em>특정 컬럼의 순위를 구하는 함수
<strong>동일한 값에</strong> 대해서는 <strong>같은 순위를 부여, 중간 순위를 비우지 않고 출력</strong></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    dense_rank() over(partition by JOB order by SALARY) as RANK1
from basic.window1 </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/2b45a0ba-058b-496e-950a-fa0c4e8f1ba6/image.png" alt="">
 <em>SALARY 값이 2등인 두 개의 행에 대해, <strong>2로 표기가 된 것을 볼 수 있다.</strong></em></p>
<h3 id="순위함수-row_number">순위함수 (ROW_NUMBER)</h3>
<blockquote>
<p><em>특정 컬럼의 순위를 구하는 함수
<strong>동일한 값에</strong> 대해서 <strong>고유한 순위를 부여</strong></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    ROW_NUMBER() over(partition by JOB order by SALARY) as RANK1
from basic.window1     </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/2b45a0ba-058b-496e-950a-fa0c4e8f1ba6/image.png" alt="">
 <em>SALARY 값이 2등인 두 개의 행에, <strong>순차적으로 순위가 표기 된 것을 볼 수 있다.</strong></em></p>
<hr>
<h3 id="순서-함수-first_value">순서 함수 (FIRST_VALUE)</h3>
<blockquote>
<p><em>파티션 별 가장 먼저 나온 값을 출력
<strong>공동 등수 인정 X, 처음 나온 행만 가져오며 MIN 함수와 결과 동일</strong></em></p>
</blockquote>
<p><code>FIRST_VALUE(컬럼1) OVER(PARTITION BY 컬럼2 ORDER BY 컬럼3)</code></p>
<h3 id="순서-함수-last_value">순서 함수 (LAST_VALUE)</h3>
<blockquote>
<p><em>파티션 별 가장 마지막에 나온 값을 출력
<strong>공동 등수 인정 X, 나중에 나온 행만 가져오며 MAX 함수와 결과 동일</strong></em></p>
</blockquote>
<p><code>LAST_VALUE(컬럼1) OVER(PARTITION BY 컬럼2 ORDER BY 컬럼3)</code></p>
<h3 id="순서-함수-lag">순서 함수 (LAG)</h3>
<blockquote>
<p><em><strong>이전 N 번째 행을 가져오는 함수
별도 명시가 없는 경우, 기본값은 1</strong>
가져올 행이 없을 경우 DEFAULT 값을 지정해주는 것으로 NVL, ISNULL 함수와 기능 동일</em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    LAG(SALARY) OVER (ORDER BY NAME) as PREV_SAL 
from basic.window1</code></pre>
<p> <img src="https://velog.velcdn.com/images/da_leesunho/post/fca116cf-39fa-4c98-8ab4-7790ffb8e2ea/image.png" alt=""></p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">select *,
    LAG(SALARY, 2) OVER (ORDER BY NAME) as PREV_SAL 
from basic.window1</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/5472711a-fb89-4c0d-a823-a2a32932521c/image.png" alt=""></p>
<h3 id="순서-함수-lead">순서 함수 (LEAD)</h3>
<blockquote>
<p><em><strong>이후 N 번째 행을 가져오는 함수
별도 명시가 없는 경우, 기본값은 1</strong>
가져올 행이 없을 경우 DEFAULT 값을 지정</em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    LEAD(SALARY) OVER (ORDER BY NAME) as PREV_SAL 
from basic.window1</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/3f7a6856-1046-4ac3-b397-3407e68da0a3/image.png" alt=""></p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">select *,
    LEAD(SALARY,2) OVER (ORDER BY NAME) as PREV_SAL 
from basic.window1</code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/8f8edbda-6d8e-4167-9f43-be0c7e7db2e5/image.png" alt=""></p>
<hr>
<h3 id="비율-함수-ratio_to_report">비율 함수 (RATIO_TO_REPORT)</h3>
<blockquote>
<p><em><strong>파티션 내 전체 SU, 값에 대한 행별 백분율을 소수점으로 출력
결과값은 0 ~ 1 사이</strong>
MySQL 미지원 함수</em>
<code>RATIO_TO_REPORT(컬럼1) OVER (PARTITION BY 컬럼2 ORDER BY 컬럼3)</code></p>
</blockquote>
<h3 id="비율-함수-percent_rank">비율 함수 (PERCENT_RANK)</h3>
<blockquote>
<p><em><strong>파티션 별 가장 먼저 나오는 값을 0, 마지막에 나오는 값을 1로 정하여,
행 순서 별 백분율을 출력</strong></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    PERCENT_RANK() OVER (partition by JOB order BY SALARY)
from basic.window1 </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/f30fb431-0470-4e9f-86fe-f4c26ca42c08/image.png" alt=""></p>
<h3 id="비율-함수-cume_dist">비율 함수 (CUME_DIST)</h3>
<blockquote>
<p><em>*<em>파티션 별 전체 건 수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 출력
*</em></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    cume_dist() OVER (partition by JOB order BY SALARY) </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/3deb16c8-1181-4917-817a-a63e80d961c6/image.png" alt=""></p>
<h3 id="비율-함수-ntile">비율 함수 (NTILE)</h3>
<blockquote>
<p><em><strong>파티션 별 전체 건수를 계산한 값으로 N등분한 결과를 출력</strong></em></p>
</blockquote>
<pre><code class="language-SQL">select *,
    cume_dist() OVER (partition by JOB order BY SALARY) </code></pre>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/1e786d64-a292-4fde-b9a0-9f010f2d0753/image.png" alt=""></p>
<hr>
<h2 id="with-문">WITH 문</h2>
<blockquote>
<p><em><strong>테이블 재사용</strong></em></p>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>상세</th>
</tr>
</thead>
<tbody><tr>
<td><code>정의</code></td>
<td>SQL 구문에서 사용되는 <span style = "color:BLUE"><strong>임시 테이블</strong></SPAN></td>
</tr>
<tr>
<td><code>사용이유</code></td>
<td>쿼리 가독성 및 성능 향상</td>
</tr>
<tr>
<td><code>특징</code></td>
<td>임시 테이블의 개념, 작성한 쿼리 내에서만 실행 가능</td>
</tr>
<tr>
<td></td>
<td>하나의 SQL 구문에서 여러 개의 WITH 문 선언 가능</td>
</tr>
<tr>
<td></td>
<td>하나의 테이블에 대한 여러 조회가 필요한 경우, WITH 문으로 1회 조회 및 선언</td>
</tr>
<tr>
<td></td>
<td>복잡한 연산을 보다 효율적으로 처리 (JOIN, UNION 등의 결과를 WITH 문에 저장</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p><em>기본 문법은 아래와 같다.</em></p>
<pre><code class="language-SQL">WITH 임시테이블명 AS
(    SELECT 컬럼1, 컬럼2, ..
     FROM 테이블명
 )
SELECT 임시테이블에서 불러온 컬럼 중 필요한 컬럼 
FROM 임시테이블명 </code></pre>
<p><em>예시) PROGRAMMERS - 대장균의 크기에 따라 분류하기2</em></p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">WITH CLASSIFIED AS (
    SELECT
        ID,
        CASE NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC)
            WHEN 1 THEN &#39;CRITICAL&#39;
            WHEN 2 THEN &#39;HIGH&#39;
            WHEN 3 THEN &#39;MEDIUM&#39;
            WHEN 4 THEN &#39;LOW&#39;
        END AS COLONY_NAME
    FROM ECOLI_DATA
)
SELECT ID, COLONY_NAME
FROM CLASSIFIED
ORDER BY ID;</code></pre>
<p><em>예시2) 다중 WITH 구문</em></p>
<blockquote>
</blockquote>
<pre><code class="language-SQL">WITH gogo as                     -- 첫번째 WITH 절
(    select game_account_id, exp
    from basic.users 
    where `level` &gt;50
),
hoho AS                         -- 두번째 with 절, with 구문은 처음 한번만 작성합니다. 
(    select distinct game_account_id, pay_amount, approved_at
    from basic.payment 
    where pay_type=&#39;CARD&#39;
) 
select case when b.game_account_id is null then &#39;결제x&#39; else &#39;결제o&#39; end as gb
, count(distinct a.game_account_id)as accnt 
from gogo as a
left join hoho as b
on a.game_account_id=b.game_account_id
group by case when b.game_account_id is null then &#39;결제x&#39; else &#39;결제o&#39; end
;
)
SELECT ID, COLONY_NAME
FROM CLASSIFIED
ORDER BY ID;</code></pre>
<h2 id="이외-주요-함수">이외 주요 함수</h2>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/80019a4f-273a-4461-a763-6a29bd0669b3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/d0a8eaa0-ec19-4d7b-89b9-1036ba73b2ae/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/355ead28-071f-4d9e-aac4-bfc437097a27/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL UNION, JOIN (2/2)]]></title>
            <link>https://velog.io/@da_leesunho/251103%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%849%EC%9D%BC%EC%B0%A8SQL-3%EC%9D%BC%EC%B0%A8UNION-JOIN-22</link>
            <guid>https://velog.io/@da_leesunho/251103%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%849%EC%9D%BC%EC%B0%A8SQL-3%EC%9D%BC%EC%B0%A8UNION-JOIN-22</guid>
            <pubDate>Mon, 03 Nov 2025 10:05:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
<br> <em>SQL 동작 순서를 명시
알아두고 항시 습관화하기</em></p>
</blockquote>
<p><em>이어서 진행해보자</em>
<em>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp- 한 주의 시작부터 파이썬 세션도 같이 진행되고 정신이 없지만 정신차리고 해보자</em>
_&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp- JOIN 에 대한 예제를 코딩테스트 사이트에서 많이 풀어보자 _</p>
<hr>
<p><em>Remind</em>
<em><strong>&#39;UNION&#39;</strong> : <strong>수직 결합</strong> / <strong>&#39;JOIN&#39;</strong> : <strong>수평 결합</strong> 임을 떠올리며 학습해보자.</em></p>
<p><img src="https://velog.velcdn.com/images/da_leesunho/post/6cd12807-c08a-454d-ac91-8c4e9eea62cf/image.png" alt=""></p>
<hr>
<h3 id="sql-테이블-수평-결합-join">SQL 테이블 수평 결합 (JOIN)</h3>
<blockquote>
<p><em>여러 테이블을 <strong>수평</strong> 으로 결합 할 때 사용하는 기능이다.
기본적인 구조는 다음과 같다.</em></p>
<pre><code class="language-SQL">---- JOIN 기본 구문
select 컬럼1, 컬럼2.
from 테이블 a
join                 -- 필요에 따라 사용하는 JOIN의 종류가 다양하다. 다음 주에 학습할 예정 ~
select 컬럼1, 컬럼2..
from 테이블 b
on a.공통컬럼=b.공통컬럼</code></pre>
</blockquote>
<pre><code>```SQL
---- JOIN 기본 구문
------ 공통 컬럼이 2개 이상인 경우
select 컬럼1, 컬럼2
from 테이블 as a
join                 -- 필요에 따라 사용하는 JOIN의 종류가 다양하다. 다음 주에 학습할 예정 ~
select 컬럼1, 컬럼2..
from 테이블 as b
on a.공통컬럼=b.공통컬럼 and a.공통컬럼2=b.공통컬럼2 </code></pre><p><em><strong><span style = "color:RED">JOIN</SPAN></strong> 의 종류는 다음 주에 학습 할 예정이다.
그렇다면 <span style = "color:RED"><strong>필수 조건 (주의사항)</strong></SPAN> 은 무엇일까?</em></p>
<blockquote>
</blockquote>
<p><em>① JOIN 하고자 하는 테이블들의 <strong>공통 컬럼</strong>을 찾는다.</em>
<em>② *<em>공통 컬럼의 관계(PK, FK) *</em>를 찾는다.</em>
<em>③ <strong>출력하고자 하는 결과 값에 따른 적절한 JOIN 방식</strong>을 찾는다.</em></p>
<blockquote>
</blockquote>
<p><code>② 공통 컬럼의 **관계(PK, FK)**을 찾는다.</code></p>
<ul>
<li><em>PK, FK 가 무엇인지 먼저 알아보자</em><blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>PK</code></td>
<td><strong>기본 키</strong>, <strong>Null 일 수 없고 유일한 값</strong>을 갖는다</td>
</tr>
<tr>
<td>&#39;FK&#39;</td>
<td>외래 키, PK와 JOIN 하기 위한 연결컬럼의 역할</td>
</tr>
</tbody></table>
</li>
<li><em>표에 나온 설명과 같이 JOIN을 하기 위해서는,
하나의 테이블의 PK와, 연결해주려는 테이블의 FK 를 찾아주어야 한다.
<span style = "color:BLUE"><strong>PK의 특징(NULL 값 존재 X, 모든 행의 값이 유일한 값)</SPAN>을 기억해두자</strong></em><blockquote>
</blockquote>
<code>③ 적절한 JOIN 방식을 찾자</code>
<img src="https://velog.velcdn.com/images/da_leesunho/post/c53bf0f5-00b1-495b-a39e-3b4d3ff0faf1/image.png" alt="">
<em>위 도식과 같이, JOIN의 종류는 다양하다.
JOIN에 대해 전반적인 이해를 바탕으로 필요에 따른 JOIN 방식을 사용하여야한다.
실무에서 자주 사용하는 JOIN 방식에 대해 알아보자</em></li>
</ul>
<h4 id="1-inner-join">1) INNER JOIN</h4>
<p><em>: 두 테이블에서 <strong>일치하는 값을 가진 행을 출력</strong> (교집합)</em></p>
<pre><code class="language-SQL">---- INNER JOIN 기본 구문
select 컬럼1, 컬럼2... 
from 테이블명1
inner join 테이블명2   
on a.공통컬럼=b.공통컬럼</code></pre>
<h4 id="2-left-join">2) LEFT JOIN</h4>
<p><em>: 기준 테이블(A)의 모든 행과, 연결하려는 테이블(B)의 일치하는 행을 반환</em>
<em>: 일치하는 항목이 없으면 B의 컬럼 값에 NULL 값이 출력</em></p>
<pre><code class="language-SQL">---- LEFT JOIN 기본 구문
select 컬럼1, 컬럼2... 
from 테이블1 as a                -----  기준테이블 : 테이블1 
left join basic.theglory2 as b
on a.공통컬럼=b.공통컬럼</code></pre>
<p><strong>RIGHT 조인의 경우, LEFT의 반대로 오른쪽 컬럼이 기준이 된다.
LEFT JOIN에서 순서만 변경하면 되기 때문에 별도로 학습하지 않는다.</strong>
<BR></BR></p>
<h4 id="3-full-outer-join">3) FULL OUTER JOIN</h4>
<p><em>: 테이블의 모든 데이터를 보고 싶을 때</em>
<em>: MySQL의 경우 지원 X (UNION과 LEFT &amp; RIGHT JOIN의 결합)</em></p>
<blockquote>
<p><em>실무에서 하면 &quot;딱밤&quot; (리소스 및 비용 엄청 남)</em></p>
</blockquote>
<pre><code class="language-SQL">select 컬럼1, 컬럼2,...
from 테이블명1 a left join 테이블명2 b
on a.공통컬럼=b.공통컬럼

union

select 컬럼1, 컬럼2,...
from 테이블명1 a right join 테이블명2 b        --- LEFT 조인으로 테이블1과 2의 위치를 바꿔주면 된다.
on a.공통컬럼=b.공통컬럼</code></pre>
<h3 id="union--join-비교">UNION / JOIN 비교</h3>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>UNION</th>
</tr>
</thead>
<tbody><tr>
<td>&#39;결합방식&#39;</td>
<td>수직 결합</td>
</tr>
<tr>
<td><code>특징</code></td>
<td>SELECT 문은 같은 수의 열을 가져야 합니다.</td>
</tr>
<tr>
<td></td>
<td>각 SELECT 문의 열은 동일한 순서를 가져야 합니다.</td>
</tr>
<tr>
<td>&#39;종류&#39;</td>
<td>UNION : 결합한 결과에서 중복되는 행은 하나만 표시</td>
</tr>
<tr>
<td></td>
<td>UNION ALL: 결합한 결과에서 중복되는 행을 모두 표시</td>
</tr>
</tbody></table>
<blockquote>
<BR>

</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>JOIN</th>
</tr>
</thead>
<tbody><tr>
<td>&#39;결합방식&#39;</td>
<td>수평 결합</td>
</tr>
<tr>
<td><code>특징</code></td>
<td>각 테이블은 결합을 위해 공통컬럼을 반드시 1개이상 가져야 합니다.</td>
</tr>
<tr>
<td></td>
<td>PK 는 기본키라고 부르며, NULL 일 수 없고, 유일한 값을 가집니다. 테이블 당 하나의 기본키만 가질 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td>FK 는 외래키라고 부르며, 다른 테이블의 PK 와 연결되는 컬럼을 의미합니다. (즉, PK 와 공통컬럼)</td>
</tr>
<tr>
<td>&#39;종류&#39;</td>
<td>INNER / LEFT / FULL OUTER</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL_Programmers 코딩 테스트 2]]></title>
            <link>https://velog.io/@da_leesunho/251031%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%848%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EC%BD%94%EB%93%9C%ED%85%8C%EC%8A%A4%ED%8A%B82</link>
            <guid>https://velog.io/@da_leesunho/251031%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B0%80-%EC%96%91%EC%84%B1%EB%B3%B8-%EC%BA%A0%ED%94%848%EC%9D%BC%EC%B0%A8%EA%B0%9C%EC%9D%B8%EC%8A%A4%ED%84%B0%EB%94%94SQL%EC%BD%94%EB%93%9C%ED%85%8C%EC%8A%A4%ED%8A%B82</guid>
            <pubDate>Thu, 30 Oct 2025 08:10:25 GMT</pubDate>
            <description><![CDATA[<BR>
학습사이트 > https://school.programmers.co.kr/
</BR>



<hr>
<h3 id="특정-세대의-대장균-찾기">특정 세대의 대장균 찾기</h3>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
    ID
FROM
    ECOLI_DATA
WHERE
    PARENT_ID
    IN (
        SELECT
            ID
        FROM
            ECOLI_DATA
        WHERE
        PARENT_ID
        IN (
            SELECT
                ID
            FROM
                ECOLI_DATA
            WHERE
            PARENT_ID IS NULL
            )
        )
ORDER BY ID</code></pre>
<blockquote>
</blockquote>
<p><em>해당 문제에서 포인트는 <strong><span style = "color:RED">중첩 서브 쿼리</strong> 였다.
  <strong>&quot;WHERE / HAVING (조건 절)에 사용되는 서브쿼리&quot;</strong> 를 칭함</em></p>
<ul>
<li><em>서브쿼리의 결과에 따라 달라지는 조건 절</em></li>
<li><em>(비) 상관 서브쿼리 개념</em><blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>상관 서브쿼리</code></td>
<td>메인 쿼리의 컬럼을 참조하여, 각 행마다 반복 실행</td>
</tr>
<tr>
<td>&#39;비상관 서브쿼리&#39;</td>
<td>메인 쿼리와 독립되어, 먼저 실행 후 결과를 메인 쿼리에 전달</td>
</tr>
<tr>
<td>_쉽게 말해서,</td>
<td></td>
</tr>
</tbody></table>
</li>
<li>*<span style = "color:RED">상관 서브쿼리</SPAN>는 <span style = "color:RED">메인 쿼리없이 동작이 불가한</SPAN> 서브 쿼리이며,**
<span style = "color:RED"><strong>비상관 서브쿼리</SPAN>는 <span style = "color:RED">메인 쿼리없이도 동작이 가능</SPAN>한 서브 쿼리다.</strong>_<blockquote>
<p><em>해당 문제에서 반복적으로 결과 값을 추출,
원하는 최종 결과 값을 메인 쿼리에 사용할 수 있도록 하는 것이 관건이었다.</em></p>
</blockquote>
</li>
</ul>
<h3 id="retry-멸종위기의-대장균-찾기"><em>RETRY&gt; 멸종위기의 대장균 찾기</em></h3>
<blockquote>
</blockquote>
<p><em>도저히 모르겠다. 확인해보니 LV5 문제라 추후 재시도 예정...</em></p>
<h3 id="가장-큰-물고기-10마리-구하기">가장 큰 물고기 10마리 구하기</h3>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
    ID, LENGTH
FROM
    FISH_INFO
ORDER BY
    LENGTH DESC, ID ASC
LIMIT 10</code></pre>
<blockquote>
</blockquote>
<p>_ 오랜만의 쉬운 문제로 숨통이 트였다.
해당 문제에서 포인트는 <strong><span style = "color:RED">LIMIT 구문</strong> 이었다.
  <strong>&quot;표기되는 출력의 행 표기를 제한하는 구문&quot;</strong>_</p>
<ul>
<li><p><em>실무) 쿼리를 날릴 때 자원 관리를 위해 사용</em></p>
<h3 id="특정-물고기를-잡은-총-수-구하기">특정 물고기를 잡은 총 수 구하기</h3>
<blockquote>
</blockquote>
<pre><code class="language-SQL">SELECT
COUNT(a.ID) AS FISH_COUNT
FROM
(
SELECT
    A.ID, A.FISH_TYPE, B.FISH_NAME
FROM
    FISH_INFO AS A
LEFT JOIN
    FISH_NAME_INFO AS B ON A.FISH_TYPE = B.FISH_TYPE
) a
WHERE a.FISH_NAME IN (&#39;BASS&#39;,&#39;SNAPPER&#39;)</code></pre>
<blockquote>
</blockquote>
<p><em>한 번에 쿼리를 날려 성공했다..
해당 문제에서 포인트는 <strong><span style = "color:RED">JOIN, 서브쿼리</strong> 였다.
1) LEFT JOIN 을 통해 A 테이블 기준 공통 컬럼으로 결합하고,
2) 서브 쿼리화
3) 서브 쿼리에서 생성된 테이블(a)를 이용해 조건 절을 통한 원하는 값 출력</em></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>