<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hana_summer.log</title>
        <link>https://velog.io/</link>
        <description>Start with hello world:)</description>
        <lastBuildDate>Tue, 14 Jan 2025 12:42:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hana_summer.log</title>
            <url>https://velog.velcdn.com/images/hana_summer/profile/608af153-59b5-4c6c-83d4-2da77e2214a6/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hana_summer.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hana_summer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SQL] 특정 옵션이 포함된 자동차 리스트 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%ED%8A%B9%EC%A0%95-%EC%98%B5%EC%85%98%EC%9D%B4-%ED%8F%AC%ED%95%A8%EB%90%9C-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%ED%8A%B9%EC%A0%95-%EC%98%B5%EC%85%98%EC%9D%B4-%ED%8F%AC%ED%95%A8%EB%90%9C-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 14 Jan 2025 12:42:00 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>CAR_RENTAL_COMPANY_CAR 테이블에서 &#39;네비게이션&#39; 옵션이 포함된 자동차 리스트를 출력하는 SQL 작성</strong></p>
</blockquote>
<ul>
<li>자동차 ID 기준으로 내림차순 정렬</li>
<li>OPTIONS컬럼은 각 값이 <code>,</code>로 이어져 있는 형태</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li><code>WHERE 조건문</code>을 통해 OPTIONS 컬럼에서 &#39;네비게이션&#39;이라는 단어가 포함된 데이터만 추출. 포함되면 모두 추출해야 하기 때문에 <strong>문자열의 패턴</strong> 검색하는 방법 사용</li>
</ul>
</blockquote>
<ul>
<li><code>ORDER BY</code>로 ID 기준 내림차순(DESC) 정렬</li>
<li><code>SELECT</code>에서 정답 기준 테이블과 동일한 컬럼만 추출</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>-- MYSQL
SELECT CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE &#39;%네비게이션%&#39;
ORDER BY CAR_ID DESC;</code></pre></blockquote>
<h1 id="🪄틀린-부분-수정-or-다른-풀이">🪄틀린 부분 수정 OR 다른 풀이</h1>
<blockquote>
<pre><code>SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE &#39;%네비게이션%&#39;
ORDER BY CAR_ID DESC;</code></pre></blockquote>
<pre><code>- 정답 기준 컬럼이 전체 컬럼과 동일하므로 SELECT에 `*`를 사용해도 무방하다!

# 🪄관련 개념
### LIKE 연산자
&gt; #### LIKE : 문자열의 패턴 검색에 사용</code></pre><p>SELECT*FROM 테이블 WHERE 컬럼 LIKE &#39;PATTERN&#39;</p>
<p>```</p>
<blockquote>
<blockquote>
<h4 id="패턴-검색에-사용되는-연산자">패턴 검색에 사용되는 연산자</h4>
</blockquote>
</blockquote>
<ol>
<li><code>%</code> : 0개 이상의 모든 문자 대체(글자 개수 지정하지 않는 와일드 카드)</li>
<li><code>_</code> : 1개 이상의 모든 문자 대체(<code>_</code>개수 만큼 글자 수가 지정되는 와일드 카드)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 조건에 부합하는 중고거래 댓글 조회하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EB%8C%93%EA%B8%80-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EB%8C%93%EA%B8%80-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 12 Jan 2025 09:32:09 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자  ID, 댓글 내용, 댓글 작성일 조회</strong></p>
</blockquote>
<ul>
<li>댓글 작성일 기준 오름차순, 댓글 작성일이 같은 경우 게시글 제목 기준 오름차순 정렬</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li><code>USED_GOODS_BOARD</code>와 <code>USED_GOODS_REPLY</code>테이블을 게시글 ID인 <code>BOARD_ID</code> 기준으로 <code>INNER JOIN</code></li>
</ul>
</blockquote>
<ul>
<li><code>2022-10-01 ~ 2022-10-31</code>에 작성된 게시글만 필터링</li>
<li><code>CREATED_DATE</code>를 <code>날짜</code>만 나오게 출력(현재는 시간과 함께 추출되고 있음)</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>-- MYSQL
SELECT 
    TITLE, 
    B.BOARD_ID, 
    REPLY_ID, 
    R.WRITER_ID, 
    R.CONTENTS, 
    DATE_FORMAT(R.CREATED_DATE, &#39;%Y-%m-%d&#39;) AS CREATED_DATE
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE BETWEEN &#39;2022-10-01&#39; AND &#39;2022-10-31&#39;
ORDER BY R.CREATED_DATE, TITLE;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt;```
-- ORACLE
SELECT 
    TITLE, 
    B.BOARD_ID, 
    REPLY_ID, 
    R.WRITER_ID, 
    R.CONTENTS, 
    TO_CHAR(R.CREATED_DATE, &#39;YYYY-MM-DD&#39;) AS CREATED_DATE
FROM USED_GOODS_BOARD B
INNER JOIN 
    USED_GOODS_REPLY R 
ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE BETWEEN TO_DATE(&#39;2022-10-01&#39;, &#39;YYYY-MM-DD&#39;) 
                    AND TO_DATE(&#39;2022-10-31&#39;, &#39;YYYY-MM-DD&#39;)
ORDER BY R.CREATED_DATE, TITLE;</code></pre><h1 id="🪄관련-개념">🪄관련 개념</h1>
<h3 id="mysql과-oracle에서의-날짜-형식-변환-함수-차이">MYSQL과 ORACLE에서의 <em>날짜 형식 변환 함수</em> 차이</h3>
<blockquote>
<h4 id="mysql">MYSQL</h4>
<blockquote>
<h4 id="date_format--날짜-시간-값을-지정된-형식의-문자열로-변환">DATE_FORMAT : 날짜, 시간 값을 지정된 형식의 문자열로 변환</h4>
</blockquote>
</blockquote>
<ul>
<li><code>DATE_FORMAT(date_value, &#39;%Y-%m-%d %H:%i:%s&#39;)</code></li>
<li>숫자 포맷팅 지원X</li>
<li>날짜, 시간 값에만 적용 가능<h4 id="날짜와-문자열-직접-비교-가능">날짜와 문자열 직접 비교 가능</h4>
</li>
<li>```</li>
<li><ul>
<li>MySQL에서 날짜 문자열을 직접 비교할 수 있습니다.
SELECT * FROM TABLE_NAME
WHERE CREATED_DATE BETWEEN &#39;2022-10-01&#39; AND &#39;2022-10-31&#39;;</li>
</ul>
</li>
<li><strong>WHY?</strong> 날짜 문자열을 자동으로 날짜 형식으로 변환하여 비교할 수 있는 제공</li>
</ul>
<blockquote>
<h4 id="oracle">ORACLE</h4>
<blockquote>
<h4 id="to_char--날짜-숫자-또는-기타-데이터-유형을-지정된-형식의-문자열로-변환">TO_CHAR : 날짜, 숫자 또는 기타 데이터 유형을 지정된 형식의 문자열로 변환</h4>
</blockquote>
</blockquote>
<ul>
<li><code>TO_CHAR(date_value, &#39;YYYY-MM-DD HH24:MI:SS&#39;)</code></li>
<li>숫자도 형식화 가능, 숫자 포맷팅 지원O</li>
<li>날짜, 숫자에 적용 가능</li>
<li>Y%와 같은 <code>C스타일</code> 형식 지정자 사용X<blockquote>
<blockquote>
<h4 id="문자열을-날짜로-변환해야-날짜-문자열-비교-가능">문자열을 날짜로 변환해야 날짜 문자열 비교 가능</h4>
</blockquote>
</blockquote>
</li>
<li>```</li>
<li><ul>
<li>Oracle에서는 TO_DATE를 사용하여 문자열을 날짜로 변환해야 합니다.
SELECT * FROM TABLE_NAME
WHERE CREATED_DATE BETWEEN TO_DATE(&#39;2022-10-01&#39;, &#39;YYYY-MM-DD&#39;) <pre><code>                AND TO_DATE(&#39;2022-10-31&#39;, &#39;YYYY-MM-DD&#39;);</code></pre></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] Python 개발자 찾기]]></title>
            <link>https://velog.io/@hana_summer/SQL-Python-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-Python-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sun, 12 Jan 2025 08:24:48 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>Python 스킬을 가진 개발자의 정보 조회하여, 개발자의 ID, 이메일, 이름, 성 조회</strong></p>
</blockquote>
<ul>
<li>DEVELOPER_INFOS 테이블에서 조회, <code>ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_1, SKILL_2, SKILL_3</code>으로 컬럼 구성.</li>
<li>결과는 <code>ID 기준으로 오름차순 정렬</code></li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li>WHERE문으로 SKILL 3컬럼에 대해 각각 Python이 있는지 확인</li>
</ul>
</blockquote>
<ul>
<li>SELECT문에서 지정 컬럼만 뽑아 조회</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = &#39;Python&#39; OR SKILL_2 = &#39;Python&#39; OR SKILL_3 = &#39;Python&#39;
ORDER BY ID;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt;```
-- 틀린 풀이
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1|SKILL_2|SKILL_3 = &#39;Python&#39;
ORDER BY ID;</code></pre><blockquote>
<blockquote>
</blockquote>
<p>💡 <code>OR = |</code>라고 생각하여 <code>|</code>를 사용하였는데 두 연산자의 동작 방식이 달랐다!!</p>
</blockquote>
<h4 id="or--논리-연산자로-조건을-연결하는데-사용"><code>OR</code> : <code>논리 연산자</code>로 조건을 연결하는데 사용</h4>
<ul>
<li>여러 조건에 사용되며 컬럼 값을 논리적으로 비교하는데 사용<h4 id="--비트-연산자로-두-값을-비교하는-연산-수행">&#39;|&#39; : <code>비트 연산자</code>로 두 값을 비교하는 연산 수행</h4>
</li>
<li><code>숫자 값</code>의 비트 표현을 대상으로 작동, <code>컬럼명이나 문자열에서는 사용 불가</code><blockquote>
</blockquote>
</li>
<li><strong>다른 풀이 : IN을 활용한 풀이</strong><pre><code>SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE &#39;Python&#39; IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID;</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 잔챙이 잡은 수 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%EC%9E%94%EC%B1%99%EC%9D%B4-%EC%9E%A1%EC%9D%80-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%EC%9E%94%EC%B1%99%EC%9D%B4-%EC%9E%A1%EC%9D%80-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 12 Jan 2025 08:05:59 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>잡은 물고기 중 길이가 10cm 이하인 물고기 수 출력</strong></p>
</blockquote>
<ul>
<li>잡은 물고기의 길이가 10cm 이하인 경우 <code>LENGTH = NULL</code></li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li><code>LENGTH</code> 컬럼에서 NULL이 있는 경우를 IS NULL로 찾는다.</li>
</ul>
</blockquote>
<ul>
<li>COUNT를 활용하여 NULL이 있는 데이터 수를 계산한다.</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL;</code></pre></blockquote>
<pre><code>

# 🪄틀린 부분 수정 OR 다른 풀이
&gt; ```
-- 틀린 풀이
SELECT COUNT(LEGNTH) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL; </code></pre><ul>
<li>COUNT를 할 때 해당 컬럼에 대해서만 COUNT를 하면 될 것이라고 생각해서 LENGTH 컬럼만 COUNT를 걸었다. 하지만 COUNT=0이라고 문제가 발생.</li>
</ul>
<h1 id="🪄관련-개념">🪄관련 개념</h1>
<h4 id="💡-count컬럼명은-해당-열에서-null이-아닌-값의-개수를-센다">💡 <code>COUNT(컬럼명)</code>은 <code>해당 열에서 NULL이 아닌 값의 개수</code>를 센다.</h4>
<blockquote>
<ul>
<li>WHERE 절로 NULL 값만 필터링된 상태이므로 <code>COUNT(LENGTH)</code> 사용 시 LENGTH컬럼은 NULL만 있으므로 COUNT=0이 나타남.</li>
</ul>
</blockquote>
<h4 id="💡-count는-행-전체를-기준으로-개수를-센다">💡 <code>COUNT(*)</code>는 행 전체를 기준으로 개수를 센다.</h4>
<blockquote>
<ul>
<li><code>COUNT(*)</code> 사용 시 LENGTH컬럼의 NULL 여부와 상관 없이 현재 필터링된 전체 데이터 행의 수를 세므로 COUNT값이 원하는데로 산출!</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 잡은 물고기의 평균 길이 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0%EC%9D%98-%ED%8F%89%EA%B7%A0-%EA%B8%B8%EC%9D%B4-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0%EC%9D%98-%ED%8F%89%EA%B7%A0-%EA%B8%B8%EC%9D%B4-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 06 Jan 2025 06:22:10 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p> <strong><code>FISH_INFO</code> 테이블에서 잡은 물고기의 평균 길이 출력</strong></p>
</blockquote>
<ul>
<li>평균 길이를 나타내는 컬럼명은 <code>AVERAGE_LENGTH</code></li>
<li>평균 길이는 소수접 3째자리에서 반올림, 10cm이하의 물고기들은 10cm로 취급하여 평균 길이 구함</li>
<li>1Ocm 이하의 물고기는 <code>LENGTH=NULL</code>로 처리됨.</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li><code>LENGTH</code>컬럼에서 NULL이 있는 경우 10으로 치환한다.</li>
</ul>
</blockquote>
<ul>
<li>치환 후 AVG로 평균 구한 후 ROUND로 소수점 3째자리에서 반올림한다.</li>
<li>컬럼명 적합하게 변환한다!</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT ROUND(AVG(IFNULL(LENGTH, 10)), 2) AS AVERAGE_LENGTH
FROM FISH_INFO;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt;- #### CASE 서브 쿼리를 사용한 풀이</code></pre><p>SELECT ROUND(AVG(LENGTH), 2) AS AVERAGE_LENGTH
FROM(
    SELECT 
    CASE 
        WHEN LENGTH IS NULL THEN 10
        ELSE LENGTH 
    END AS LENGTH 
    FROM FISH_INFO
) AS SUB</p>
<pre><code>** 💡FROM절 서브 쿼리 활용** 
&amp;emsp;- CASE문으로 `LENGTH`컬럼의 NULL값이 있으면 10으로 반환, 반환값이 반영되는 컬럼명은 `LENGTH`로 유지

# 🪄관련 개념
 ### IFNULL
&gt;- **해당 컬럼값이 NULL을 반환할 때 다른 값으로 출력!**
- **SELECT 문**에서 사용됨</code></pre><p>SELECT IFNULL(`COLUMN명&#39;, &#39;NULL일 경우 대체값&#39;) 
FROM 테이블명;</p>
<pre><code>- ### IF 와 IS NULL의 조합으로 동일한 기능 수행 가능</code></pre><p>SELECT(IF(IS NULL(<code>COLUMN명</code>, &#39;A&#39;, &#39;B&#39;)
FROM 테이블명;</p>
<pre><code>💡 `COLUMN`명이 NULL인 경우 A, NULL이 아닌 경우 B 반환
- ### MSSQL에서 ISNULL</code></pre><p>SELECT ISNULL(<code>COLUMN명</code>, &#39;대체값&#39;)
FROM 테이블명;</p>
<pre><code>💡 `COLUMN`명이 NULL인 경우 대체값, NULL이 아닌 경우 기존 컬럼값을 출력한다.

### CASE
&gt; - **조건식을 통해 TRUE, FALSE를 판단하여 조건에 맞게 컬럼값을 반환한다.**</code></pre><p>SELECT
    CASE
       WHEN <code>COLUMN</code> IS NULL THEN &#39;A&#39;
       ELSE <code>COLUMN</code>
    END AS <code>COLUMN</code>
FROM 테이블명;</p>
<p>```
💡 <code>COLUMN</code>값이 NULL인 경우 A, NULL이 아닌 경우 <code>COLUMN</code>값을 그대로 반환한다. 그 후 <code>COLUMN</code>의 컬럼명을 <code>COLUMN</code>으로 지정한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 잡은 물고기 중 가장 큰 물고기의 길이 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%A4%91-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EB%AC%BC%EA%B3%A0%EA%B8%B0%EC%9D%98-%EA%B8%B8%EC%9D%B4-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%A4%91-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EB%AC%BC%EA%B3%A0%EA%B8%B0%EC%9D%98-%EA%B8%B8%EC%9D%B4-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 03 Jan 2025 07:24:23 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>FISH_INFO 테이블에서 잡은 물고기 중 가장 큰 물고기의 길이를 &#39;cm&#39;를 붙여 출력</strong></p>
</blockquote>
<ul>
<li>컬럼명은 &#39;MAX_LENGTH&#39;로 지정</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<ul>
<li>SELECT 문에서 cm을 LENGTH컬럼에 붙인 후 해당 컬럼에서 최대 길이를 MAX로 찾는다.</li>
</ul>
</blockquote>
<ul>
<li>컬럼명을 MAX_LENGTH로 바꾼다!</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT MAX(CONCAT(LENGTH, &#39;cm&#39;)) AS MAX_LENGTH
FROM FISH_INFO;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt; - ** 다른 풀이 : MAX, CONCAT의 순서 변경**</code></pre><p>SELECT CONCAT(MAX(LENGTH), &#39;cm&#39;) AS MAX_LENGTH
FROM FISH_INFO;</p>
<p>```
이렇게 MAX, CONCAT의 순서를 바꾸어도 무방하게 작동된다!</p>
<h1 id="🪄관련-개념">🪄관련 개념</h1>
<h3 id="max-min">MAX, MIN</h3>
<blockquote>
<ul>
<li><strong>MAX(컬럼명)</strong> : 해당 컬럼에서 최대값 추출</li>
</ul>
</blockquote>
<ul>
<li><strong>MIN(컬럼명)</strong> : 해당 컬럼에서 최소값 추출<blockquote>
<p>💡 <strong>SELECT문에서 사용!</strong></p>
</blockquote>
</li>
</ul>
<h3 id="문자열-합치기--concat-concat_ws">문자열 합치기 : CONCAT, CONCAT_WS</h3>
<blockquote>
<ul>
<li>*<em>CONCAT(문자열1, 문자열2...) *</em><ul>
<li>둘 이상의 문자열을 입력한 순서대로 합쳐서 반환</li>
<li>문자열에 &quot;&quot;를 넣게되면 띄어쓰기로 합쳐짐!</li>
<li>NULL이 문자열에 있는 경우 NULL은 무시하지 않되 NULL 결과를 반환하지 않음<ul>
<li><code>CONCAT(&#39;Value: &#39;, NULL, &#39; Test&#39;); -- &#39;Value: Test&#39;</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>*<em>CONCAT_WS(구분자, 문자열1, 문자열2...) *</em><ul>
<li>여러 값 결합, 각 결합 값 사이에 구분자를 포함하여 반환</li>
<li>NULL값이 있는 경우 무시<ul>
<li><code>CONCAT_WS(&#39;-&#39;, &#39;Name&#39;, NULL, &#39;Age&#39;); -- &#39;Name-Age&#39;</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<h2 id="🌟concat-사용-시-_암시적-형변환_이-이루어진다">🌟CONCAT 사용 시 _<strong>암시적 형변환</strong>_이 이루어진다!</h2>
<h3 id="형변환--명시적-형변환--암시적-형변환">형변환 : 명시적 형변환 &amp; 암시적 형변환</h3>
<blockquote>
<ul>
<li><strong>형변환</strong> : 두 개의 데이터간 데이터 타입이 일치하도록 변환하는 것</li>
</ul>
<blockquote>
</blockquote>
</blockquote>
<ul>
<li><strong>명시적 형변환</strong> : <strong>형변환 함수</strong>를 사용하여 데이터 타입을 일치시킴<ul>
<li>TO_NUMBER, TO_DATE, TO_CHAR 등으로 개발자가 SQL에서 형변환 함수를 사용하여 형변환 이루어짐<blockquote>
<blockquote>
</blockquote>
</blockquote>
</li>
</ul>
</li>
<li><strong>암시적 형변환</strong> : 개발자가 형변환을 하지 않은 경우 데이터베이스에서 <strong>자동으로 형변환</strong>하는 것<ul>
<li>문자열과 숫자열의 결합 시 문자열로 변환, 숫자와 실수의 결합 시 실수로 변환 등이 해당</li>
<li><strong>변환은 데이터 손실이 적은 방향으로 변환됨!</strong>(정수는 실수로, 실수는 문자열로 변환)<blockquote>
<p>_왜 문제에서 FLOAT+ 문자열이 CONCAT으로 가능한지 의문이었는데 이런 이유로 가능했구나를 알게됨!! 문자+숫자라고 안된다 하지말고 일단 합해보자!
_</p>
</blockquote>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 한 해에 잡은 물고기 수 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%ED%95%9C-%ED%95%B4%EC%97%90-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%ED%95%9C-%ED%95%B4%EC%97%90-%EC%9E%A1%EC%9D%80-%EB%AC%BC%EA%B3%A0%EA%B8%B0-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 03 Jan 2025 05:28:46 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>FISH_INFO 테이블에서 2021년도에 잡은 물고기 수 출력.</strong></p>
</blockquote>
<ul>
<li>컬럼명은 &#39;FISH_COUNT&#39;로 지정</li>
<li>잡은 물고기의 길이가 10cm 이하일 경우 LENGTH=NULL</li>
<li>LENGTH에 NULL만 있는 경우는 X</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<p><strong>&#39;2021/12/04&#39; 형태로 되어 있는 TIME 컬럼에서 년도만 YEAR함수로 추출 후 SELECT에서 COUNT로 데이터의 수를 센다.
또한, 문제 조건에 따라 추출된 데이터의 컬럼명을 FISH_COUNT로 별칭 지정!</strong></p>
</blockquote>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT COUNT(TIME) AS FISH_COUNT
FROM FISH_INFO
WHERE YEAR(TIME) = 2021;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt; #### 다른 풀이 : SUBSTR 사용</code></pre><p>SELECT  COUNT(*) AS FISH_COUNT
FROM  FISH_INFO
WHERE  SUBSTR(TIME,1,4) = &#39;2021&#39;</p>
<pre><code>- SUBSTR로 TIME 컬럼에서 앞에서부터 4개의 문자를 자르고 그것이 2021과 같은지 비교하여 2021에 해당되는 데이터를 찾았다.

# 🪄관련 개념
### 날짜 함수
&gt; - **YEAR(컬럼명)** : 날짜에서 연도 부분만 반환
- **MONTH(컬럼명)** : 날짜에서 월 부분만 반환
- **DAYOFMONTH(컬럼명)** : 날짜에서 일 부분만 반환
- **DATEDIFF(A, B)** : A날짜에서 B날짜를 빼는 것
- **CURDATE()** : 오늘날짜 추출

### SUBSTR()
&gt; - **SUBSTR(&#39;문자열&#39;, &#39;시작위치&#39;, &#39;길이&#39;)**
    : **문자열의 &#39;시작위치&#39;부터 &#39;길이&#39;까지 자른다.**
    : SUBSTR(ENDNAME, 2, 3) = 문자열의 두 번째 위치부터 세 자리까지 자른다.
&gt;
&gt;
 - **SUBSTR(&#39;문자열&#39;, -&#39;시작위치&#39;, &#39;길이&#39;)**
     : **문자열의 뒤에서&#39;시작위치&#39;에서 &#39;길이&#39;까지 자른다.**
    : SUBSTR(ENDNAME, -2, 3) = 문자열의 뒤에서 세 번째 위치에서 두 자리까지 자른다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 가장 큰 물고기 10마리 구하기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EB%AC%BC%EA%B3%A0%EA%B8%B0-10%EB%A7%88%EB%A6%AC-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EB%AC%BC%EA%B3%A0%EA%B8%B0-10%EB%A7%88%EB%A6%AC-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 30 Dec 2024 07:42:07 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>FISH_INFO 테이블에서 가장 큰 물고리 10마리의 ID와 길이 출력.</strong></p>
</blockquote>
<ul>
<li>결과는 길이 기준 내림차순, 길이가 같다면 물고기 ID에 대해 오름차순.</li>
<li>단, 가장 큰  물고기 10마리 중 10cm이하인 경우는 없다. -&gt; 10cm이하일 경우 LENGTH=NULL</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<p><strong>LENGTH를 기준으로 내림차순 정렬 후 10개를 뽑았을 때 10cm 이하인 경우는 포함되지 않으나 문제 조건에 포함되어 있으므로 추가 조건을 주었다.</strong></p>
</blockquote>
<ul>
<li>10cm 이하인 경우 LENGTH=NULL이므로 WHERE을 사용하여 IS NOT NULL 조건을 주었다.</li>
</ul>
<blockquote>
<p><strong>다중정렬을 사용하여 우선 LENGTH 기준으로 내림차순 정렬 후 ID기준으로 오름차순 정렬하도록 하였다.
그 후 마지막으로 10개만 뽑도록 LIMIT를 주었다.</strong></p>
</blockquote>
<h1 id="🪄sql">🪄SQL</h1>
<blockquote>
<pre><code>SELECT ID, LENGTH
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
ORDER BY LENGTH DESC, ID ASC
LIMIT 10;</code></pre></blockquote>
<pre><code>
# 🪄틀린 부분 수정 OR 다른 풀이
&gt; - WHERE조건에서 준 NOT NULL 조건의 경우 정렬 후 **10개의 데이터만 뽑아보았을 때 LENGTH=NULL인 데이터가 없어** 구지 **WHERE 조건을 주지 않아도 정답 처리**가 되지만, **문제에 더 부합한 풀이를 위해 WHERE 조건으로 NULL을 제외하여 데이터를 추출하도록 하였다.**
- **ASC의 경우 정렬의 기본값(오름차순)**이기에 ASC로 명시하여 작성하지 않아도 자동으로 오름차순 정렬되지만 가시성을 위해 ASC를 적어주었다!</code></pre><p>SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
LIMIT 10;</p>
<pre><code>
# 🪄관련 개념
 ### 다중정렬 ORDER BY
&gt;
- 결과 집합을 여러 열 기준으로 정렬하기 위해서는 **ORDER BY 절에 ,(쉼표)로 구분**하여 정렬 조건을 부여할 수 있다.
- ORDER BY에서 다중정렬을 하는 경우 **왼쪽부터 순차적으로 정렬되기에 순서를 고려**하여 컬럼을 나열해야 한다!</code></pre><p>SELECT * FROM 테이블 ORDER BY COL1 DESC, COL2 DESC;</p>
<pre><code>💡 _COL1기준으로 내림차순 정렬 후, COL1이 같은 값에 한해서 COL2로 내림차순 하겠다!_</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 특정 형질을 가지는 대장균 찾기]]></title>
            <link>https://velog.io/@hana_summer/SQL-%ED%8A%B9%EC%A0%95-%ED%98%95%EC%A7%88%EC%9D%84-%EA%B0%80%EC%A7%80%EB%8A%94-%EB%8C%80%EC%9E%A5%EA%B7%A0-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@hana_summer/SQL-%ED%8A%B9%EC%A0%95-%ED%98%95%EC%A7%88%EC%9D%84-%EA%B0%80%EC%A7%80%EB%8A%94-%EB%8C%80%EC%9E%A5%EA%B7%A0-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Tue, 24 Dec 2024 08:31:49 GMT</pubDate>
            <description><![CDATA[<h1 id="🪄문제-분석-요약">🪄문제 분석 요약</h1>
<blockquote>
<p><strong>ECOLI_DATA 테이블에서 특정 개체의 형질을 가지고 있지 않은/가지고 있는 개체의 수를 COUNT</strong></p>
</blockquote>
<ul>
<li>2번 형질을 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 개체의 수 COUNT. <br/><br/></li>
<li>1번과 3번 형질을 모두 보유하고 있는 경우, 1번이나 3번을 보유하고 있는 경우 COUNT에 포함. <br/><br/></li>
<li>문제에서는 GENOTYPE 값을 2진수로 변환한 뒤 각 자리수를 각 형질로 판단하고 있다.<ul>
<li>예를 들어, 15인 경우 이진수로 변환하면 1111로 1,2,3,4의 형질을 보유한다.</li>
<li>예를 들어, 13인 경우 이진수로 변환하면 1101로 1,3,4의 형질을 보유한다.</li>
<li>즉, 4자리수라면 뒷자리에서부터 1,2,3,4 형질로 보고 있다.</li>
</ul>
</li>
</ul>
<h1 id="🪄접근법">🪄접근법</h1>
<blockquote>
<p><strong>WHERE절에서 특정 특질 보유/미보유 여부를 판단할 수 있도록 조건을 부여한다.</strong></p>
</blockquote>
<ul>
<li>&#39;1번과 3번 형질을 모두 보유하고 있는 경우&#39;와 &#39;1번이나 3번을 보유하고 있는 경우&#39;는 중복된 조건! &#39;1번이나 3번을 보유하는 경우&#39;에 &#39;1번과 3번 형질을 모두 보유하는 경우&#39;가 포함되므로 &#39;1번과 3번 형질을 모두 보유하는 경우&#39;는 고려하지 않는다. - <strong>&#39;1번이나 3번을 보유하는 경우&#39;만 고려.</strong><br/><br/></li>
<li><strong>각 형질은 각 이진수의 자리수로 판단.</strong><ul>
<li>BIN 함수를 사용하여 GENOTYPE의 값을 이진수로 변환</li>
<li>각 자리수에서 두번째 자리가 0이면서, 첫번째나 세번째 자리가 1인 경우의 데이터 COUNT<ul>
<li>비트 연산자를 사용하여 이진수 &amp; 2 -&gt; 두번째 자리가 1인지 판단.</li>
<li>비트 연산자를 사용하여 (이진수 &amp; 1 OR 이진수 &amp; 4) -&gt; 첫번째 자리 혹은 3번째 자리가 1인지 판단.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="🪄sql">🪄SQL</h1>
<pre><code>SELECT COUNT(GENOTYPE) AS COUNT
FROM ECOLI_DATA
WHERE !(BIN(GENOTYPE)&amp;2)
AND (BIN(GENOTYPE)&amp;1 OR BIN(GENOTYPE)&amp;4);</code></pre><h1 id="🪄-틀린-부분-수정-or-다른-풀이">🪄 틀린 부분 수정 OR 다른 풀이</h1>
<blockquote>
<p>비트 연산자 개념에 대해 공부하고 난뒤 <strong>BIN함수가 불필요</strong>하다는 것을 알게되었다. <strong>비트 연산자</strong>는 사용 시에 연산 대상이 되는 숫자에 대해 <strong>자동으로 이진수 변환</strong>이 이루어지므로, <strong>현재 쿼리는 BIN함수와 비트 연산자로 이진수 변환이 2번 이루어졌다.</strong></p>
<blockquote>
<pre><code>SELECT COUNT(GENOTYPE) AS COUNT
FROM ECOLI_DATA
WHERE !(GENOTYPE &amp; 2)
AND (GENOTYPE &amp; 1 OR GENOTYPE &amp; 4);</code></pre></blockquote>
</blockquote>
<pre><code>이렇게 BIN 함수를 제외한다면 더 간단하고 불필요한 작업이 없는 쿼리가 완성된다!

-- -- --

# 🪄관련 개념
### BIN 함수
&gt; BIN() --&gt; 괄호 안의 수를 2진법으로 변환

### 비트 연산자
&gt; **비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자로 연산 대상이 되는 숫자를 이진수로 표현**하여 각 비트 단위로 AND, OR 등의 연산을 수행한다. 각 자릿수의 연산은 독립적으로 이루어진다.&lt;br&gt;&lt;/br&gt;
- **AND 연산(&amp;) : 두 비트가 모두 1일때만 1을 반환한다.**
![](https://velog.velcdn.com/images/hana_summer/post/9d4b75f5-a0e1-4043-89c7-a11a0cdaced7/image.png)
- **OR 연산(|) : 두 비트가 하나라도 1이면 1을 반환한다.**
![](https://velog.velcdn.com/images/hana_summer/post/8d496f93-b4fd-4dfa-a7d9-e548fb01fa6e/image.png)
- **XOR 연산(^) : 두 비트가 다르면 1, 같으면 0을 반환한다.**
![](https://velog.velcdn.com/images/hana_summer/post/994b3fb9-2d82-4b57-87c2-80e640ba98a6/image.png)
- **NOT 연산(~) : 비트를 반전시킨다.**
![](https://velog.velcdn.com/images/hana_summer/post/41e51c8a-7e5a-48e6-bd32-c741c009c516/image.png)

출처 
[위키원_비트연산자]: https://wiki1.kr/index.php/%EB%B9%84%ED%8A%B8%EC%97%B0%EC%82%B0%EC%9E%90
[위키원_비트연산자]

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[천.천.인] Crontab에서 Shell Script가 실행되지 않는다면?!]]></title>
            <link>https://velog.io/@hana_summer/%EC%B2%9C.%EC%B2%9C.%EC%9D%B8-Crontab%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4%EB%A9%B4</link>
            <guid>https://velog.io/@hana_summer/%EC%B2%9C.%EC%B2%9C.%EC%9D%B8-Crontab%EC%97%90%EC%84%9C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4%EB%A9%B4</guid>
            <pubDate>Mon, 16 Dec 2024 04:05:35 GMT</pubDate>
            <description><![CDATA[<h4 id="인턴을-마치고-점차-기억이-희미해지는-것을-느껴-인턴-때-경험한-트러블-슈팅이나-학습한-것들을-기록하기-위한-천천히-작성하는-인턴-경험-천천인---crontab에서-shell-script가-실행되지-않는다면">인턴을 마치고 점차 기억이 희미해지는 것을 느껴 인턴 때 경험한 트러블 슈팅이나 학습한 것들을 기록하기 위한 천천히 작성하는 인턴 경험 천.천.인! - Crontab에서 Shell Script가 실행되지 않는다면</h4>
<p><img src="https://velog.velcdn.com/images/hana_summer/post/9a03c236-4a7c-4214-b29a-88c6fa002e7f/image.png" alt=""></p>
<p>프로젝트의 마무리 단계는 그동안 작성한 크롤링 코드와 메일 발송 메인 코드를 shell 스크립트로 실행하는 작업이었다.</p>
<h2 id="🪄-shell-script">🪄 Shell Script</h2>
<blockquote>
<ul>
<li><strong>Shell</strong> : 운영체제에서 사용자가 입력하는 명령을 읽고 해석하여 실행해 주는 프로그램.</li>
</ul>
</blockquote>
<ul>
<li><strong>Shell Script</strong> : Shell에서 사용할 수 있는 명령어들을 모아서 만든 파일로, Shell을 이용하여 명령어를 순차적으로 실행시켜주는 인터프리터이다.
<a href="https://velog.io/@cnffjd95/Shell-Script-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-1">출처: [Shell Script] 기초부터 시작하기 (1)</a></li>
</ul>
<p>주로 이 Shell Script를 이용하여 자동화 작업을 실시했는데 주기를 설정하여 일정 주기마다 크롤링 코드 실행, 메일링 메인 파일 실행, 데이터 및 DB 백업의 업무를 자동화하도록 하였다.</p>
<h2 id="🪄-shell-script-실행-권한-오류">🪄 Shell Script 실행 권한 오류</h2>
<p>Crontab 사용에서 가장 흔하게 발생하는 오류는 Shell Script 실행 권한 문제로 생성한 스크립트 파일은 실행 권한을 <strong>!반드시!</strong> 추가해야 정상적인 실행이 가능하다.</p>
<pre><code># 스크립트 파일 실행 권한 추가: chmod 명령어를 사용해 스크립트에 실행 권한 추가
chmod +x /home/ubuntu/backup_files/backup.sh

# 스크립트 파일 실행 권한 확인
ls -l /home/ubuntu/backup_files/backup.sh</code></pre><p>권한 확인 시 정상적으로 실행 권한이 부여되었다면 다음과 같은 방식으로 출력이 나타나게 된다.</p>
<pre><code>-rwxr-xr-x 1 ubuntu ubuntu #### Nov 21 10:00 /home/ubuntu/backup_files/backup.sh</code></pre><ul>
<li>rmx는 소유자가 읽기, 쓰기, 실행 권한을 가지고 있음을 나타낸다.</li>
<li>중간의 r-x는 그룹 사용자, 마지막 r-x는 기타 사용자가 실행 권한을 가지고 있음을 나타낸다.</li>
</ul>
<p>이런식으로 실행 권한을 부여해주어야 정상적인 Crontab으로의 실행이 가능해진다!</p>
<h2 id="🪄-crontab-에러-시-메일-발송-오류">🪄 Crontab 에러 시 메일 발송 오류</h2>
<p>실행 중인 모든 Shell Script에 실행 권한을 부여하고 자동화가 이루어지기를 기다리던 때.. Crontab이 자동으로 정해진 일정에 따라 실행되지 않고 있음을 발견하였다! 다시 한 번 실행 권한을 부여하고 서버도 리부트 해보고 도커도 내렸다 올려보고 다양한 방법을 시도해보았지만 이 문제는 해결하지는 못하였다.
그러다 구글링을 통해 일단 Crontab 로그부터 확인해보는 것이 좋다는 조언을 발견하여 Crontab로그를 확인해본 결과 다음과 같은 에러메시지를 확인할 수 있었다.</p>
<pre><code># Crontab 로그 확인
cat /var/log/syslog | grep CRON</code></pre><p><img src="https://velog.velcdn.com/images/hana_summer/post/32073965-8cd8-4993-b6db-6d0a7645210f/image.png" alt=""></p>
<p>붉은 색으로 Cron이라고 되어 있는 부분이 에러가 발생한 부분인데 메시지를 보면  <strong>&#39;No MTA installed, discarding output&#39;</strong> 으로 되어 있다. 
이는 Crontab이 가지고 있는 기능으로 인해 발생한 에러였는데 Crontab은 실행 시에 MTA라는 메일 발송 관리자를 통해 실행 결과를 메일로 발생하는 기능을 가지고 있다! 그런데 이 MTA라는 메일 발송 관리자가 설치가 안되어 있다! 에러다! 라고 하는 것이다.. (나는 저 기능 1도 필요없는데...) </p>
<p>어쨌든 저 부분이 문제라고 하니 이를 해결해야 자동화가 이루어지고 프로젝트가 마무리될 수 있으니 어떻게든 해야했다. 다시 구글링을 해본 결과 Crontab이 원하는대로 MTA를 설치해주면 된다!는 해결방안을 발견하고 이를 실행에 옮겼다.</p>
<h3 id="🪄-해결방안1--mta를-설치해보자">🪄 해결방안1 : MTA를 설치해보자!</h3>
<p>MTA를 설치하기 위해서는 단순하게 <strong>potfix를 설치</strong>하면 된다는 것을 발견하고 바로 코드를 실행시켰다.</p>
<pre><code>$ sudo apt-get install postfix</code></pre><p>위 코드를 실행하고 설치 승인 후 다음과 같은 화면을 마주할 수 있었다.
<img src="https://velog.velcdn.com/images/hana_summer/post/0830099b-a0a2-4474-bb5c-9f9f070e2518/image.png" alt="">
도대체 이 화면은 무엇인가.. 이게 리눅스 환경에서 마주할 수 있는 환경인가... 내가 뭘 눌러야 정상적인 설치가 가능한가.... 의 무한 굴레에서 결정을 내리지 못하고 회사 서버를 망칠까봐 두려웠던 나는 결국 postfix 설치를 포기했다. (나중에 안 사실인데 뭘 눌러도 사실 크게 상관은 없었던 듯. 당시 회사 서버가 아니라 로컬 환경에서 작업을 진행했으면 뭐라도 막 설치했을텐데..)</p>
<h3 id="🪄-해결방안2--crontab-메일-기능을-사용하지-않도록-설정해놓자">🪄 해결방안2 : Crontab 메일 기능을 사용하지 않도록 설정해놓자!</h3>
<p>postfix 설치의 두려움을 뒤로 하고 새로 찾은 방법은 <strong>Crontab에서 자동으로 사용하고 있는 메일 전송 기능을 임의로 사용하지 않도록 설정</strong>하는 것이었다!(사실 실행 로그를 메일로 전송하는 기능이 <strong>전혀</strong> 필요 없었던 당시 상황에서는 이 편이 더 간편하긴 했다)</p>
<p>설정 방법은 단순하게 Crontab 명령 창에서 <strong>출력을 /dev/null로 리디렉션</strong>하면 되었다. Crontab 명령어를 설정할 때 맨 뒤에 <strong>/dev/null</strong>을 추가하여 출력을 무시하도록 하면 로그 파일 생성 뿐만 아니래 메일 전송도 이루어지지 않도록 할 수 있다.</p>
<pre><code>.sh &gt; /dev/null 2&gt;&amp;1</code></pre><p>이런식으로 Crontab 명령어에서 자동으로 실행할 sh 파일 맨 뒤에 리디렉션 명령어를 추가해주었고 그 이후 다시는 MTA 문제는 발생하지 않았다!!! </p>
<p>두 번째 해결방법이 정확한 해결방법인지에 대해서는 확신할 수 없으나 그 당시에는 해당 방법으로 MTA 문제를 해결하였으니 혹시 비슷한 문제를 겪고 있는 사람이 있다면 조금이나마 도움이 되길 바랄 뿐이다😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[천.천.인] Docker 자동실행과 에러]]></title>
            <link>https://velog.io/@hana_summer/%EC%B2%9C.%EC%B2%9C.%EC%9D%B8-Docker-%EC%9E%90%EB%8F%99%EC%8B%A4%ED%96%89%EA%B3%BC-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@hana_summer/%EC%B2%9C.%EC%B2%9C.%EC%9D%B8-Docker-%EC%9E%90%EB%8F%99%EC%8B%A4%ED%96%89%EA%B3%BC-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Thu, 12 Dec 2024 03:10:40 GMT</pubDate>
            <description><![CDATA[<h4 id="인턴을-마치고-점차-기억이-희미해지는-것을-느껴-인턴-때-경험한-트러블-슈팅이나-학습한-것들을-기록하기-위한-천천히-작성하는-인턴-경험-천천인">인턴을 마치고 점차 기억이 희미해지는 것을 느껴 인턴 때 경험한 트러블 슈팅이나 학습한 것들을 기록하기 위한 천천히 작성하는 인턴 경험 천.천.인!</h4>
<p><img src="https://velog.velcdn.com/images/hana_summer/post/9d12e4a8-d2f0-4333-97ed-73d9bd2b44dc/image.png" alt=""></p>
<h2 id="🪄-인턴-프로젝트와-db-docker">🪄 인턴 프로젝트와 DB Docker</h2>
<p>인턴에서 프로젝트를 진행하며 DB를 Docker 컨테이너로 만들어 서버에 올리는 방식으로 사용했다. 크롤링 서버이기에 크롤링 특성상 한 번에 많은 데이터가 수집되는 경우가 있어 서버 과부화로 인해 자주 서버가 다운되는 일이 많았다. 이로 인해 Docker 컨테이너에 대해 서버가 재부팅될 때마다 자동으로 재시작하도록 정책을 업데이트 하였다. </p>
<blockquote>
<h2 id="docker를-서버-부팅-시마다-자동으로-재시작하는-방법">Docker를 서버 부팅 시마다 자동으로 재시작하는 방법</h2>
<p>이미 서버에 올려진 Docker 컨테이너를 서버 재부팅 때마다 자동실행하고자 하여 다음과 같이 restart 정책을 설정해주었다.</p>
</blockquote>
<pre><code>docker update --restart always crawling_db</code></pre><h2 id="🪄-docker-restart와-에러">🪄 Docker restart와 에러</h2>
<p>이렇게 설정해둔 후 열심히 프로젝트 작업을 하고 있었으나... 서버가 재부팅되었음에도 불구하고 Docker가 자동실행되지 않았으면서 이미 실행되어 사용 중인 Docker라는 에러가 발생하였다.</p>
<blockquote>
<p>Error response from daemon: Cannot restart container crawling_db: driver failed programming external connectivity on endpoint crawling_db (): Error starting userland proxy: listen tcp4 0.0.0.0:####: bind: address already in use</p>
</blockquote>
<p>위의 에러 메시지가 나타났고 구글링을 통해 파악해보니 Docker에서 발생한 <em>&quot;blind: address already in use&quot;</em> 에러였다. 이 에러는 문자 그대로 사용 중인 포트가 이미 다른 프로세스에 의해 사용 중이라는 것을 의미하였다. 이는 주로 다음 두 가지 상황에 의해서 발생된다.</p>
<blockquote>
<h4 id="1-다른-mysqlmariadb-인스턴스가-실행-중인-경우-이미-시스템에서-mysql-또는-mariadb-서버가-실행되고-있는-경우">1. <em>다른 MySQL/MariaDB 인스턴스가 실행 중인 경우</em>: 이미 시스템에서 MySQL 또는 MariaDB 서버가 실행되고 있는 경우</h4>
<h4 id="2-docker-컨테이너가-중지된-상태로-포트를-점유하고-있는-경우-이전에-실행-중이던-docker-컨테이너가-종료되었지만-포트를-해제하지-않는-경우">2. <em>Docker 컨테이너가 중지된 상태로 포트를 점유하고 있는 경우</em>: 이전에 실행 중이던 Docker 컨테이너가 종료되었지만 포트를 해제하지 않는 경우</h4>
</blockquote>
<p>해당 상황 중 2번째 경우가 원인이었다! </p>
<blockquote>
<pre><code>docker ps</code></pre></blockquote>
<pre><code>
명령어를 사용하여 현재 실행 중인 Docker 상태를 확인했지만 실행 중인 Docker 컨테이너는 없었고
&gt;```
docker restart crawling_db</code></pre><p>명령어를 사용하여 Docker를 재시작하였을 때 위 에러 메시지가 출력되었다. 해결방법은 다음과 같다.</p>
<h2 id="🪄-docker-자동실행-에러-해결방법">🪄 Docker 자동실행 에러 해결방법</h2>
<blockquote>
<pre><code>docker ps  # 현재 실행 중인 도커 확인</code></pre></blockquote>
<pre><code>- Docker 확인 결과 실행 중인 Docker가 없음에도 이미 사용 중인  Docker라는 에러 메시지가 나타난다면</code></pre><p>sudo lsof -i :3306  # 포트를 점유하고 있는 프로세스 찾기(ex. port=3306)
sudo kill -9 <PID>  # 포트를 사용 중인 프로세스에서 pid를 찾아 kill</p>
<pre><code></code></pre><p>docker restart crawling_db : 도커 재실행!</p>
<p>```</p>
<h3 id="회고">회고</h3>
<p>처음 해당 에러를 마주했을 때 정말 당황했던 기억이 있다. 특히 DB를 날린 것이 아닌가 많이 당황했지만 자동실행으로 정상 종료가 되지 않아 발생하는 에러임을 확인하고 그 후에는 동일한 에러가 발생했을 때 익숙하게 여기고 진행했었다! 이제 Docker 에러는 그만!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM이 뭔데..? - 1]]></title>
            <link>https://velog.io/@hana_summer/LLM%EC%9D%B4-%EB%AD%94%EB%8D%B0..-1</link>
            <guid>https://velog.io/@hana_summer/LLM%EC%9D%B4-%EB%AD%94%EB%8D%B0..-1</guid>
            <pubDate>Mon, 28 Oct 2024 14:56:23 GMT</pubDate>
            <description><![CDATA[<p>갑작스럽지만 인턴 1개월 차에 챗봇 관련 멘토링에 참여하게 되었다. 그런데 LLM...? 잊어버린지 오래된 지식들을 정리하기 위해 기록해야겠다 싶어 다시 시작하는 벨로그! 내가 보려고 적는 벨로그!</p>
<h2 id="그래서-llm이-뭔데">그래서 LLM이 뭔데?</h2>
<blockquote>
<p>LLM이란 대형 언어 모델로 다양한 자연어 처리(NLP) 작업을 수행할 수 있는 딥러닝 알고리즘이라고 할 수 있다. 즉, <strong>딥러닝 기반의 언어 모델</strong>인 셈이다.</p>
</blockquote>
<h2 id="임베딩">임베딩?</h2>
<blockquote>
<p>임베딩이란 <strong>데이터의 의미와 특징을 숫자로 표현</strong>한 것이다. LLM에서 임베딩을 통해 벡터화된 숫자는 사람들이 의미를 파악하기는 어렵지만, 서<strong>로 다른 단어나 문서로 추출된 임베딩 간 거리를 계산하여 의미적 관계를 파악</strong>할 수 있게 한다. 대표적인 예로 &#39;워드 투 백&#39;이 있다!
그러면 임베딩은 왜 필요한데? AI모델은 기본적으로 숫자 형태만 입력받을 수 있기에 문자를 숫자로 변형하여 입력하는 과정이 필요하다!</p>
</blockquote>
<h2 id="전이학습">전이학습?</h2>
<blockquote>
<p>LLM에서는 대규모 데이터셋에 대한 <strong>사전 학습</strong>과 특정한 문제를 해결하기 위한 데이터로 추가학습하는 <strong>미세 조정</strong>으로 학습이 이루어진다. 사전 학습에서는 많은 양의 데이터를 노출시켜 언어에 대한 넓은 이해를 학습할 수 있게 한다. 이러한 학습 결과를 바탕으로 LLM을 특정 작업 및 도메인에 활용할 수 있도록 미세 조정을 한다. 이러한 일련의 과정이 <strong>전이학습</strong>이다.</p>
</blockquote>
<h2 id="sllm">sLLM?</h2>
<blockquote>
<p>작은 규모의 언어모델로 LLM과 같은 기능을 수행하지만 모델의 크기가 상대적으로 작다는 특징이 있다. 주로 FINE-TUNING을 통해 정확도를 높인다. 그렇기에 LLM에 비해 특정 도메인에 특화된 작업 수행이 가능하며 처리 속도가 빠르다!</p>
</blockquote>
<h2 id="환각-현상과-rag">환각 현상과 RAG</h2>
<blockquote>
<p>&#39;환각 현상&#39;이란 잘못된 정보나 실제로 존재하지 않는 정보를 만들어 내는 현상을 말한다. 이를 줄이기 위해 나타난 것이 RAG(검색 증각 생성) 기술이다. RAG는 LLM이 답변을 생성하기 전 외부의 학습 데이터를 추가하여 답변의 정확도를 높이는 기술을 말한다.</p>
</blockquote>
<h6 id="출처-httpswwwigloocokrsecurity-informationragretrieval-augmented-generation-llmec9d98-ed959ceab384ec9980-ebb3b4ec9984-ebb0a9ebb295">출처: <a href="https://www.igloo.co.kr/security-information/ragretrieval-augmented-generation-llm%EC%9D%98-%ED%95%9C%EA%B3%84%EC%99%80-%EB%B3%B4%EC%99%84-%EB%B0%A9%EB%B2%95/">https://www.igloo.co.kr/security-information/ragretrieval-augmented-generation-llm%EC%9D%98-%ED%95%9C%EA%B3%84%EC%99%80-%EB%B3%B4%EC%99%84-%EB%B0%A9%EB%B2%95/</a></h6>
<h3 id="이렇게만-공부해서는-감이-안온다-코드로-더-공부해-봐야지">이렇게만 공부해서는 감이 안온다.. 코드로 더 공부해 봐야지......!</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] SQL 자격검정 실전문제(노랭이) 1과목 1장, 2장 오답 복습]]></title>
            <link>https://velog.io/@hana_summer/SQLD-SQL-%EC%9E%90%EA%B2%A9%EA%B2%80%EC%A0%95-%EC%8B%A4%EC%A0%84%EB%AC%B8%EC%A0%9C%EB%85%B8%EB%9E%AD%EC%9D%B4-1%EA%B3%BC%EB%AA%A9-1%EC%9E%A5-2%EC%9E%A5-%EC%98%A4%EB%8B%B5-%EB%B3%B5%EC%8A%B5</link>
            <guid>https://velog.io/@hana_summer/SQLD-SQL-%EC%9E%90%EA%B2%A9%EA%B2%80%EC%A0%95-%EC%8B%A4%EC%A0%84%EB%AC%B8%EC%A0%9C%EB%85%B8%EB%9E%AD%EC%9D%B4-1%EA%B3%BC%EB%AA%A9-1%EC%9E%A5-2%EC%9E%A5-%EC%98%A4%EB%8B%B5-%EB%B3%B5%EC%8A%B5</guid>
            <pubDate>Mon, 20 May 2024 11:06:31 GMT</pubDate>
            <description><![CDATA[<h3 id="5-데이터-독립성의-구성요소">5. 데이터 독립성의 구성요소</h3>
<ul>
<li>개념 스키마: 통합된 모든 사용자 관점과 관련</li>
<li>내부스키마: 물리적 저장구조 표현</li>
<li><strong>외부 스키마:  View 단계는 사용자 관점으로 구성</strong></li>
<li>논리적 데이터 독립성을 고려하는 단계는 외부단계-개념적 단계(물리적 데이터 독립성 고려는 개념-내부단계)</li>
</ul>
<hr>
<h3 id="7-erd-설명">7. ERD 설명</h3>
<ul>
<li>|→1 / o→0 / 새발→N ⇒ 1:N 관계(고객과 주문 2개 테이블)</li>
<li>고객테이블(부모엔터티)의 고객번호는 PK. 유니크&amp;NOT NULL</li>
<li>주문테이블(자식엔터티)의 제품번호가 PK. 고객테이블의 고객번호 참조(FK)</li>
<li>부모 엔터티에 데이터가 입력될 때 자식 엔터티에 해당 값 존재 여부와 상관없이 입력 가능 → 새로운 고객 데이터 입력하는 것은 주문테이블에 해당 고객번호 존재 여부와 상관없이 가능.</li>
</ul>
<hr>
<h3 id="9-엔터티로-가장-적절한-것">9. 엔터티로 가장 적절한 것?</h3>
<ul>
<li>S병원 → 1개.(엔터티로 성립X WHY? 2개 이상이어야 하기에) / 유일한 식별자X</li>
<li>환자 → 2개 이상의 속성/인스턴스 가져야 함 —&gt; 여러 명(2개 이상 인스턴스) / 이름, 주소(2개 이상 속성)</li>
<li>이름, 주소 → 엔터티의 속성으로 볼 수 있음(인스턴스X)</li>
</ul>
<hr>
<h3 id="13-엔터티에-이름-부여하는-적절한-방법">13. 엔터티에 이름 부여하는 적절한 방법?</h3>
<ul>
<li>엔터티 생성 의미대로 자연스럽게 부여 / 실제 업무에 사용하는 용어</li>
<li>약어X, 단수명사 / 유일 이름(중복X)</li>
</ul>
<hr>
<h3 id="14-업무에서-필요로-하는-인스턴스에서-관리하고자-하는-의미상-더-이상-분리되지-않는-최소의-데이터-단위">14. 업무에서 필요로 하는 인스턴스에서 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위</h3>
<ul>
<li><strong>속성</strong></li>
<li>엔터티: 업무에 필요한 정보 저장, 관리 위한 집합 / 인스턴스의 집합</li>
</ul>
<hr>
<h3 id="15-속성에-대한-설명">15. 속성에 대한 설명?</h3>
<ul>
<li>엔터티 설명, 성격 구체적으로 나타냄 → 구체적 정보 제공</li>
<li>하나의 엔터티 → 2개 이상의 인스턴스 집합</li>
<li>하나의 인스턴스에서 각각의 속성 → 1개의 속성값</li>
<li>속성도 집합이다</li>
</ul>
<hr>
<h3 id="16-정규화-작업">16. 정규화 작업</h3>
<ul>
<li><p>제1정규화: 하나의 행과 컬럼의 값이 반드시 한 값만 입력되도록 행 분리</p>
</li>
<li><p>제2정규화: 제1정규화 진행한 테이블에 대해 완전함수종속 만들도록 테이블 분해(완전함수종속: PK가 2개 이상일 때 발생, PK의 일부와 종속되는 관계가 있뎐 분리.) → 부분함수종속성 깨기</p>
<p>  (부분함수종속: 일반 속성이 기본키 한 개에만 종속 / 완전함수종속: 일반 속성이 기본키 모두에 종속)</p>
</li>
</ul>
<hr>
<h3 id="20-데이터-모델링의-관계">20. 데이터 모델링의 관계</h3>
<ul>
<li>ERD: 존재에 의한 관계 / 행위에 의한 관계 → 관계 연결 시, 단일화된 표기법</li>
<li>UML: 클래스다이어그램의 관계 중 연관관계/의존관계 있고 각각 실선,점선 표기</li>
<li>연관관계: 존재적 관계, 의존관계: 행위적 관계</li>
<li>연관관계 → 소스코드에서 멤버변수로 선언하여 사용 / 의존관계 → 오퍼레이션에서 파라미터 등으로 이용</li>
</ul>
<hr>
<h3 id="22-데이터-독립성---논리적물리적">22. 데이터 독립성 - 논리적/물리적</h3>
<ul>
<li><p>논리적 독립성: 응용프로그램에 영향 없이 통합구조 변경(논리적 구조 변경) 가능 / 개념 스키마 변경되어도 외부 스키마에는 영향X</p>
</li>
<li><p>물리적 독립성: 응용프로그램, 개념스키마에 영향 없이 저장장치 구조변경(물리적 구조 변경) 가능 / 내부(물리) 스키마 변경되어도 외부,개념(논리) 스키마에 영향X</p>
<p>  물리적 구조 변경 → 데이터베이스의 파일 구조 변화, 데이터베이스의 색인 구조 변화…</p>
</li>
</ul>
<hr>
<h3 id="28-식별자로-적절">28. 식별자로 적절?</h3>
<ul>
<li>주식별자 지정 시 이름과 같이 동명이인 발생 가능성이 있는 경우(유일성x)는 주식별자로 X</li>
</ul>
<hr>
<h3 id="34-속성-a-b-c-d-e로-구성된-릴레이션에서-다음과-같이-함수-종속성이-존재할-때-이-릴레이션의-후보키로-적절하지-않은-것">34. 속성 (a, b, c, d, e)로 구성된 릴레이션에서 다음과 같이 함수 종속성이 존재할 때, 이 릴레이션의 후보키로 적절하지 않은 것?</h3>
<p>[ ab →cde, e → b, d →ab]</p>
<ul>
<li>ab는 자신인 ab와 cde를 결정하므로 모든 속성 결정 → 후보키</li>
<li>e → b 양쪽에 a 추가하면 ae →ab → cde이므로 ae는 모든 속성 결정 → 후보키</li>
<li>d →ab, ab → cde 이므로 d → cde d는 모든 속성 결정 → 후보키</li>
</ul>
<hr>
<h3 id="36-아래-엔터티에-필요한-정규화와-분리된-스키마-구조로-적절한-것">36. 아래 엔터티에 필요한 정규화와 분리된 스키마 구조로 적절한 것?</h3>
<p><img src="https://velog.velcdn.com/images/hana_summer/post/13938808-58d3-4445-a3ff-cca2ca0815c4/image.png" alt=""></p>
<ul>
<li>엔터티에 포함되는 속성은 모두  PK에 종속되어야 함. 즉, 관리점번호~통신번호 속성들이 모두 관서번호, 납부자 번호에 종속되어야 함. 현재는 직급명, 통신번호만 종속 상태 → 부분함수종속 상태.</li>
<li>2차 정규화를 통해 PK에 종속되어 있지 않은 일반 속성인 관리점번호, 관서명, 상태, 관서등록일자는 현재 관서번호에 종속되어 있으므로 관서번호를 PK로하여 종속되도록 정규화해주어야 함.</li>
</ul>
<hr>
<h3 id="38-테이블에서-나타날-수-있는-현상">38. 테이블에서 나타날 수 있는 현상?</h3>
<ul>
<li><p>칼럼에 의한 반복적 속성값을 갖는 형태(A유형기능분류코드1~~)는 속성의 원자성을 위배한 1차 정규화 ‘대상’ → 현재 1차 정규화된 형태 X</p>
</li>
<li><p>유형기능분류코드에 대해 WHERE절에 조건으로 들어오는 값이 있으므로 PK와 이에 대한 인덱스 있으면 성능 저하</p>
</li>
<li><p>조회 성능을 위해 유형기능분류코드 각각에 대해 개별로 인덱스를 모두 생성할 경우 입력, 수정, 삭제 때 성능이 저하되므로 제1차 정규화 수행 후 인덱스 적용하는 것이 좋다.</p>
<p>  → 반복적 속성 나열 형태엔느 각 속성에 대해 ‘OR’ 연산자로 연결된 조건들이 사용되는데, 이 때 어느 하나의 속성이라도 인덱스 정의X , 성능 저하 / 모든 반복 속성에 인덱스 정의 → 입력, 수정, 삭제 성능 저하</p>
</li>
</ul>
<hr>
<h3 id="39-아래-논리-데이터-모델을-3차-정규화까지-수행-시-도출되는-엔터티-수">39. 아래 논리 데이터 모델을 3차 정규화까지 수행 시 도출되는 엔터티 수?</h3>
<p>(1) 제1차 정규형: 반복X</p>
<ul>
<li>LAB실~ 반복 / 대출도서번호~ISBN 반복(WHY? 1번의 대출에 여러 도서 빌릴 수 있기에)</li>
<li>학생 / LAB실 이용 / 도서대출 / 대출도서</li>
</ul>
<p><strong>[학생]</strong> # 학번 *성명 *학과번호 *학과명</p>
<p><strong>[LAB실이용신청]</strong> # LAB실이용신청학번(FK) # LAB실이용신청순번 *LAB실이용신청일 *LAB실이용시작일 *LAB실이용만기일 *LAB실이용승인교수번호 *LAB실이용승인교수명</p>
<p><strong>[도서대출]</strong> # 대출번호 *대출자번호(FK) *대출자명 *대출자신분구분(학생,교수) *대출일자</p>
<p><strong>[대출도서]</strong> # 대출번호(FK) # 대출도서번호(FK) o 반납일자</p>
<p><strong>[도서]</strong> # 도서번호 *도서명 o 출판사명 o 출판년월 o 대표저자명 o ISBN</p>
<p>(2) 제2차 정규형: 일반 속성은 식별자 전체 속성에 완전 종속</p>
<ul>
<li>대출도서 엔터티에서 대출번호, 대출도서번호가 식별자 2개인데, 일반속성인 대출도서명~ISBN은 모두 대출도서번호에 종속</li>
<li>대출도서를 대출도서 + 도서 엔터티로 분리</li>
</ul>
<p><strong>[도서대출]</strong> # 대출번호 *대출자번호(FK) *대출자신분구분(학생,교수) *대출일자</p>
<p><strong>[대출도서]</strong> # 대출번호(FK) # 대출도서번호(FK) o 반납일자</p>
<p><strong>[도서]</strong> # 도서번호 *도서명 o 출판사명 o 출판년월 o 대표저자명 o ISBN</p>
<p>(3) 제3차 정규형: 식별자 제외한 나머지 속성 간 종속X</p>
<ul>
<li>학생 엔터티: 학과번호, 학과명 종속관계이므로 분리 → 학생 엔터티를 학생 + 학과로 분리</li>
<li>LAB실 이용 엔터티: LAB실이용승인교수번호, LAB실이용승인교수명은 종속관계이므로 분리 → LAB실 이용 엔터티를 LAB실 이용 + 교수로 분리</li>
</ul>
<p><strong>[학생]</strong> # 학번 *성명 *학과번호(FK)</p>
<p><strong>[학과]</strong> # 학과번호 *학과명</p>
<p><strong>[LAB실이용신청]</strong> # LAB실이용신청학번(FK) # LAB실이용신청순번 *LAB실이용신청일 *LAB실이용시작일 *LAB실이용만기일 *LAB실이용승인교수번호(FK)</p>
<p><strong>[교수]</strong> # 교수번호 *교수명</p>
<p>⇒ 학생 / 학과 / LAB실 이용 / 교수 / 도서대출 / 대출도서 / 도서 →7개</p>
<hr>
<h3 id="40-어떤-릴레이션-r-이-제2정규형이고-기본키에-속하지-않은-속성-모두가-기본키에-이행적-함수종속이-아닐-때-제3정규형에-속한다">40. 어떤 릴레이션 R 이 ‘제2정규형’이고, 기본키에 속하지 않은 속성 모두가 기본키에 이행적 함수종속이 아닐 때 ‘제3정규형’에 속한다.</h3>
<ul>
<li>릴레이션이란 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위. 즉, 릴레이션은 DB 테이블.</li>
</ul>
<hr>
<h3 id="41-데이터-모델링-정규화">41. 데이터 모델링 정규화</h3>
<ul>
<li>정규화는 <strong>‘논리 데이터 모델’</strong> 상세화 과정의 대표적 활동, 논리 데이터 모델의 일관성 확보, 중복 제거하여 속성들이 가장 적절한 엔터티에 배치되도록 함.</li>
<li>제3정규형을 만족하는 엔터티의 일반속성은 주식별자 전체에 종속적 → WHY? 제3정규형 만족은 제2정규형도 만족이니까</li>
</ul>
<hr>
<h3 id="44-수강지도-엔터티-만들었을-때-이에-해당하는-정규형과-정규화-대상으로-적절한-것">44. 수강지도 엔터티 만들었을 때 이에 해당하는 정규형과 정규화 대상으로 적절한 것?</h3>
<p><img src="https://velog.velcdn.com/images/hana_summer/post/23a66a9e-0f5a-4baa-913a-4a329f047725/image.png" alt=""></p>
<ul>
<li>PK에 대해 반복되는 값 존재X → 1차 정규형 만족</li>
<li>지도교수명, 학과명이 학번에만 종속되어 있으므로 부분함수종속성 → 2차 정규화 대상</li>
</ul>
<hr>
<h3 id="47-테이블-변환시-적절">47. 테이블 변환시 적절?</h3>
<ul>
<li>이미 제1정규화 수행되어 있는 테이블은 제1정규화 수행한 것에 해당X</li>
<li>정규화 → 성능 저하</li>
</ul>
<hr>
<h3 id="48-순차적으로-수행되는-작업-a-b가-반드시-모두-수행되거나-모두-수행x여야-한다면">48. 순차적으로 수행되는 작업 A, B가 반드시 모두 수행되거나 모두 수행X여야 한다면?</h3>
<ul>
<li>A, B 하나의 트랜잭션으로 묶어 처리 → 원자성 특성</li>
<li>A,B 수행 후 동시 커밋(부분 커밋X)</li>
</ul>
<hr>
<h3 id="49-null값-설명">49. NULL값 설명</h3>
<ul>
<li>NULL값에 어떤 숫자 더해도 NULL</li>
<li>NULL값에 어떤 숫자 비교해도 UNKNOWN</li>
<li>NULL=NULL → FALSE/UNKNOWN</li>
<li>집계 함수 계산 시 NULL은 계산에서 제외</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python Statistics 기초 02_06]]></title>
            <link>https://velog.io/@hana_summer/Python-Statistics-%EA%B8%B0%EC%B4%88-0206</link>
            <guid>https://velog.io/@hana_summer/Python-Statistics-%EA%B8%B0%EC%B4%88-0206</guid>
            <pubDate>Thu, 16 May 2024 11:33:39 GMT</pubDate>
            <description><![CDATA[<h4 id="가설검정에-대해-이론적으로-학습하고-실제-코드로-구현하여-코드를-통해-가설검정을-실시한-날">가설검정에 대해 이론적으로 학습하고 실제 코드로 구현하여 코드를 통해 가설검정을 실시한 날.</h4>
<h3 id="가설검정">가설검정</h3>
<p>1) 연속형 데이터</p>
<ul>
<li>변수들간의 관계 확인: 회귀분석/상관분석</li>
<li>변수들간의 차이 확인<ul>
<li>one-samle t-test(표본의 평균이 모집단 대표할 수 있는지 검정)</li>
<li>two-sample t-test(두 표본의 평균이 차이가 있는지 검정)</li>
<li>등분산성 검정</li>
</ul>
</li>
</ul>
<p>2) 불연속성의 범주형 데이터: 두 변수들의 관계 확인 -&gt; 카이제곱검정</p>
<hr>
<h3 id="용어정리">용어정리</h3>
<ul>
<li>귀무가설: 통계학에서 버릴 것을 가정하는 가설</li>
<li>대립가설: 귀무가설과 반대되는 가설</li>
<li>유의수준: 통계적 가설검정에서 사용되는 기준값.</li>
<li>유의확률: 귀무가설이 맞다고 가정할 때 표본으로부터 관측된 데이터가 관축될 확률</li>
<li>신뢰구간: 모평균이 어느 범위 안에 있는지를 확률적으로 보여주는 방법</li>
</ul>
<hr>
<h3 id="one-sample-t-test">one-sample t-test</h3>
<pre><code>from scipy.stats import ttest_1samp
import scipy.stats as stats 

# 가설설정
null_hypothesis_mean = 

# one-sample t-test 수행
t_statistic, p_value = stats.ttest_1samp(, null_hypothesis_mean)</code></pre><p>사용하여 one-sample t-test 수행하였다. 이 때, 자유도는 n-1로 산정되었다.</p>
<h3 id="two-sample-t-test">two-sample t-test</h3>
<pre><code># two-sample t-test 수행
t_statistic, p_value = stats.ttest_ind(S[&#39;A&#39;], S[&#39;B&#39;])</code></pre><p>two-sample t-test는 one-sample과 다르게 가설을 설정하지 않고 두 변수간 차이를 비교하여 이루어졌다. 자유도도 n1+n2-2로 설정되었다.</p>
<h3 id="카이제곱-검정">카이제곱 검정</h3>
<pre><code>from scipy.stats import chi2_contingency</code></pre><p>사용하여 두 변수간 관계를 비교하였다.</p>
<p>여러 가설검증 방식을 배우며 데이터의 유형(연속형/범주형)을 구분하는 것이 데이터 분석에서 중요하다는 것에 대해 알게 되었고, 실제 데이터를 접할 때 이것이 어떤 유형인지 빠르게 파악할 수 있도록 하는 것이 중요하다는 생각이 들었다.</p>
<h4 id="현재에서의-회고-아직도-연속형범주형을-구분하는-것을-헷갈려한다-과정을-지나오며-여러-데이터를-보았는데-아직도-명확히-구분이-어려운-것을-보면-의식적으로라도-데이터의-유형을-파악하려는-노력이-필요하다는-것을-느낀다">현재에서의 회고) 아직도 연속형/범주형을 구분하는 것을 헷갈려한다. 과정을 지나오며 여러 데이터를 보았는데 아직도 명확히 구분이 어려운 것을 보면 의식적으로라도 데이터의 유형을 파악하려는 노력이 필요하다는 것을 느낀다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python Statistics 기초 02_05]]></title>
            <link>https://velog.io/@hana_summer/Python-Statistics-%EA%B8%B0%EC%B4%88-0205</link>
            <guid>https://velog.io/@hana_summer/Python-Statistics-%EA%B8%B0%EC%B4%88-0205</guid>
            <pubDate>Thu, 16 May 2024 10:58:19 GMT</pubDate>
            <description><![CDATA[<h4 id="이론이나-spss로만-접해왔던-통계를-코드로-접했던-첫-날">이론이나 spss로만 접해왔던 통계를 코드로 접했던 첫 날</h4>
<h3 id="data-eda-데이터를-여러-방법으로-탐색하는-과정">Data EDA: 데이터를 여러 방법으로 탐색하는 과정.</h3>
<ul>
<li>EDA라는 것에 대해 처음 접하고 코드를 짜봤다. 코드를 작성하는것에 따라 다양하게 데이터가 분석되어 나오는 것이 신기했다.<h3 id="여러-새로운-코드에-대해-학습했다">여러 새로운 코드에 대해 학습했다.</h3>
<pre><code># 데이터 프레임의 형태, 행/열을 보는 것
.shape
# &#39;year&#39; 열의 값을 &quot;/&quot;를 기준으로 분할하여 첫 번째 부분을 새로운 열 &#39;year_&#39;에 저장
academic[&#39;year_&#39;] = academic[&#39;year&#39;].str.split(&quot;/&quot;, expand=True)[0]
# []안의 숫자는 리스트의 순서 의미. 
# split후 리스트화된 데이터를 가져오고자할 때 원하는 리스트의 번호 가져올 수 있게 하는 것.
academic[&#39;isoweek&#39;] = academic[&#39;year&#39;].str.split(&quot;/&quot;, expand=True)[1]
# 중복 포함 숫자 셈 -&gt; count()
# 중복 불포함 숫자 셈 -&gt; nunique()
# 어디에 조인할 것인지 결정 -&gt; how
# 무슨 컬럼 기준으로 조인할 것인지 결정 -&gt; on
# &#39;insurance_df&#39; 데이터프레임의 모든 열에 대한 요약 통계를 계산
insurance_df.describe(include=&#39;all&#39;)
# corr() -&gt; 범주형 데이터
# merge -&gt; 데이터 가로로 합침
# concat -&gt; 데이터 세로로 합침</code></pre>데이터 분석 시 사용되는 여러 코드에 대해 많이 학습한 날이었다. 나중에 편하게 사용할 수 있도록 코드의 의미와 사용방법에 대해 익혀두어야 할 필요성을 느꼈다.</li>
</ul>
<hr>
<h5 id="현재에서의-회고-데이터-분석의-처음-단계에서-많이-사용하는-코드들을-다양하게-배웠던-것-같다-아직도-자연스럽게-사용하지-못하는-코드들이-있지만-더-반복해서-내것으로-만들도록-노력해야될-것-같다">현재에서의 회고) 데이터 분석의 처음 단계에서 많이 사용하는 코드들을 다양하게 배웠던 것 같다. 아직도 자연스럽게 사용하지 못하는 코드들이 있지만 더 반복해서 내것으로 만들도록 노력해야될 것 같다.</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초 01_31]]></title>
            <link>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0131</link>
            <guid>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0131</guid>
            <pubDate>Wed, 15 May 2024 13:15:36 GMT</pubDate>
            <description><![CDATA[<h2 id="실제-데이터를-분석하여-보고서를-작성하는-실습을-진행하였다">실제 데이터를 분석하여 보고서를 작성하는 실습을 진행하였다.</h2>
<hr>
<h4 id="한국자산관리공사_국유부동산-매각현황-데이터를-활용하여-데이터를-분석하였다-데이터-분석은-다음-4개의-가설을-세워-진행되었다">&#39;한국자산관리공사_국유부동산 매각현황&#39; 데이터를 활용하여 데이터를 분석하였다. 데이터 분석은 다음 4개의 가설을 세워 진행되었다.</h4>
<h5 id="가설1-상위-팀과-하위-팀-간-매각-금액이-2배-이상-차이를-보이지-않을-것이다">가설1) 상위 팀과 하위 팀 간 매각 금액이 2배 이상 차이를 보이지 않을 것이다.</h5>
<h5 id="가설2-연도별-매각금액-추이는-우상향-그래프를-보일-것이다">가설2) 연도별 매각금액 추이는 우상향 그래프를 보일 것이다.</h5>
<h5 id="가설3-가장-매각-면적이-큰-지역은-강원도일-것이다">가설3) 가장 매각 면적이 큰 지역은 강원도일 것이다.</h5>
<h5 id="가설4-가장-매각이-많은-때는-12월일-것이다">가설4) 가장 매각이 많은 때는 12월일 것이다</h5>
<h5 id="가설5-처분-구분-중-가장-많은-비율을-차지하는-것은-매각수의일-것이다">가설5) 처분 구분 중 가장 많은 비율을 차지하는 것은 매각수의일 것이다.</h5>
<hr>
<p>데이터 분석 과정은 다음과 같이 이루어졌다.</p>
<p>1) 매각 금액이 가장 많은 팀과 하위 팀의 차이를 확인하고자 시각화를 사용하였다. 각 팀별 매각 금액 차이 비교 뿐만 아니라 가장 높은 팀과 다른 팀의 두 분류로 나누어 비교하여 시각화하는 방법을 사용햐였다.
<img src="https://velog.velcdn.com/images/hana_summer/post/6d36d8e7-1d1e-4b87-9190-631c2f3fcbba/image.png" alt="">
<img src="https://velog.velcdn.com/images/hana_summer/post/cd3d8f41-55f2-4e7e-9abc-094cbfc07322/image.png" alt=""></p>
<p>2) 연도별 매각금액 추이를 확인하기 위해 선그래프를 그려 확인하였다.
<img src="https://velog.velcdn.com/images/hana_summer/post/fb63a63c-35c5-4e87-82fd-3f185f71b3fb/image.png" alt=""></p>
<p>3) 지역별 매각 면적을 확인하기 위해 바그래프를 통해 상위 5개 지역의 매각 면적을 확인하였다.
<img src="https://velog.velcdn.com/images/hana_summer/post/6f8804e6-cbbf-45f5-89e7-cdc4ea3ab20b/image.png" alt=""></p>
<p>4) 월별 매각 금액을 비교하기 위해 바그래프를 사용하여 비교하였다.
<img src="https://velog.velcdn.com/images/hana_summer/post/4f939faf-7018-4b45-90d4-675184a34e68/image.png" alt=""></p>
<p>5) 처분 구분별 비율을 확인하기 위해 파이차트를 활용하여 분석하였다.
<img src="https://velog.velcdn.com/images/hana_summer/post/662fa93e-3241-49b6-a7cc-a465034d2d76/image.png" alt=""></p>
<ul>
<li>기본적인 데이터를 주로하여 연습식으로 데이터분석을 하다 실제적인 데이터분석을 처음하여 아직 부족한 부분을 많이 느꼈다. 분석하는 분석가의 관점에 따라 같은 데이터라도 다양하게 분석이 이루어지는 것을 보며 분석가로서의 경험이 중요하다는 것을 알게 되었다.</li>
</ul>
<p>현재에서의 회고) 그래프 색상 무지개말고.. 가시성을 고려하여 시각화하자..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초 02_01]]></title>
            <link>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0201</link>
            <guid>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0201</guid>
            <pubDate>Wed, 15 May 2024 12:49:32 GMT</pubDate>
            <description><![CDATA[<h4 id="이번-수업에서는-프로젝트-진행-시-착수보고서-작성-및-발표자료-작성-시-유의사항에-대해-구체적으로-학습하였다">이번 수업에서는 프로젝트 진행 시 착수보고서 작성 및 발표자료 작성 시 유의사항에 대해 구체적으로 학습하였다.</h4>
<hr>
<h3 id="착수보고서-작성-시-유의사항">착수보고서 작성 시 유의사항</h3>
<ul>
<li>프로젝트 시에는 착수보고서, 결과보고서, 산출물, 발표자료 제출이 필수된다.</li>
<li>착수보고서는 제안요청서의 내용 요약 및 실현 가능/불가능 여부 작성하여 제출(조건표를 통해 작성).</li>
<li>실현 불가능이거나 부분가능인 경우 이유를 명시해야 한다. 불가능의 경우 어떻게 하면 가능할 수 있는지 추가 제안을 함께 명시해야 한다(ex. 대체, 시간 연장, 교육 추가 등).</li>
<li>내용은 짧아도 괜찮으니 부풀림X</li>
<li>요약 문단은 필수로 포함되어야 하며 두괄식으로 작성하기!</li>
<li>국제표준 문서 사용(odf, pdf, docx, pptx, odp).</li>
<li>영문약어 뿐만 아니라 약어 사용 시 모두 설명 필요. 약어를 정리해서 주석으로 표시하는 것도 좋다.</li>
<li>착수보고서에 대해서는 제안자와의 사전 협의가 반드시 요구된다.</li>
<li>최종 프로젝트에서는 클라이언트의 의견이 최우선되어야 한다.
  1) 일반현황: 관리 책임자 중심 기술. 분석작업에서는 기본적으로 전체참여 필요.
  2) 전략 및 방법론: 콘텐츠가 들어가야하는 경우 콘텐츠 정의서 필요하다. 개발방법론은 기술 및 기능 정의서 요약을 포함하여 작성되는 경우가 많다.
  3) 기술 및 기능: 스토리보드 사용. 필요 시 와이어프레임 내용으로 작성.
  4) 성능 및 품질
  5) 프로젝트 관리: 일정계획의 경우 WBS를 잘 작성하면 생략 가능.<h3 id="분석-계열-보고서-작성-시-유의사항">분석 계열 보고서 작성 시 유의사항</h3>
</li>
<li>IMRaD 양식 기반으로 하며 키워드 설명이 있으면 좋다!</li>
<li>서론에는 목적을 명확히 명시해야 한다. 결과에는 코드를 그대로 보고서에 쓰는 것이 아니며 의사코드 및 순서도를 사용하여 개발 구조를 보여주는 것이 좋다.</li>
<li>데이터 자료, 파이썬 패키지 모두 인용을 적어야 한다.</li>
</ul>
<hr>
<h4 id="전처리-및-데이터-분석에-대한-방법도-함께-학습하였다">전처리 및 데이터 분석에 대한 방법도 함께 학습하였다.</h4>
<h3 id="데이터-전처리-데이터를-정보로-바꾸는-작업">데이터 전처리: 데이터를 정보로 바꾸는 작업</h3>
<ul>
<li>누락 값을 적당히 처리해야 데이터 분석에 용이하다.</li>
<li>오차: 수정하거나 명확한 오차 수정이 모호한 경우 다른 방법으로 해결해야 한다.</li>
<li>이상치: 다른 데이터와 대조 등의 방법을 통해 수정해야 한다.</li>
<li>데이터 클리닝: 중복 삭제, 관련 없는 데이터 삭제, 대소문자 일치, NA표기 통일, 이상치 처리, 누락 데이터 처리, 수정된 데이터 평가 등이 포함.</li>
<li>데이터 통합: 동일한 데이터 통합, 두 데이터 간 차이 확인, 같은 의미 가지는 데이터 검토 등이 포함.</li>
<li>데이터 변환: 단위 변환, 파싱, 형태 변환, 여러 의미를 가진 데이터의 경우 분리 저장 등이 포함.</li>
<li>데이터 축소: 차원 축소(PCA, LDA), 유효숫자 변경, 수량 감소, 데이터 속성 제거, 클러스터링, 샘플링(랜덤샘플링 등), 데이터 용량 축소 등이 포함.</li>
<li>표준화, 정규화<h3 id="데이터-분석">데이터 분석</h3>
<pre><code>.head(n) # 위에서 n번째 줄까지 본다.
.unique() # 분류에서 종류별로 하나씩 본다.
.dropna(how= ,axis=0) # how=all -&gt; 모두 결측치일 때 / how=any -&gt; 하나만이라도 결측치 있을떄
.inplace=True # 실제 데이터프레임에도 변경된 형태 적용.</code></pre></li>
<li>직접 데이터프레임에 적용되는 함수는 함부로 적용하지 말자!</li>
</ul>
<p>현재에서의 회고) 데이터 전처리는 어떤 작업을 할 때도 가장 중요하게 이루어지는 작업이기 때문에 어떤 작업들이 있는지 여러번 해보며 익히는 것이 중요하다!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초 01_30]]></title>
            <link>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0130</link>
            <guid>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0130</guid>
            <pubDate>Sun, 12 May 2024 12:46:26 GMT</pubDate>
            <description><![CDATA[<h1 id="함수">함수</h1>
<ul>
<li>패키지/자료형.함수(패러미터=매개변수)</li>
<li>함수 이름은 자유롭게 / 값 0, x 상관 없음 - 값 지정은 임의 지정이므로 다른 변수랑 관계X, 이름 달라도 괜찮음.</li>
</ul>
<pre><code>def asdf(G):
    return G+10*2</code></pre><h5 id="리스트-컴프리헨션-list-안에-for-반복문-넣은-것으로-for문을-간단하게-쓰기-위해-자주-사용-처음봤을-때는-코드가-오히려-복잡해보였지만-후반에는-간단하게-코드를-작성하는데-도움이-되므로-읽는-방법과-사용방법을-익혀두자">리스트 컴프리헨션: list 안에 for 반복문 넣은 것으로 for문을 간단하게 쓰기 위해 자주 사용! 처음봤을 때는 코드가 오히려 복잡해보였..지만 후반에는 간단하게 코드를 작성하는데 도움이 되므로 읽는 방법과 사용방법을 익혀두자!</h5>
<pre><code>[i if i%2==0 else &#39;x&#39; for i in range(5)]</code></pre><h5 id="lambda-x-→-무명-함수--대상이-정의하는-값-각-하나하나를-x라고-간주하겠다-반복문의-영향x-조건을-적용할-때-자주-사용되는-함수로-이것도-생각보다-자주-사용하게-되므로-익혀두면-도움이-될-것-같다">lambda x: → 무명 함수 / 대상이 정의하는 값 각 하나하나를 x라고 간주하겠다. 반복문의 영향x. 조건을 적용할 때 자주 사용되는 함수로 이것도 생각보다 자주 사용하게 되므로 익혀두면 도움이 될 것 같다.</h5>
<pre><code>df[2]=df[2].apply(lambda x:f&#39;이 숫자는 {x} 입니다.&#39;)</code></pre><h1 id="시각화">시각화</h1>
<p>선 그래프</p>
<ul>
<li>plt.plot(x축, y축)</li>
<li>plt.show()
<img src="https://velog.velcdn.com/images/hana_summer/post/5549f24c-7369-4721-80ec-a347a0700c26/image.png" alt=""></li>
</ul>
<p>상관 관계</p>
<ul>
<li>plt.scatter(x축, y축)</li>
<li>plt.show()
<img src="https://velog.velcdn.com/images/hana_summer/post/e47ca381-2c4b-49cc-9ac3-e2d8a85d93df/image.png" alt=""></li>
</ul>
<p>히스토그램    </p>
<ul>
<li><p>plt.hist(x축, y축)</p>
</li>
<li><p>plt.show()
<img src="https://velog.velcdn.com/images/hana_summer/post/edeff5f8-f489-4733-a23a-b8eca368a04e/image.png" alt=""></p>
</li>
<li><p>그래프 색, 투명도 : plt. 그래프 종류(x축, y축, color=’색’, alpha=1~0)</p>
</li>
<li><p>alpha→ 1 완전 진함 ~0 투명</p>
</li>
<li><p>색에 접두사로 dark, light, 색상 코드 입력 가능</p>
</li>
</ul>
<h5 id="시각화에는-matplotlib외에도-seaborn-등-다양한-패키지들이-있으니-상황에-따라-다양하게-활용할-것">시각화에는 matplotlib외에도 seaborn 등 다양한 패키지들이 있으니 상황에 따라 다양하게 활용할 것!</h5>
<h5 id="현재에서-하는-회고-다양한-그래프를-만들어보고-활용해보는게-정말-많은-도움이-되었다-상황에-따라-어떤-그래프를-사용해야-적합한지-어느정도-감을-잡아-가는듯">현재에서 하는 회고) 다양한 그래프를 만들어보고 활용해보는게 정말 많은 도움이 되었다. 상황에 따라 어떤 그래프를 사용해야 적합한지 어느정도 감을 잡아 가는듯..</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초 01_29]]></title>
            <link>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0129</link>
            <guid>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0129</guid>
            <pubDate>Sun, 12 May 2024 12:37:16 GMT</pubDate>
            <description><![CDATA[<h1 id="반복문">반복문</h1>
<ul>
<li>에러 확률 감소, 불필요한 작업 감수 위함.</li>
</ul>
<p>for 반복문</p>
<ul>
<li>for→각각의 상황에서 라는 의미로 사용됨.</li>
<li>‘for 변수 in 범위’ 가 기본형태 / 범위=반복할 범위, 횟수로 설정x</li>
<li>: → 다음 단락에 코드블럭이 올 것임을 예언하는 표시</li>
</ul>
<h4 id="indentationerror-→-들여쓰기-에러-자주-하는-실수인만큼-에러코드-익혀두자">IndentationError → 들여쓰기 에러 자주 하는 실수인만큼 에러코드 익혀두자!</h4>
<p>range 함수 → for 반복문 사용 시 가장 많이 사용(거의 대부분)</p>
<ul>
<li>파이썬에서 기본값은 생략 가능한 표현</li>
<li>stop: 파이썬에서 (n,n-1)로 범위 인식하기에 n+1로 입력해야 함.</li>
<li>펼쳐보기 → for 반복문에 넣기, list함수 안에 넣기</li>
<li>start 없이, stop, step 만 사용x / 셋다 적기, stop만 적기 start, stop만 적기</li>
<li>실수x 정수만 입력 가능</li>
<li>input함수는 문자열로만 인식</li>
</ul>
<h5 id="실습1-25이하-자연수-2배수로--2--8-13까지-정수--3-29까지-자연수-3의-배수--4-0105-순서대로-표현">실습1: 25이하 자연수, 2배수로 / 2: -8<del>-13까지 정수 / 3: 29까지 자연수, 3의 배수 / 4: 0.1</del>0.5 순서대로 표현</h5>
<pre><code>for i in(range(2, 26, 2)):
    print(i)</code></pre><p>while 반복문</p>
<ul>
<li>트리거x는 무한 반복</li>
<li>ind → 자유롭게 편한 문자로 변경 가능</li>
<li>while ‘지정 문자’ “관계비교(같다, 크다, 작다, 크거나 같다 등)” ‘지정 문자’:</li>
<li>vs for은 범위 조절 0</li>
<li>공통 명령문 → 현재 상황과 관계 없이 명령 실행 / 명령어만 단락에 작성</li>
<li>True, False로만 조건 판단 가능, for 같이 범위 조건 판단 불가능하기에 조건문을 추가로 작성해주어야 함.</li>
</ul>
<p>continue: 뒤에  코드 무시하고 다음 루프 실행 / 특정 상황에서만 실행되는 코드 만들 때 사용
break: 뒤에 코드 무시하고 무조건 종료 / while 반복문 컨트롤하기 위해 사용
pass: 아무것도 안함..(원래 코드 그대로 실행) 
/ 아무것도 안함을 명시하기 위해 사용, 코드가 완성되지 않은 상황에서 에러를 내지 않고 임시로 코드 동작 위해(가독성)</p>
<pre><code>for i in range(1,11):
    print(i)
    pass
    print(&#39;---&#39;)</code></pre><h1 id="조건문if">조건문(if)</h1>
<ul>
<li>elif: 그게 아니고 ~라면</li>
<li>if문 몇 개든 사용 숫자는 상관 없지만, if-elif-else 순으로 작성되어야 함. 앞에 if문 없으면 뒤 함수 사용 불가</li>
<li>if문+not: not의 경우 해당 논리 반대로 해석.</li>
<li>if not a==100 → a는 100과 일치하지 않는다.</li>
</ul>
<h1 id="포맷팅">포맷팅</h1>
<ul>
<li>변수를 직접 변화 없이 실시간 변경 가능하게 함.<h4 id="은근히-자주-사용되기에-사용방법-코드-읽는-방법에-대해-익혀두자">은근히 자주 사용되기에 사용방법, 코드 읽는 방법에 대해 익혀두자!</h4>
</li>
</ul>
<h1 id="넘파이">넘파이</h1>
<ul>
<li>정적 배열, 사이즈가 정해져있음. 확장, 축소x / 자료형 통일 ex) 한 개 실수면 데이터 전체 실수 / 브로드캐스팅(일괄 연산) 지원됨</li>
</ul>
<h3 id="인덱싱--슬라이싱">인덱싱 / 슬라이싱</h3>
<ul>
<li>인덱싱→ 원소 1개 추출(해당 좌표를 찾음)/ 슬라이싱 → 원소 여러 개 추출(=범위 추출/a좌표부터b좌표까지 해당되는 모든 값을 찾을 수 있도록 하는 데이터)</li>
<li>슬라이싱[시작 인덱스, 종료 인덱스, 인덱스 간격] / :: → 전 구간 포함</li>
</ul>
<h1 id="판다스">판다스</h1>
<ul>
<li>c -&gt;열, 세로. column네임= 헤더 / r →행, 가로, row네임=인덱스</li>
<li>1차원 데이터 -&gt; 세로로 한줄 / 다차원 데이터 -&gt; 가로로 여러줄</li>
<li>모든 자료형 인덱싱 시작은 가로부터</li>
<li>판다스에서 인덱싱: df[열][행] / df.loc(행, 열)</li>
<li>판다스에서 슬라이싱: df.loc[행, 열] /행,열에 대해 : 로 범위 지정 가능<h5 id="인덱싱슬라이싱-구분-및-어떻게-사용되고-코드에서는-어떻게-읽을-수-있는지에-대해-알아두기">인덱싱/슬라이싱 구분 및 어떻게 사용되고 코드에서는 어떻게 읽을 수 있는지에 대해 알아두기!</h5>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초 01_26]]></title>
            <link>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0126</link>
            <guid>https://velog.io/@hana_summer/Python-%EA%B8%B0%EC%B4%88-0126</guid>
            <pubDate>Sun, 12 May 2024 12:27:05 GMT</pubDate>
            <description><![CDATA[<ul>
<li>시작은 hello, world!로<pre><code>print(&#39;hello, world!&#39;)</code></pre></li>
</ul>
<h1 id="파이썬의-자료형">파이썬의 자료형</h1>
<ul>
<li>int(정수) -&gt; 1,2,3..</li>
<li>float(실수) -&gt; 47.64..</li>
<li>str(문자열) -&gt; &#39;hello&#39;</li>
<li>list(리스트) mutable 한 순서O -&gt; [1, &#39;hello&#39;, 0, 2]</li>
<li>tuple(튜플) immutable 한 순서O-&gt; (12, 32)</li>
<li>dict(딕셔너리) key와 value로 구성, 순서X -&gt; {&#39;A&#39;: &#39;0123405&#39;}</li>
<li>set(집합) mutable 한 순서X -&gt; {1,2,3}</li>
<li>bool(부울) -&gt; T , F</li>
<li>complex(복소수) -&gt; 6j</li>
<li>function(함수) -&gt; print()</li>
<li>NoneType -&gt; NoneType</li>
</ul>
<h1 id="파이썬의-연산자">파이썬의 연산자</h1>
<ul>
<li><p>** --&gt; 제곱</p>
</li>
<li><p>A//B --&gt; A/B의 몫</p>
</li>
<li><p>A%B --&gt; A/B의 나머지</p>
</li>
<li><p>== --&gt; 같다</p>
</li>
<li><p>!= --&gt; 다르다</p>
</li>
<li><p>A=B --&gt; A에 B를 할당</p>
</li>
<li><p>A:=B --&gt; A에 B를 할당하고, B를 반환</p>
</li>
<li><p>숫자 자료형: 모든 연산 가능</p>
</li>
<li><p>배열 형태 자료형: 덧셈, 곱셈 가능</p>
</li>
</ul>
<h4 id="str타입과-str타입간-연산은-덧셈-곱셈만-가능">str타입과 str타입간 연산은 덧셈, 곱셈만 가능</h4>
<pre><code>&#39;가나다&#39;-&#39;다&#39;</code></pre><p>시도 시 TypeError: unsupported operand type(s) for -: &#39;str&#39; and &#39;str&#39; 발생.</p>
<h4 id="배열-형태의-자료형은-덧셈-곱셈-연산만-가능">배열 형태의 자료형은 덧셈, 곱셈 연산만 가능</h4>
<pre><code>[&#39;1&#39;,&#39;hello&#39;]/123</code></pre><p>시도 시 TypeError: unsupported operand type(s) for /: &#39;list&#39; and &#39;int&#39; 발생.</p>
<h1 id="변수-사용하기">변수 사용하기</h1>
<ul>
<li>변수는 숫자 그 자체가 아님.</li>
<li>변수는 할당된 값을 불러오기 위한 주소 개념<pre><code>a=[1,2,3]</code></pre><h1 id="파이썬-내장-함수">파이썬 내장 함수</h1>
</li>
<li>join: 두 문자열을 구분자 중심 합침.</li>
<li>split: 문자열을 구분자 기준으로 나눔.</li>
<li>strip: 문자열 좌우에 대상 문자열이 있을 경우, 지움.</li>
<li>lstrip: strip 함수를 왼쪽만 실행.</li>
<li>rstrip: strip 함수를 오른쪽만 실행.</li>
<li>replace: 특정 문자 대체</li>
</ul>
<h1 id="정규-표현식">정규 표현식</h1>
<ul>
<li>\d [0-9] : 십진 숫자</li>
<li>\D [^0-9] : 비 숫자 문자</li>
<li>\s [ \t\n\r\f\v] : 공백문자</li>
<li>\S [^ \t\n\r\f\v] : 비 공백문자</li>
<li>\w [a-zA-Z0-9_] : 영숫자</li>
<li>\W [^a-zA-Z0-9_] : 비 영숫자</li>
<li>[가-힣] : 한글<h4 id="정규-표현식은-자주-사용되므로-꼭-익혀두기">정규 표현식은 자주 사용되므로 꼭 익혀두기!</h4>
<h1 id="re-패키지">re 패키지</h1>
</li>
<li>match(): 문자열 시작 부분 일치 판단</li>
<li>search(): 일치 문자 검색</li>
<li>findall(): 일치 문자 리스트로 반환</li>
<li>finditer(): 일치 문자 이터레이터로 반환</li>
</ul>
<h4 id="개행문자에-대해서도-알아두기">개행문자에 대해서도 알아두기!</h4>
]]></description>
        </item>
    </channel>
</rss>