<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bizpm_aiden.log</title>
        <link>https://velog.io/</link>
        <description>aiden</description>
        <lastBuildDate>Wed, 06 Mar 2024 02:05:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bizpm_aiden.log</title>
            <url>https://velog.velcdn.com/images/bizpm_aiden/profile/e384294d-2fc4-484c-b347-a1563090046d/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bizpm_aiden.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bizpm_aiden" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SQL분석] Google Big Query]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL%EB%B6%84%EC%84%9D-Google-Big-Query</link>
            <guid>https://velog.io/@bizpm_aiden/SQL%EB%B6%84%EC%84%9D-Google-Big-Query</guid>
            <pubDate>Wed, 06 Mar 2024 02:05:23 GMT</pubDate>
            <description><![CDATA[<h2 id="google-big-query">Google Big Query</h2>
<ul>
<li><p>구글에서 제공하는 클라우드 데이터 웨어하우스</p>
</li>
<li><p>Data Warehouse : 분석용 중앙 데이터 창고의 개념</p>
<ul>
<li>서비스와 직접적으로 연결되어 있는 DB가 아닌 분석용 DB를 사용</li>
<li>SQL 활용</li>
</ul>
</li>
<li><p>빅쿼리 접속 URL : <a href="https://console.cloud.google.com/bigquery">https://console.cloud.google.com/bigquery</a></p>
</li>
<li><p>프로젝트 제작</p>
<ul>
<li>프로젝트 만들기 - 이름 설정 - 만들기</li>
</ul>
</li>
<li><p>프로젝트 구조</p>
<ul>
<li>프로젝트 - 데이터세트 - 테이블</li>
</ul>
</li>
<li><p>쿼리</p>
<ul>
<li>SQL 쿼리 만들기 - 쿼리 입력창 / 쿼리 결과창</li>
</ul>
</li>
<li><p>쿼리 실행</p>
<ul>
<li>; 사용해 여러 쿼리 실행 가능</li>
<li>탭을 추가해서 여러 쿼리 작성 가능</li>
<li>원하는 쿼리만 드래그해서 실행하는 것도 가능</li>
<li>테이블 내에서 쿼리 버튼을 통해 바로 테이블이 FROM절에 세팅되도록 하는 것도 가능</li>
</ul>
</li>
<li><p>데이터셋 업로드</p>
<ul>
<li>프로젝트 ID - 점 세개 - 데이터 세트 만들기</li>
<li>ID 설정 - 리전(서울) - 데이터 세트 만들기</li>
<li>데이터 세트 이동 - 테이블 만들기</li>
<li>테이블 업로드<ul>
<li>소스 - 업로드 (customers, items, orders, products, category_name)</li>
<li>테이블 이름 설정</li>
<li>스키마 - 자동 감지 (수동 설정도 가능) -&gt; 테이블 만들기</li>
<li>** 특수 테이블<ul>
<li>번역 파일 (category_name)</li>
<li>스키마 직접 작성</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>지표 쪼개기</p>
<ul>
<li>큰 지표 -&gt; 작은 지표 (디테일)<ul>
<li>큰 지표를 설정하고 이 큰 지표를 추가로 확인할 수 있는 작은 지표로 쪼개서 분석</li>
</ul>
</li>
<li>매출 = 주문건수 * 건당 평균 주문 금액<ul>
<li>주문건수 = 주문고객수 * 주문빈도</li>
<li>건당 평균 주문 금액 = 판매품목수 * 물품평균가격</li>
</ul>
</li>
</ul>
</li>
<li><p>쿼리 분석</p>
<ul>
<li><p>매출 = 판매 금액 총합</p>
<ul>
<li>olist_order_items -&gt; price</li>
</ul>
</li>
<li><p>주문 수 = 주문 건수 세기</p>
<ul>
<li>olist_order_items -&gt; order_id</li>
</ul>
</li>
<li><p>건당 주문 금액 = 판매 금액 총합 / 주문 건수 세기</p>
</li>
<li><p>쿼리</p>
<pre><code class="language-sql">  SELECT
      SUM(price) AS ord_amt, -- 주문 금액 총합 (매출)
      COUNT(DISTINCT order_id) AS unique_orders, -- 전체 주문 건수
      SUM(price) / COUNT(DISTINCT order_id) AS amount_per_order 
      -- 주문 금액 총합 / 주문 건수 (주문 1건당 평균 가격)
  FROM `olist.olist_order_items` ;</code></pre>
</li>
<li><p>주문 수 = 고객 수 * 주문빈도</p>
<ul>
<li>고객 수<ul>
<li>olist_customers -&gt; customer_unique_id</li>
<li>olist_orders -&gt; customer_id</li>
<li>2개 테이블 조인</li>
<li>쿼리<pre><code class="language-sql">  /* 주문 고객 unique 세기 */
  SELECT
      COUNT(DISTINCT ord.order_id) AS ord_cnt, -- 주문 건수
      COUNT(DISTINCT ord.customer_id) AS cust_cnt,
      -- 참고. 주문건의 고객 id 세기 (주문건수와 동일)
      COUNT(DISTINCT cust.customer_unique_id) AS unique_cust_cnt
      -- 고객 고유 id 세기
  FROM `olist.olist_orders` AS ord -- 주문정보 테이블
  LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블
      ON ord.customer_id = cust.customer_id ; -- join 조건 : 주문 건의 고객 id</code></pre>
<pre><code class="language-sql">  /* 주문 빈도까지 조회 */
  SELECT
      COUNT(DISTINCT ord.order_id) AS ord_cnt, -- 주문 건수
      COUNT(DISTINCT ord.customer_id) AS cust_cnt,
      -- 참고. 주문건의 고객 id 세기 (주문건수와 동일)
      COUNT(DISTINCT cust.customer_unique_id) AS unique_cust_cnt,
      -- 고객 고유 id 세기
      COUNT(DISTINCT order_id) / COUNT(DISTINCT cust.customer_unique_id) AS frequency -- 주문빈도
  FROM `olist.olist_orders` AS ord -- 주문정보 테이블
  LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블
      ON ord.customer_id = cust.customer_id ; -- join 조건 : 주문 건의 고객 id</code></pre>
<ul>
<li>++ 한글로 Alias 설정하고 싶을 때는 AS <code>한글</code>의 형태로 (` 백틱) 입력</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>건당 주문 금액 = 주문 건당 판매 품목 수 * 물품 평균 가격</p>
<ul>
<li><p>주문 건당 판매 품목 수 = 총 판매 상품 수 / 주문 건수</p>
</li>
<li><p>물품 평균 가격 = 매출 / 총 판매 상품 수</p>
</li>
<li><p>쿼리</p>
<ul>
<li><p>주문건수 : olist_order_items의 고유 order_id 수 세기</p>
</li>
<li><p>총 판매 상품 수 : 판매 품목 수 세기 order_item_id</p>
</li>
<li><p>매출 : 판매가격 전부 더하기 price
```sql
/* 총 매출, 주문건수 집계 */
SELECT
  SUM(price) AS ord_amt, -- 주문 금액 총합 (매출)
  COUNT(DISTINCT order_id) AS unique_orders, -- 전체 주문 건수
  SUM(price) / COUNT(DISTINCT order_id) AS amount_per_order </p>
</li>
<li><ul>
<li><p>주문 금액 총합 / 주문 건수 (주문 1건당 평균 가격)
FROM <code>olist.olist_order_items</code> ;</p>
<pre><code>```sql
/* 총 판매 상품 수, 주문건수 집계 */
SELECT
 COUNT(order_item_id) AS prd_cnt, -- 총 판매 상품 수
 COUNT(DISTINCT order_id) AS ord_cnt, -- 주문 건수
 COUNT(order_item_id) / COUNT(DISTINCT order_id) AS unit_per_order 
 -- 주문 당 평균 판매 상품 수
FROM `olist.olist_order_items` AS ord ; -- 주문상품정보 테이블</code></pre><pre><code class="language-sql">/* 물품 평균 가격 집계 */
SELECT
 SUM(price) AS ord_amt, -- 주문 금액 총합 (매출)
 COUNT(order_item_id) AS prd_cnt, -- 총 판매 상품 수
 SUM(price) / COUNT(order_item_id) AS average_selling_price 
 -- 판매 제품 당 평균 가격
FROM `olist.olist_order_items` AS ord ; -- 주문상품정보 테이블</code></pre>
<p>```sql
/* 합치기 */
SELECT
 SUM(price) AS ord_amt, -- 주문 금액 총합 (매출)
 COUNT(DISTINCT order_id) AS unique_orders, -- 전체 주문 건수
 COUNT(order_item_id) AS prd_cnt, -- 총 판매 상품 수</p>
<p> SUM(price) / COUNT(DISTINCT order_id) AS amount_per_order </p>
</li>
</ul>
</li>
<li><ul>
<li>주문 금액 총합 / 주문 건수 (주문 1건당 평균 가격)
 COUNT(order_item_id) / COUNT(DISTINCT order_id) AS unit_per_order 
 -- 주문 당 평균 판매 상품 수
 SUM(price) / COUNT(order_item_id) AS average_selling_price 
 -- 판매 제품 당 평균 가격
FROM <code>olist.olist_order_items</code> AS ord ; -- 주문상품정보 테이블
```</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>종합 쿼리</p>
<ul>
<li>원하는 지표를 여러 테이블을 조인해 하나의 테이블로 표시</li>
</ul>
<ol>
<li>주문 1건 당 주문금액, 판매상품의 수 구하기</li>
<li>주문 정보 테이블에 1번 결과와 고객 unique ID를 붙이기</li>
<li>2번 결과 집계</li>
<li>주문 1건 당 주문금액, 판매상품의 수 구하기</li>
</ol>
<ul>
<li>쿼리<pre><code class="language-sql">SELECT
  item.order_id,
  SUM(item.price) as ord_amt,
  COUNT(item.order_item_id) as prd_cnt
FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블
GROUP BY item.order_id -- 집계 기준 : 주문 번호
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>        2. 주문 정보 테이블에 1번 결과와 고객 unique ID를 붙이기
        - 쿼리
        ```sql
        WITH tb AS(
        SELECT
            item.order_id,
            SUM(item.price) as ord_amt,
            COUNT(item.order_item_id) as prd_cnt
        FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블
        GROUP BY item.order_id -- 집계 기준 : 주문 번호
        ),

        SELECT
            ord.order_id,
            ord.order_status,
            cust.customer_unique_id,
            tb.ord_amt,
            tb.prd_cnt
        FROM `olist.olist_orders` AS ord -- 주문정보 테이블
        LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블
            ON ord.customer_id = cust.customer_id -- join 조건 : 주문 건의 고객 id
        INNER JOIN tb
            ON ord.order_id = tb.order_id ;
</code></pre><pre><code>    3. 2번 결과 집계
    - 쿼리
    ```sql
WITH tb AS(
    SELECT
        item.order_id,
        SUM(item.price) as ord_amt,
        COUNT(item.order_item_id) as prd_cnt
    FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블
    GROUP BY item.order_id -- 집계 기준 : 주문 번호
    )

, base AS(
    SELECT
        ord.order_id,
        ord.order_status,
        cust.customer_unique_id,
        tb.ord_amt,
        tb.prd_cnt
    FROM `olist.olist_orders` AS ord -- 주문정보 테이블
    LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블
        ON ord.customer_id = cust.customer_id -- join 조건 : 주문 건의 고객 id
    INNER JOIN tb
        ON ord.order_id = tb.order_id
)

SELECT
    SUM(ord_amt) AS `총 매출`,
    COUNT(DISTINCT order_id) AS `총 주문수`,
    SUM(prd_cnt) AS `총 판매상품수`,
    SUM(ord_amt) / COUNT(DISTINCT order_id) AS `주문 당 평균가격`,
    SUM(prd_cnt) / COUNT(DISTINCT order_id) AS `평균 판매상품수`,
    SUM(ord_amt) / SUM(prd_cnt) AS `제품 개당 평균가격`,
    COUNT(DISTINCT customer_unique_id) AS `주문 고객수`,
    COUNT(DISTINCT order_id) / COUNT(DISTINCT customer_unique_id) AS `주문빈도`
FROM base ;</code></pre><pre><code>- 날짜
    - DATE : 2017-11-25
        - 쿼리
            ```sql
            SELECT
                DATE(2016, 12, 25) AS date_ymd,
                DATE(DATETIME &#39;2016-12-25 23:59:59&#39;) AS date_dt,
                DATE(TIMESTAMP &#39;2016-12-25 05:30:00+09&#39;, &#39;Asia/Seoul&#39;) AS date_tstz ;</code></pre><pre><code>- DATETIME : 2017-11-25T11:10:33
    - 쿼리
        ```sql
        SELECT
            DATETIME(2016, 12, 25, 05, 30, 00) AS datetime_ymdhms,
            DATETIME(TIMESTAMP &#39;2016-12-25 05:30:00+09&#39;, &#39;Asia/Seoul&#39;) AS datetime_tstz ;</code></pre><pre><code>    - TIMESTAMP : 2017-11-25 11:10:33 UTC
        - 타임존 포함 (한국 : UTC + 9)
    - TIME : 11:10:33
    - 빅쿼리 내 실제 쿼리
    ```sql
    SELECT
        order_purchase_timestamp,

        DATE(order_purchase_timestamp) AS ord_date,

        DATETIME(order_purchase_timestamp) AS ord_date,

        TIMESTAMP(order_purchase_timestamp) AS ord_ts,
        TIMESTAMP(DATE(order_purchase_timestamp)) AS ord_date_ts,

        TIME(order_purchase_timestamp) AS ord_time
    FROM `olist.olist_orders` ;</code></pre><pre><code>- 날짜 일부분 추출
    - EXTRACT(&#39;추출할 부분&#39; FROM &#39;날짜 컬럼&#39;) -&gt; 실행 시 숫자로 변경
        - 추출할 부분
            - YEAR : 연도
            - MONTH : 월
            - DAY : 일
            - DAYOFWEEK : 요일 (0:일요일 ~ 6:토요일)
            - WEEK : 주(기본 일요일 시작) - 0주부터 시작
            - WEEK(MONDAY) : 주(월요일 시작) - 0주부터 시작
            - QUARTER : 분기
            - HOUR : 시
            - MINUTE : 분
            - SECOND : 초
            ```sql
            SELECT
                order_purchase_timestamp,

                EXTRACT(YEAR FROM order_purchase_timestamp)
            FROM `olist.olist_orders` ;
        ```
- 날짜에서 원하는 정보까지만 남길 때
    - DATE_TRUNC(&#39;날짜&#39;, &#39;남기는 부분&#39;)
    - DATETIME_TRUNC(&#39;날짜&#39;, &#39;남기는 부분&#39;)
    - TIMESTAMP_TRUNC(&#39;날짜&#39;, &#39;남기는 부분&#39;)
        - 남기는 부분
            - YEAR : 해당 연도의 첫날
            - MONTH : 해당 월의 첫날
            - DAY : 해당 날짜의 0시 0분
            - WEEK : 해당 주차의 첫 날 (일요일)
            - WEEK(MONDAY) : 해당 주차의 첫 날 (월요일)
            - QUARTER : 분기
            - HOUR : 시
            - MINUTE : 분
            - SECOND : 초
            ```sql
            SELECT
                order_purchase_timestamp,

                TIMESTAMP_TRUNC(order_purchase_timestamp, YEAR)
            FROM `olist.olist_orders` ;
        ```
    - 종합 쿼리에 날짜 값 활용
    ```sql
WITH tb AS(
    SELECT
        item.order_id,
        SUM(item.price) as ord_amt,
        COUNT(item.order_item_id) as prd_cnt
    FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블
    GROUP BY item.order_id -- 집계 기준 : 주문 번호
    )

, base AS(
    SELECT
        ord.order_approved_at,
        DATE(ord.order_approved_at) AS ord_date,
        DATETIME(ord.order_approved_at) AS ord_dt,
        TIMESTAMP(ord.order_approved_at) AS ord_ts,
        EXTRACT(YEAR FROM ord.order_approved_at) AS ord_year,
        EXTRACT(MONTH FROM ord.order_approved_at) AS ord_month,
        TIMESTAMP_TRUNC(ord.order_approved_at, YEAR) AS ord_year_t,
        TIMESTAMP_TRUNC(ord.order_approved_at, MONTH) AS ord_month_t,
        ord.order_id,
        ord.order_status,
        cust.customer_unique_id,
        tb.ord_amt,
        tb.prd_cnt
    FROM `olist.olist_orders` AS ord -- 주문정보 테이블
    LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블
        ON ord.customer_id = cust.customer_id -- join 조건 : 주문 건의 고객 id
    INNER JOIN tb
        ON ord.order_id = tb.order_id
)</code></pre><p>SELECT
        ord_year,
        SUM(ord_amt) AS <code>총 매출</code>,
        COUNT(DISTINCT order_id) AS <code>총 주문수</code>,
        SUM(prd_cnt) AS <code>총 판매상품수</code>,
        SUM(ord_amt) / COUNT(DISTINCT order_id) AS <code>주문 당 평균가격</code>,
        SUM(prd_cnt) / COUNT(DISTINCT order_id) AS <code>평균 판매상품수</code>,
        SUM(ord_amt) / SUM(prd_cnt) AS <code>제품 개당 평균가격</code>,
        COUNT(DISTINCT customer_unique_id) AS <code>주문 고객수</code>,
        COUNT(DISTINCT order_id) / COUNT(DISTINCT customer_unique_id) AS <code>주문빈도</code>
    FROM base 
    GROUP BY ord_year
    ORDER BY ord_year ;</p>
<pre><code>- 유용한 함수
    - 원하는 컬럼만 불러오기
        - EXCEPT : 필요 없는 컬럼은 빼고 불러옴
            - SELECT * EXCEPT(&#39;제외할 컬럼&#39;)
        - REPLACE : 기존 컬럼을 대체해서 표시됨
            - SELECT * REPLACE(&#39;대체할 값&#39; AS &#39;컬럼명&#39;)
                - EX) SELECT * REPLACE(price * 10000 AS price)
    - 데이터 타입 변경
        - CAST(&#39;값&#39; AS &#39;데이터타입&#39;)
            - EX)
                - CAST(&#39;123&#39; AS INT64)
                - CAST(&#39;abc&#39; AS INT64) -&gt; error
        - SAFE_CAST(&#39;값&#39; AS &#39;데이터타입&#39;)
            - EX)
                - SAFE_CAST(&#39;123&#39; AS INT64)
                - SAFE_CAST(&#39;abc&#39; AS INT64) -&gt; null
        - ++ SAFE 활용 -&gt; error가 아닌 Null 반환
            - SAFE_ADD(X, Y) = X + Y
            - SAFE_SUBTRACT(X, Y) = X - Y
            - SAFE_MULTIPLY(X, Y) = X * Y
            - SAFE_DIVIDE(X, Y) = X / Y -&gt; 0으로 나누는 경우에 활용
                - IFNULL과 조합하면 null 값을 다른 값으로 변경하는 것도 가능
                    - IFNULL(&#39;값&#39;, &#39;변경 값&#39;)
- 자주 쓰이는 IN / NOT IN
    - IN
        - WHERE &#39;컬럼&#39; IN (A, B, C)
    - NOT IN
        - WHER &#39;컬럼&#39; NOT IN (A, B, C)
    - 쿼리
    ```sql
        WITH tb AS(

        SELECT

        item.order_id,

        SUM(item.price) as ord_amt,

        COUNT(item.order_item_id) as prd_cnt

        FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블

        GROUP BY item.order_id -- 집계 기준 : 주문 번호

        )

        , base AS(

        SELECT

        DATE(ord.order_approved_at) AS ord_date,

        ord.order_id,

        ord.order_status,

        cust.customer_unique_id,

        tb.ord_amt,

        tb.prd_cnt

        FROM `olist.olist_orders` AS ord -- 주문정보 테이블

        LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블

        ON ord.customer_id = cust.customer_id -- join 조건 : 주문 건의 고객 id

        INNER JOIN tb

        ON ord.order_id = tb.order_id

        WHERE 1 = 1

        AND order_status IN (&#39;delivered&#39;, &#39;shipped&#39;)

        AND order_approved_at IS NOT NULL

        )



        SELECT

        ord_date,

        ROUND(SUM(ord_amt), 2) AS ord_amt, --총 매출

        COUNT(DISTINCT order_id) AS ord_cnt, --총 주문수

        SUM(prd_cnt) AS prd_cnt, --총 판매상품수

        ROUND(IFNULL(SAFE_DIVIDE(SUM(ord_amt), COUNT(DISTINCT order_id)), 0), 2) AS avg_ord_amt, --주문 당 평균가격

        ROUND(IFNULL(SAFE_DIVIDE(SUM(prd_cnt), COUNT(DISTINCT order_id)), 0), 2) AS avg_prd_cnt, --평균 판매상품수

        ROUND(IFNULL(SAFE_DIVIDE(SUM(ord_amt) , SUM(prd_cnt)), 0), 2) AS avg_price, --제품 개당 평균가격

        COUNT(DISTINCT customer_unique_id) AS cust_cnt, --주문 고객수

        ROUND(IFNULL(SAFE_DIVIDE(COUNT(DISTINCT order_id), COUNT(DISTINCT customer_unique_id)), 0), 2) AS cust_freq --주문빈도

        FROM base

        GROUP BY ord_date

        ORDER BY ord_date ;</code></pre><ul>
<li><p>AD HOC QUERY</p>
<ul>
<li><p>요청사항 1</p>
<ul>
<li><p>주(state)별 침투율 확인 및 침투율이 낮은 지역을 중심으로 침투율 개선 예정</p>
</li>
<li><p>주별 주문수와 고객수 추출 필요</p>
<pre><code class="language-sql">/* 주(state)별 주문수, 고객수를 추출합니다. */</code></pre>
</li>
<li><ul>
<li>고객 정보 기준</li>
</ul>
</li>
<li><ul>
<li>주문 상태는 필터링하지 않음</li>
</ul>
</li>
<li><ul>
<li>olist_orders, olist_customers 사용</li>
</ul>
<p>SELECT</p>
<p>customer_state,</p>
<p>COUNT(DISTINCT ord.order_id) AS ord_cnt,</p>
<p>COUNT(DISTINCT cust.customer_unique_id) AS cust_cnt</p>
<p>FROM <code>olist.olist_orders</code> AS ord</p>
<p>LEFT JOIN <code>olist.olist_customers</code> AS cust</p>
<p>ON ord.customer_id = cust.customer_id</p>
<p>GROUP BY customer_state</p>
<p>ORDER BY cust_cnt DESC ;
```</p>
</li>
</ul>
</li>
<li><p>요청사항 2</p>
<ul>
<li><p>고객수 Top 2인 상파울루(SP), 리우데자네이루(RJ) 주만 필터링 (서브쿼리를 위한 join 연습)</p>
<pre><code class="language-sql">/* 요청사항 2. 고객수 Top2 SP, RJ만 주문 추출 */</code></pre>
</li>
<li><ul>
<li>인라인 서브 쿼리 사용</li>
</ul>
</li>
<li><ul>
<li>olist_orders, olist_customers 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    SELECT

    ord.order_id,

    cust.customer_state

    FROM `olist.olist_orders` AS ord

    LEFT JOIN (SELECT customer_id,

    customer_unique_id,

    customer_state

    FROM `olist.olist_customers`

    WHERE customer_state IN (&#39;SP&#39;, &#39;RJ&#39;)) AS cust

    ON ord.customer_id = cust.customer_id

    WHERE cust.customer_state IS NOT NULL ;

    -- WHERE 절은 olist_orders 테이블 기준 LEFT JOIN 이기 떄문에 olist_custmers 쪽 NULL 값 제외
    ```
- 요청사항 3
    - 현재 2018년 가정
    - 2017년 도시(city)별 주문수와 고객수, 매출 추출
        - 고객 수 기준 순위 표시
        - 전체 순위, 주(state) 내 순위 표시
        - 배송완료(delivered)된 건만 집계
    - 순위 쿼리
        - ROW_NUMBER() : 중복 없는 순위 (고유)
            - Ex) ROW_NUMBER() OVER (ORDER BY 컬럼 DESC)
        - RANK() : 동점일 때 중복 순위 (공동 등수)
            - 공동 순위자가 있다면 그 수 만큼 건너뛰고 다음 등수
        - DENSE_RANK() : 동점일 때 중복 순위 (공동 등수)
            - 공동 순위자가 있어도 연속으로 등수 설정
        - 사용법
            - OVER (ORDER BY [순위 조건])
                - 순위 조건 : 컬럼 &amp; 오름차순, 내림차순 (ASC, DESC)
            - OVER (PARTITION BY [구분 기준] ORDER BY [순위 조건])
                - 구분 기준 : 구분이 필요한 컬럼
    ```sql
    /* 요청사항 3. 2017년 도시(city)별 주문수, 고객수, 매출 */

    -- 현재 2018년 가정

    -- 고객 수 기준 내림차순 순위

    -- 순위는 전체 순위, 주(state) 기준 순위 모두 제공

    -- 배송완료 (order_status = &#39;delivered&#39;) 건만 집계



    WITH tb AS(

    SELECT

    item.order_id,

    SUM(item.price) as ord_amt

    FROM `olist.olist_order_items` AS item -- 주문상품정보 테이블

    GROUP BY item.order_id -- 집계 기준 : 주문 번호

    )

    , base AS(

    SELECT

    cust.customer_state,

    cust.customer_city,

    COUNT(DISTINCT ord.order_id) AS ord_cnt,

    COUNT(DISTINCT cust.customer_unique_id) AS cust_cnt,

    SUM(tb.ord_amt) AS ord_amt

    FROM `olist.olist_orders` AS ord -- 주문정보 테이블

    INNER JOIN tb

    ON ord.order_id = tb.order_id

    LEFT JOIN `olist.olist_customers` AS cust -- 고객정보 테이블

    ON ord.customer_id = cust.customer_id -- join 조건 : 주문 건의 고객 id

    WHERE 1 = 1

    AND order_status = &#39;delivered&#39;

    AND EXTRACT(YEAR FROM order_approved_at) = 2017

    GROUP BY 1, 2

    )

    SELECT

    *,

    ROW_NUMBER() OVER (PARTITION BY customer_state ORDER BY base.cust_cnt DESC) AS cust_rownum,

    DENSE_RANK() OVER (PARTITION BY customer_state ORDER BY base.cust_cnt DESC) AS cust_denserank,

    RANK() OVER (PARTITION BY customer_state ORDER BY base.cust_cnt DESC) AS state_rank,

    RANK() OVER (ORDER BY base.cust_cnt DESC) AS rank

    FROM base

    ORDER BY rank ;</code></pre><pre><code>    - 요청사항 4
        - 고객별 객단가 (고객별 평균 금액)
        - 건 당 주문 금액 = 매출 / 고객 수
        ```sql
        /* 요청사항 4. 고객 객단가 */

        -- 월 기준

        -- SAFE_DIVIDE 사용



        SELECT

        DATE_TRUNC(DATE(ord.order_approved_at), MONTH) AS ord_month,

        SUM(item.price) AS ord_amt,

        COUNT(DISTINCT cust.customer_unique_id) AS cust_cnt,

        SAFE_DIVIDE(SUM(item.price), COUNT(DISTINCT cust.customer_unique_id)) AS avg_amt

        FROM `olist.olist_orders` AS ord

        INNER JOIN `olist.olist_order_items` AS item

        ON ord.order_id = item.order_id

        LEFT JOIN `olist.olist_customers` AS cust

        ON ord.customer_id = cust.customer_id

        GROUP BY ord_month

        ORDER BY ord_month ;
        ```
    - 요청사항 5
        - 월별 구입 금액에 기반해서 그룹 나누기
        - 그룹별 비중의 변화 확인
        - 월 - 고객 unique ID - 해당 월의 구매금액 - 그룹 순서
        - 300 BRL 이상 A, 150 BRL이상 300 BRL 미만 B, 그 외 C
            - CASE ~ WHEN 사용
            - Ex) CASE
                    WHEN [조건 1] THEN [결과]
                    ELSE [그외 결과]
                - END
        - order_status = delivered, shipped
        - order_approved_at IS NOT NULL
        ```sql
        /* 요청사항5. 그룹별 월별 구입금액 */

        -- 월별 구입 금액에 기반해서 그룹 나누기

        -- 그룹별 비중의 변화 확인

        -- 월 - 고객 unique ID - 해당 월의 구매금액 - 그룹 순서

        -- 300 BRL 이상 A, 150 BRL이상 300 BRL 미만 B, 그 외 C

        -- order_status = delivered, shipped

        -- order_approved_at IS NOT NULL



        SELECT

        DATE_TRUNC(DATE(ord.order_approved_at), MONTH) AS ord_month,

        cust.customer_unique_id AS cust_unique_id,

        SUM(item.price) AS ord_amt,

        CASE

        WHEN SUM(item.price) &gt;= 300 THEN &#39;A&#39;

        WHEN SUM(item.price) &gt;= 150 THEN &#39;B&#39;

        ELSE &#39;C&#39;

        END AS level

        FROM `olist.olist_orders` AS ord

        INNER JOIN `olist.olist_order_items` AS item

        ON ord.order_id = item.order_id

        LEFT JOIN `olist.olist_customers` AS cust

        ON ord.customer_id = cust.customer_id

        WHERE 1=1

        AND ord.order_status IN (&#39;delivered&#39;, &#39;shipped&#39;)

        AND ord.order_approved_at IS NOT NULL

        GROUP BY 1, 2

        ORDER BY ord_month, ord_amt DESC;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL분석] Looker Studio]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL%EB%B6%84%EC%84%9D-Looker-Studio</link>
            <guid>https://velog.io/@bizpm_aiden/SQL%EB%B6%84%EC%84%9D-Looker-Studio</guid>
            <pubDate>Mon, 04 Mar 2024 02:26:27 GMT</pubDate>
            <description><![CDATA[<h2 id="looker-studio">looker studio</h2>
<ul>
<li>기존 구글 데이터 스튜디오</li>
<li>장점<ul>
<li>쉽고 빠른 데이터 소스 연결 (특히 구글 제품 일 때)</li>
<li>편리한 공유, 공동작업<ul>
<li>다른 구글 서비스처럼 공유</li>
</ul>
</li>
<li>편리한 리포팅</li>
<li>무료 (단점을 희석)</li>
</ul>
</li>
<li>루커 스튜디오 보고서 = 태블로 대시보드</li>
<li>인터페이스<ul>
<li>캔버스<ul>
<li>표, 그래프 등을 표시하는 공간</li>
</ul>
</li>
<li>패널<ul>
<li>속성 패널<ul>
<li>표, 그래프 등 유형 설정 가능</li>
<li>설정<ul>
<li>데이터 필드 결정</li>
</ul>
</li>
<li>스타일<ul>
<li>디자인 요소 결정</li>
</ul>
</li>
</ul>
</li>
<li>데이터 패널<ul>
<li>데이터 소스에 포함된 필드 표시</li>
</ul>
</li>
</ul>
</li>
<li>패널 관리자<ul>
<li>속성 패널, 데이터 패널 온오프</li>
</ul>
</li>
<li>툴바<ul>
<li>데이터 추가<ul>
<li>데이터 소스 추가 가능</li>
</ul>
</li>
<li>리소스<ul>
<li>추가된 데이터 소스 관리<ul>
<li>보고서에 포함된 데이터 소스 확인 가능</li>
<li>데이터 소스 추가 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>페이지 구성<ul>
<li>툴바 내 페이지 - 새 페이지 추가로 추가 가능</li>
</ul>
</li>
</ul>
</li>
<li>태블로와 차이<ul>
<li>태블로 사이드바 = 루커 데이터 패널</li>
<li>태블로 마크카드,  선반 = 루커 속성 패널</li>
<li>태블로 뷰 = 루커 캔버스</li>
<li>태블로 (연속형 - 초록 / 불연속형 - 파랑)</li>
<li>루커 (측정기준 - 초록 / 측정항목 - 파랑)</li>
</ul>
</li>
<li>태블로<ul>
<li>시트로 각각의 그래프를 만들고 대시보드에 쌓는다</li>
<li>대시보드에 꽉 차게 배치된다</li>
<li>응용할 시각화 방법이 많다.</li>
</ul>
</li>
<li>루커<ul>
<li>그때그때 페이지에 바로 표를 만든다</li>
<li>배치가 자유롭다 (파워포인트와 유사)</li>
<li>사각화 형태가 준비되어 있다 (태블로보다 응용 제한)</li>
</ul>
</li>
<li>주요 용어<ul>
<li>측정기준 -&gt; 태블로 차원<ul>
<li>집계되지 않는 데이터</li>
<li>이름, 설명, 색상, 크기, 기타 데이터 특성 등 데이터의 카테고리</li>
<li>차트에 추가하는 측정기준에 따라 차트 데이터가 그룹화됨</li>
<li>속성 패널 내 녹색으로 표시</li>
</ul>
</li>
<li>측정항목 (필드) -&gt; 태블로 측정값<ul>
<li>측정기준에 포함된 데이터를 측정하고 차트의 숫자 척도와 데이터 계열을 제공</li>
<li>속성 패널 내 파란색으로 표시</li>
</ul>
</li>
</ul>
</li>
<li>사용법<ul>
<li>속성 패널 내 설정에서 정렬, 요약행 추가 가능</li>
<li>속성 패널 내 스타일에서 글꼴, 폰트 크기, 축 표시 등 변경 가능</li>
<li>속성 패널 내 표 / 차트 클릭 시 표 / 차트 유형 변경 가능<ul>
<li>히트맵이 있는 표 -&gt; 태블로 하이라이트와 비슷</li>
</ul>
</li>
<li>속성 패널 내 집계 방식, 비교 계산, 이름 등 변경 가능</li>
<li>표 제작 : 데이터 필드에서 원하는 데이터를 캔버스에 드래그앤 드랍으로도 가능</li>
<li>조건부 서식 : 속성 패널 - 스타일 - 조건부 서식으로도 가능<ul>
<li>AND, OR 조건 설정 가능</li>
<li>조건 적용 범위 설정 가능</li>
</ul>
</li>
<li>필터 : 속성 패널 - 설정 - 필터 추가 - 필터 만들기<ul>
<li>이름, 조건 설정 가능</li>
<li>원하는 값만 표시하거나 표시하지 않을 수 있음.</li>
<li>이미 만들어진 필터도 선택 가능</li>
<li>툴바 - 리소스 - 필터 관리를 통해 모든 필터 확인 가능</li>
</ul>
</li>
<li>피벗테이블<ul>
<li>루커 스튜디오는 표와 피봇테이블을 구분함.</li>
<li>표 / 차트 유형 변경하는 방식으로 피봇테이블으로 변경</li>
<li>속성 패널 - 설정 - 총계 확인 가능</li>
</ul>
</li>
<li>파이차트 / 도넛차트<ul>
<li>차트 생성 시 파이차트, 도넛차트 생성 가능</li>
<li>속성 패널 - 스타일 - 조각 수를 선택할 수 있음<ul>
<li>비중에 따라서 개수 외 항목은 기타로 합쳐서 표시</li>
</ul>
</li>
<li>속성 패널 - 스타일 - 라벨명을 변경할 수 있음.</li>
<li>파이차트에서 속성 패널 - 스타일 - 색상 표시 내 슬라이더로 도넛차트로 변형 가능</li>
<li>루커 스튜디오에서는 도넛 차트 내 영역에 정보를 표시할 수 있는 기능은 없어 텍스트 상자를 넣어서 활용 가능<ul>
<li>스코어 카드 기능을 함께 사용하면 더욱 강력</li>
</ul>
</li>
</ul>
</li>
<li>열차트 (바 / 막대 차트)<ul>
<li>차트 생성 시 선택 가능</li>
<li>세부 측정 기준을 추가할 수 있음 (속성 패널 - 설정)</li>
<li>속성 패널 - 스타일 - 수직 / 수평 변경 가능</li>
<li>속성 패널 - 스타일 - 데이터 레이블 설정 가능</li>
<li>속성 패널 - 스타일 - 참조선<ul>
<li>차트에 부가적인 선을 만들 수 있음 (평균선 등)</li>
<li>참조밴드 -&gt; 참조선 2개</li>
<li>매개변수 : 대시보드에 직접 값을 입력해 반영할 수 있는 기능<ul>
<li>대시보드 사용자가 참조선을 변경할 수 있음.</li>
<li>데이터 패널 - 매개변수 추가</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>날짜<ul>
<li>태블로 -&gt; DATEPARSE(&#39;날짜형식&#39;, &#39;바꿀 문자열&#39;)</li>
<li>루커 -&gt; PARSE_DATE(&#39;날짜형식&#39;, &#39;바꿀 문자열&#39;)</li>
<li>태블로와 루커의 날짜 형식이 다름 -&gt; 주의!</li>
<li>데이터 패널 - 필드 추가 - 수식에 PARSE_DATE</li>
</ul>
</li>
<li>시계열(라인) 차트<ul>
<li>드릴다운<ul>
<li>드릴업, 드릴다운 -&gt; 측정기준 순서에 따라서 변경 가능</li>
</ul>
</li>
<li>속성 패널 - 스타일 - 점 / 라벨 표시 / 추세선 추가 / 누적 설정 가능</li>
<li>세부 측정 기준 설정 가능 -&gt; 각 시리즈별로 디자인 별도 설정 가능</li>
</ul>
</li>
<li>교차 필터링<ul>
<li>속성 패널 - 설정 - 차트 상호작용 - ON / OFF</li>
</ul>
</li>
<li>컨트롤 필터<ul>
<li>기본적으로 대시보드 내 모든 차트에 적용</li>
<li>일부 차트만 적용<ul>
<li>컨트롤 필터 + 차트 선택 (Ctrl / Cmd 누르고 클릭)</li>
<li>오른쪽 마우스 - 그룹</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] README]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-README</link>
            <guid>https://velog.io/@bizpm_aiden/Git-README</guid>
            <pubDate>Mon, 19 Feb 2024 04:52:16 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git REAMME.md 파일에 대한 Git 내용입니다.</p>
<h2 id="readmemd">README.md</h2>
<p>README.md 파일은 프로젝트에 대한 설명, 사용방법, 라이센스, 설치법과 같은 부분에 대해 기술하는 파일입니다.</p>
<h3 id="markdown">MARKDOWN</h3>
<p>README.md 파일은 MARKDOWN 문법으로 사용 가능합니다.</p>
<h3 id="header-">HEADER (#)</h3>
<p>제목을 표시하기 위한 문법으로 #을 사용합니다. (#은 6개까지 사용 가능합니다.)</p>
<pre><code># HEADER 1
## HEADER 2
### HEADER 3
#### HEADER 4
##### HEADER 5
###### HEADER 6</code></pre><p>실제 표시)</p>
<h1 id="header-1">HEADER 1</h1>
<h2 id="header-2">HEADER 2</h2>
<h3 id="header-3">HEADER 3</h3>
<h4 id="header-4">HEADER 4</h4>
<h5 id="header-5">HEADER 5</h5>
<h6 id="header-6">HEADER 6</h6>
<h3 id="blockquote-">BLOCKQUOTE (&gt;)</h3>
<p>인용문을 표시하기 위한 문법으로 &gt;를 사용합니다. (&gt;이 늘어나면 Depth가 깊어집니다.)</p>
<pre><code>&gt; BLOCKQUOTE (&gt; BLOCKQUOTE)

&gt;&gt; BLOCKQUOTE (&gt;&gt; BLOCKQUOTE)</code></pre><p>실제 표시)</p>
<blockquote>
<p>BLOCKQUOTE (&gt; BLOCKQUOTE)</p>
</blockquote>
<blockquote>
<blockquote>
<p>BLOCKQUOTE (&gt;&gt; BLOCKQUOTE)</p>
</blockquote>
</blockquote>
<h3 id="list">LIST</h3>
<h4 id="숫자-목록">숫자 목록</h4>
<p>숫자 목록은 number. 의 형태로 사용할 수 있습니다.</p>
<pre><code>1. LIST 1
2. LIST 2</code></pre><p>실제 표시)</p>
<ol>
<li>LIST 1</li>
<li>LIST 2<h4 id="순서-없는-목록">순서 없는 목록</h4>
순서 없는 목록은 *, +, -를 사용합니다. (TAB 시 상위 목록에 속해집니다.)
```</li>
</ol>
<ul>
<li>LIST 1</li>
<li>LIST 2</li>
<li>LIST 3
```
실제 표시)</li>
<li>LIST 1</li>
<li>LIST 2</li>
<li>LIST 3<h3 id="codeblock">CODEBLOCK</h3>
CODEBLOCK은 코드를 표현하기 위한 MARKDOWN 문법입니다.<h4 id="한-줄로-표시">한 줄로 표시</h4>
<pre><code>``` CODEBLOCK```
&lt;code&gt; CODEBLOCK &lt;/code&gt;</code></pre>실제 표시)
<code>CODEBLOCK</code>
<code> CODEBLOCK </code><h4 id="넓게-표시">넓게 표시</h4>
<pre><code>&quot;```
CODEBLOCK
```&quot;
&lt;pre&gt;&lt;code&gt; CODEBLOCK &lt;/code&gt;&lt;/pre&gt;</code></pre>실제 표시)<pre><code>CODEBLOCK</code></pre><pre><code> CODEBLOCK </code></pre>
<h3 id="horizon-line">HORIZON LINE</h3>
수평선을 표시하는 문법으로 ***, ---으로 사용합니다.<pre><code></code></pre></li>
</ul>
<hr>
<hr>
<pre><code>실제 표시)
***
---
### LINK
#### 링크 주소 표시
링크 주소를 그대로 표시하는 방법으로 (), &lt;&gt; 내 URL을 넣어 사용합니다.</code></pre><p>(<a href="https://velog.io">https://velog.io</a>)
<a href="https://velog.io">https://velog.io</a></p>
<pre><code>실제 표시)
https://velog.io
&lt;https://velog.io&gt;
#### 텍스트 내 링크 표시
텍스트에 링크를 적용하는 방법으로, [] 안에 텍스트, ()내 URL을 넣어 사용합니다.</code></pre><p><a href="https://velog.io">Velog</a></p>
<pre><code>실제 표시)
[Velog](https://velog.io)
### TEXT STYLE
#### 굵은 텍스트
텍스트를 굵게 표현하는 문법입니다.</code></pre><p><strong>TEXT</strong></p>
<p><strong>TEXT</strong></p>
<pre><code>실제 표시)
**TEXT**
__TEXT__
#### 기울임
텍스트를 기울여서 표현하는 방법입니다.</code></pre><p><em>TEXT</em>
<em>TEXT</em></p>
<pre><code>실제 표시)
*TEXT*
_TEXT_
#### 취소선
텍스트에 취소선을 표시하는 방법입니다.</code></pre><p><del>TEXT</del></p>
<pre><code>실제 표시)
~~TEXT~~
### IMAGE
이미지를 넣기 위한 문법입니다.</code></pre><p><img src="%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%A3%BC%EC%86%8C" alt="대체텍스트"></p>
<p><img src="https://velog.velcdn.com/images/bizpm_aiden/post/4352010b-5050-46ff-91ad-92120662f7eb/image.jpg" alt="이미지 연습"></p>
<p>```
실제 표시)
<img src="https://velog.velcdn.com/images/bizpm_aiden/post/4352010b-5050-46ff-91ad-92120662f7eb/image.jpg" alt="이미지 연습"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] TAG]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-TAG</link>
            <guid>https://velog.io/@bizpm_aiden/Git-TAG</guid>
            <pubDate>Mon, 19 Feb 2024 03:49:08 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git TAG를 생성, 삭제, 확인하기 위한 Git 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<ul>
<li>특정 버전에 TAG를 표시할 필요가 있을 때 사용합니다.
(Ex. Version Release 등)</li>
<li>checkout을 활용해 TAG로 이동하는 것도 가능합니다.</li>
</ul>
<h2 id="문법">문법</h2>
<h3 id="tag-생성-tag">TAG 생성 (tag)</h3>
<p>TAG는 HEAD 위치에 생성됩니다.</p>
<pre><code class="language-bash">git tag &lt;tag_name&gt;</code></pre>
<h3 id="특정-버전에-tag-생성-tag">특정 버전에 TAG 생성 (tag)</h3>
<pre><code class="language-bash">git tag &lt;tag_name&gt; &lt;commit_id&gt;</code></pre>
<h3 id="tag-배포-push">TAG 배포 (push)</h3>
<p>BRANCH와 마찬가지로 별도로 REMOTE REPOSITORY에 배포해야 합니다.</p>
<pre><code class="language-bash">git push origin &lt;tag_name&gt;</code></pre>
<h3 id="tag-목록-확인-tag">TAG 목록 확인 (tag)</h3>
<pre><code class="language-bash">git tag</code></pre>
<h3 id="tag-상세보기-show">TAG 상세보기 (show)</h3>
<pre><code class="language-bash">git show &lt;tag_name&gt;</code></pre>
<h3 id="tag-삭제---delete">TAG 삭제 (--delete)</h3>
<h4 id="local-tag-삭제">LOCAL TAG 삭제</h4>
<pre><code class="language-bash">git tag --delete &lt;tag_name&gt;</code></pre>
<h4 id="remote-tag-삭제">REMOTE TAG 삭제</h4>
<pre><code class="language-bash">git push origin --delete &lt;tag_name&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] CONFLICT]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-CONFLICT</link>
            <guid>https://velog.io/@bizpm_aiden/Git-CONFLICT</guid>
            <pubDate>Mon, 19 Feb 2024 03:42:46 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git에서 MERGE가 불가한 상황을 해결하기 위한 Git 내용입니다.</p>
<h2 id="conflict">CONFLICT</h2>
<p>2개의 BRANCH에서 같은 버전, 같은 부분을 수정했을 때 Git이 Automerge를 할 수 없는 상황입니다.</p>
<ul>
<li>컴퓨터가 선택할 수 없어 개발자가 직접 해결해야 합니다.<h3 id="확인법">확인법</h3>
</li>
<li>Git status로 확인 가능합니다.</li>
<li>CONFLICT message로 확인 가능합니다.
파일 내 ===== 표시를 기점으로 표시됩니다.<h3 id="해결법">해결법</h3>
</li>
</ul>
<ol>
<li>문제되는 부분의 파일을 수정합니다.</li>
<li>Git ADD 합니다.</li>
<li>Git COMMIT 합니다.<pre><code class="language-bash">git commit -i # 간혹 COMMIT이 동작하지 않는다면 강제 COMMIT 합니다.</code></pre>
<h3 id="push-pull-상황에서-conflict-발생-시-해결법">PUSH, PULL 상황에서 CONFLICT 발생 시 해결법</h3>
<h4 id="push-동작-중-발생">PUSH 동작 중 발생</h4>
REMOTE로 보내는 동작이기 때문에 수정할 사람이 없습니다. (주의 필요)</li>
</ol>
<ul>
<li>PUSH가 실패합니다. (별도 CONFLICT message 없음)</li>
<li>PULL로 CONFLICT 에러 확인 가능합니다.<h4 id="pull-동작-중-발생">PULL 동작 중 발생</h4>
FETCH만 진행되고 MERGE가 실패한 CONFLICT 상태가 됩니다.</li>
<li>CONFLICT message 확인 가능하기 때문에 수정 후 ADD, COMMIT합니다.</li>
</ul>
<p>따라서 PUSH보다는 PULL을 먼저하는 습관을 갖는 것을 권장합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] MERGE]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-MERGE</link>
            <guid>https://velog.io/@bizpm_aiden/Git-MERGE</guid>
            <pubDate>Mon, 19 Feb 2024 03:32:43 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git의 버전을 병합하기 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="버전-병합-merge">버전 병합 (merge)</h3>
<p>현재 HEAD 위치 버전에 다른 버전을 병합합니다.
BRANCH 병합과 PUSH, PULL 작업이 함께 진행됩니다.</p>
<pre><code class="language-bash">git merge &lt;branch_name&gt; # &lt;branch_name&gt;은 현재 HEAD 위치에 병합할 특정 버전을 의미합니다.</code></pre>
<p>Ex)
main branch에 dev branch를 병합하고 싶은 경우</p>
<pre><code class="language-bash">git checkout main # HEAD 위치를 main branch로 이동시킵니다.

git merge dev # dev branch를 merge 합니다.</code></pre>
<h4 id="추가-내용">추가 내용</h4>
<ul>
<li>BRANCH가 갈라지지 않은 상태에서 상위 버전에 HEAD를 두고 하위 버전을 merge하면 변화가 없습니다.
(하위 버전으로 가고 싶다면 checkout하면 됩니다.)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] BRANCH]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-BRANCH</link>
            <guid>https://velog.io/@bizpm_aiden/Git-BRANCH</guid>
            <pubDate>Mon, 19 Feb 2024 03:25:21 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git BRANCH를 생성, 삭제, 확인, 사용하기 위한 Git 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<ul>
<li>개발 시 코드를 복사한 후 개발 작업을 진행해서 최종적으로 다시 합치는 방식으로 작업하기 때문에 BRANCH가 필요합니다.</li>
<li>특정 버전에서 새로운 BRANCH를 만들어 개발 후 병합합니다.</li>
</ul>
<h2 id="문법">문법</h2>
<h3 id="branch-생성-branch--b">BRANCH 생성 (branch, -b)</h3>
<h4 id="local에서-branch-생성">LOCAL에서 BRANCH 생성</h4>
<p>현재 HEAD가 위치한 버전에서 BRANCH를 생성합니다.</p>
<pre><code class="language-bash">git branch &lt;branch_name&gt;</code></pre>
<p>checkout을 통해 BRANCH를 생성하면서 해당 BRANCH로 이동할 수 있습니다.</p>
<pre><code class="language-bash">git checkout -b &lt;branch_name&gt;</code></pre>
<h4 id="remote에-branch-배포">REMOTE에 BRANCH 배포</h4>
<pre><code class="language-bash">git push origin &lt;branch_name&gt;</code></pre>
<h3 id="branch-확인-branch--r--a">BRANCH 확인 (branch, -r, -a)</h3>
<h4 id="local-branch-목록-확인-branch">LOCAL BRANCH 목록 확인 (branch)</h4>
<pre><code class="language-bash">git branch</code></pre>
<h4 id="remote-branch-목록-확인--r">REMOTE BRANCH 목록 확인 (-r)</h4>
<pre><code class="language-bash">git branch -r</code></pre>
<h4 id="모든-branch-목록-확인--a">모든 BRANCH 목록 확인 (-a)</h4>
<pre><code class="language-bash">git branch -a</code></pre>
<h3 id="branch-삭제---delete">BRANCH 삭제 (--delete)</h3>
<h4 id="local-branch-삭제">LOCAL BRANCH 삭제</h4>
<pre><code class="language-bash">git branch --delete &lt;branch_name&gt;</code></pre>
<h4 id="remote-branch-삭제">REMOTE BRANCH 삭제</h4>
<pre><code class="language-bash">git push origin --delete &lt;branch_name&gt;</code></pre>
<h3 id="branch간-이동-checkout">BRANCH간 이동 (checkout)</h3>
<pre><code class="language-bash">git checkout &lt;branch_name&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] CHECKOUT]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-CHECKOUT</link>
            <guid>https://velog.io/@bizpm_aiden/Git-CHECKOUT</guid>
            <pubDate>Mon, 19 Feb 2024 03:09:17 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git의 특정 버전으로 이동하기 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="버전-이동-checkout">버전 이동 (checkout)</h3>
<p>특정 버전으로 이동할 수 있으며, HEAD 위치가 해당 버전으로 이동합니다.</p>
<pre><code class="language-bash">git checkout &lt;commit_id&gt; # commit_id는 git hash code로 log를 통해 확인 가능합니다.</code></pre>
<p>BRANCH 이동도 가능합니다.</p>
<pre><code class="language-bash">git checkout &lt;branch_name&gt;</code></pre>
<h4 id="추가-내용">추가 내용</h4>
<p>특정 버전으로 이동 시 Working Directory도 해당 버전으로 변경됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] HISTORY]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-HISTORY</link>
            <guid>https://velog.io/@bizpm_aiden/Git-HISTORY</guid>
            <pubDate>Mon, 19 Feb 2024 03:00:59 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git의 실행 결과를 확인하기 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="로그-확인하기-log">로그 확인하기 (log)</h3>
<p>REPOSITORY의 COMMIT 이력을 시간 순으로 출력합니다.</p>
<pre><code class="language-bash">git log</code></pre>
<h4 id="로그-갯수-지정-확인-number">로그 갯수 지정 확인 (number)</h4>
<p>로그를 number 갯수만큼 최신 순으로 표시합니다.</p>
<pre><code class="language-bash">git log -&lt;number&gt;</code></pre>
<h4 id="로그-갯수-생략-확인---skip">로그 갯수 생략 확인 (--skip)</h4>
<p>로그를 number 갯수만큼 최신 것부터 생략해 표시합니다.</p>
<pre><code class="language-bash">git log --skip &lt;number&gt;</code></pre>
<h4 id="commit마다-변경내용-출력--p">COMMIT마다 변경내용 출력 (-p)</h4>
<p>COMMIT마다 어떤 변경사항이 있었는지 출력합니다.</p>
<pre><code class="language-bash">git log -p</code></pre>
<p>최신 로그를 갯수 지정해서 출력하는 것도 가능합니다.</p>
<pre><code class="language-bash">git log -p -&lt;number&gt;</code></pre>
<h4 id="한-줄로-출력--p">한 줄로 출력 (-p)</h4>
<p>로그를 한 줄로 요약해서 출력합니다.</p>
<pre><code class="language-bash">git log --oneline</code></pre>
<p>최신 로그를 갯수 지정해서 출력하는 것도 가능합니다.</p>
<pre><code class="language-bash">git log --online -&lt;number&gt;</code></pre>
<h5 id="추가내용">추가내용</h5>
<ul>
<li>oneline으로 출력 시 Git hash code는 7자리만 출력됩니다.
(7자리 이후는 버전 정보가 아닌 다른 정보를 담고 있는 code이기 때문입니다.)<h4 id="사용자-정보로-검색---author">사용자 정보로 검색 (--author)</h4>
사용자 정보 (name, email)로 검색해서 로그를 출력합니다.<pre><code class="language-bash">git log --author=&lt;user_name or user_email&gt;</code></pre>
최신 로그를 갯수 지정해서 출력하는 것도 가능합니다.<pre><code class="language-bash">git log --author=&lt;user_name or user_email&gt; -&lt;number&gt;</code></pre>
<h4 id="파일-변경-내역으로-검색--s">파일 변경 내역으로 검색 (-S)</h4>
파일 변경 내용으로 검색해서 로그를 출력합니다.<pre><code class="language-bash">git log -S &lt;검색어&gt;</code></pre>
COMMIT 변경 내역을 출력하는 것도 가능합니다.<pre><code class="language-bash">git log -p -S &lt;검색어&gt;</code></pre>
<h4 id="commit-message로-검색---grep">COMMIT MESSAGE로 검색 (--grep)</h4>
COMMIT MESSAGE로 검색해서 로그를 출력합니다.<pre><code class="language-bash">git log --grep &lt;검색어&gt;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] 기본문법]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@bizpm_aiden/Git-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Mon, 19 Feb 2024 02:44:51 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>Git의 상태 확인, 추가, 제거, 이동하기 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="git-파일-상태-확인-status">Git 파일 상태 확인 (status)</h3>
<p>Working Directory와 Staging Area의 상태를 표시합니다. (자주 확인하는 것을 권장합니다.)</p>
<pre><code class="language-bash">git status</code></pre>
<h3 id="파일-상태-변경-및-변경사항-저장-add-commit">파일 상태 변경 및 변경사항 저장 (add, commit)</h3>
<h4 id="파일-staged-상태로-변경-add">파일 STAGED 상태로 변경 (add)</h4>
<ul>
<li>Untracked 상태의 파일을 Staged 상태로 변경하기 위해 사용합니다.
(Working Directory -&gt; Staging Area로 변경합니다.)</li>
<li>add가 되는 경우 git이 관리를 시작하게 됩니다.<pre><code class="language-bash">git add &lt;file_name&gt;</code></pre>
파일 이름을 제외하고 git add로 사용할 수 있지만 쓸모 없는 파일까지 모두 add될 수 있어 사용 시 주의가 필요합니다.<pre><code class="language-bash">git add</code></pre>
<h4 id="파일-변경사항-저장-commit">파일 변경사항 저장 (commit)</h4>
</li>
<li>add 상태의 파일을 최종 commit합니다.</li>
<li>Modified 상태의 파일도 commit합니다.<pre><code class="language-bash">git commit -m &lt;commit_message&gt; # &lt;commit_message&gt;는 버전 이름처럼 생각할 수 있습니다.</code></pre>
Modified 상태의 파일은 add를 생략하고 commit 할 수 있습니다.
(단, git에 최초 add하지 않은 파일은 불가합니다.)<pre><code class="language-bash">git commit -a -m &lt;commit_message&gt;</code></pre>
<h3 id="git-관리-파일-삭제-rm">Git 관리 파일 삭제 (rm)</h3>
더 이상 Git에서 관리하지 않게 됩니다.</li>
<li>Staging Area의 파일을 삭제하고 commit합니다.</li>
<li>Working Directory에서도 파일이 삭제됩니다.<pre><code class="language-bash">git rm &lt;file_name&gt;</code></pre>
만약, Working Directory에서 파일을 직접 삭제했다면 git에도 반영하기 위해 rm을 진행해야 합니다.<h3 id="파일-이름-위치-변경-mv">파일 이름, 위치 변경 (mv)</h3>
파일 이름을 변경하거나 위치를 변경할 때 사용합니다.<pre><code class="language-bash">git mv &lt;old_name&gt; &lt;new_name&gt;</code></pre>
파일 이름에는 위치가 포함되어 있습니다.<pre><code class="language-bash">git mv test.txt folder1/new.txt</code></pre>
mv의 동작 방식은 파일 복사, 삭제, git add를 한 것과 동일합니다.<pre><code class="language-bash">cp &lt;old_name&gt; &lt;new_name&gt; # 파일 복사
</code></pre>
</li>
</ul>
<p>git rm <old_name> # 기존 파일 삭제</p>
<p>git add <new_name> # 새로운 파일 ADD</p>
<p>```</p>
<h3 id="무시하는-패턴-관리-ignore">무시하는 패턴 관리 (ignore)</h3>
<p>git에서 무시해야 하는 파일 패턴을 관리합니다.
(.gitignore 파일에서 관리합니다.)</p>
<p>Ex)</p>
<ul>
<li>*.a : 확장자가 a인 파일은 무시합니다.</li>
<li>!lib.a : 확장자가 a인 파일은 무시되지만, lib.a 파일은 무시하지 않습니다.</li>
<li>/TODO : 현재 디렉토리의 TODO 파일을 무시합니다. (경로 설정에 따라 달라집니다.)</li>
<li>build/ : build 디렉토리의 모든 파일을 무시합니다.</li>
<li>doc/*.txt : doc 디렉토리 내 txt 파일을 무시합니다. (다른 경로 내 txt파일은 무시하지 않습니다.)</li>
<li>doc/<em>*/</em>.pdf : doc 디렉토리 내 모든 .pdf 파일을 무시합니다. (하위 폴더에도 적용됩니다.)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] PULL, PUSH]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-PULL-PUSH</link>
            <guid>https://velog.io/@bizpm_aiden/Git-PULL-PUSH</guid>
            <pubDate>Sat, 17 Feb 2024 08:10:00 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>REPOSITORY를 동기화하기 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="remote-repository---local-repository-pull">REMOTE REPOSITORY -&gt; LOCAL REPOSITORY (pull)</h3>
<p>REMOTE REPOSITORY 의 작업 내용을 LOCAL REPOSITORY로 불러옵니다.</p>
<pre><code class="language-bash">git pull &lt;remote_repo_name&gt; &lt;branch_name&gt;</code></pre>
<p>보통 name은 origin, branch는 main을 기본적으로 사용합니다.</p>
<pre><code class="language-bash">git pull orgin main # git pull만 입력해도 동기화 가능합니다.</code></pre>
<h3 id="local-repository---remote-repository-push">LOCAL REPOSITORY -&gt; REMOTE REPOSITORY (push)</h3>
<p>LOCAL REPOSITORY 의 작업 내용을 REMOTE REPOSITORY로 불러옵니다.</p>
<pre><code class="language-bash">git push &lt;remote_repo_name&gt; &lt;branch_name&gt;</code></pre>
<p>보통 name은 origin, branch는 main을 기본적으로 사용합니다.</p>
<pre><code class="language-bash">git push orgin main # git push만 입력해도 동기화 가능합니다.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] REPOSITORY]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-REPOSITORY</link>
            <guid>https://velog.io/@bizpm_aiden/Git-REPOSITORY</guid>
            <pubDate>Fri, 16 Feb 2024 07:34:40 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>REPOSITORY를 생성, 삭제, 수정하기 위한 Git 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<ul>
<li>Git REPOSITORY는 Git 저장소입니다. (Git으로 관리하는 프로젝트 저장소)</li>
<li>파일과 디렉토리가 포함될 수 있고, 버전관리를 시작할 수 있습니다.</li>
</ul>
<h2 id="설정-방식">설정 방식</h2>
<p>LOCAL REPOSITORY와 REMOTE REPOSITORY를 상호 연동해야 합니다.</p>
<h3 id="1-local-repository를-먼저-생성한-경우">1. LOCAL REPOSITORY를 먼저 생성한 경우</h3>
<ol>
<li>LOCAL REPOSITORY를 생성합니다.</li>
<li>Github에서 REMOTE REPOSITORY를 생성합니다.</li>
<li>LOCAL REPOSITORY를 생성한 폴더에서 터미널을 통해 REMOTE REPOSITORY를 추가합니다.<h3 id="2-remote-repository를-먼저-생성한-경우">2. REMOTE REPOSITORY를 먼저 생성한 경우</h3>
</li>
<li>Github에서 REMOTE REPOSITORY를 생성합니다.</li>
<li>LOCAL REPOSITORY를 생성할 상위 폴더에서 REMOTE REPOSITORY를 복제합니다.</li>
</ol>
<h2 id="문법">문법</h2>
<h3 id="local-repository-생성-init">LOCAL REPOSITORY 생성 (init)</h3>
<p>LOCAL REPOSITORY는 사용자 컴퓨터 저장소입니다.
init으로 아직 버전관리를 하고 있지 않은 폴더를 Git 저장소로 만들 수 있습니다.</p>
<pre><code class="language-bash">git init</code></pre>
<h4 id="추가내용-1">추가내용</h4>
<ul>
<li>LOCAL REPOSITORY 생성 시에는 꼭 저장소가 생성될 폴더를 미리 생성해야 합니다.</li>
<li>폴더를 생성한 후 터미널을 통해 폴더에 진입 (cd) 후 init을 합니다.<h3 id="remote-repository-생성-github-clone">REMOTE REPOSITORY 생성 (Github, clone)</h3>
REMOTE REPOSITORY는 원격 서버 저장소입니다.
Github에서 REPOSITORY를 생성하고 LOCAL 환경에 복제 (clone) 할 수 있습니다.<pre><code class="language-bash">git clone &lt;remote_repository_url&gt;</code></pre>
Ex)<pre><code class="language-bash">git clone https://github.com/&lt;user_name&gt;/&lt;project_name&gt;.git </code></pre>
<h4 id="추가내용-2">추가내용</h4>
</li>
<li>Github에서 생성된 REPOSITORY를 복제합니다.</li>
<li>폴더를 함께 생성하기 때문에 폴더를 만들 위치로 이동 (cd) 한 후 clone을 합니다.<h3 id="remote-repository-생성-with-token-github-clone">REMOTE REPOSITORY 생성 with TOKEN (Github, clone)</h3>
REMOTE REPOSITORY로 접속할 때, 사용자 인증하는 과정을 건너뛰기 위해 TOKEN 발행 후 REPOSITORY 생성 시 토큰을 추가한 URL을 입력합니다.<pre><code class="language-bash">git clone &lt;remote_repository_url + TOKEN&gt;</code></pre>
Ex) https://와 github 사이에 &#39;TOKEN 값 + @&#39;을 추가합니다.<pre><code class="language-bash">git clone https://&lt;token_value&gt;@github.com/&lt;user_name&gt;/&lt;project_name&gt;.git</code></pre>
<h4 id="추가내용-3">추가내용</h4>
</li>
<li>TOKEN은 Github에서 발급합니다.</li>
<li>보안 상의 이유로 되도록이면 TOKEN 유효기간을 설정합니다.<h3 id="remote-repository-추가-add">REMOTE REPOSITORY 추가 (add)</h3>
LOCAL REPOSITORY를 먼저 생성해 REMOTE REPOSITORY를 추가할 때 사용합니다.<pre><code class="language-bash">git remote add &lt;remote_repo_name&gt; &lt;remote_repo_url&gt;;</code></pre>
보통 REMOTE REPOSITORY NAME은 origin으로 생성합니다.
(clone 시에도 origin으로 등록됩니다.)<pre><code class="language-bash">git remote add origin &lt;remote_repo_url&gt;;</code></pre>
<h3 id="remote-repository-url-변경-set-url">REMOTE REPOSITORY URL 변경 (set-url)</h3>
<pre><code class="language-bash">git remote set-url &lt;remote_repo_name&gt; &lt;remote_repository_url&gt;</code></pre>
<pre><code class="language-bash">git remote set-url origin &lt;remote_repository_url&gt;</code></pre>
<h3 id="remote-repository-name-변경-rename">REMOTE REPOSITORY NAME 변경 (rename)</h3>
<pre><code class="language-bash">git remote rename &lt;old_name&gt; &lt;new_name&gt;</code></pre>
<h3 id="remote-repository-삭제-remove">REMOTE REPOSITORY 삭제 (remove)</h3>
<pre><code class="language-bash">git remote remove &lt;remote_repo_name&gt;</code></pre>
<pre><code class="language-bash">git remote remove origin</code></pre>
<h3 id="remote-repository-정보-확인--v">REMOTE REPOSITORY 정보 확인 (-v)</h3>
<pre><code class="language-bash">git remote -v</code></pre>
<h3 id="remote-repository-상세-정보-확인--v">REMOTE REPOSITORY 상세 정보 확인 (-v)</h3>
<pre><code class="language-bash">git remote show &lt;remote_repo_name&gt;</code></pre>
<pre><code class="language-bash">git remote show origin</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] CONFIG]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-CONFIG</link>
            <guid>https://velog.io/@bizpm_aiden/Git-CONFIG</guid>
            <pubDate>Thu, 15 Feb 2024 03:38:33 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>CONFIG는 Git 기본 설정을 위한 Git 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="git-설정-범위-system-global-local">Git 설정 범위 (SYSTEM, GLOBAL, LOCAL)</h3>
<h4 id="시스템의-모든-사용자와-모든-저장소에-적용-system">시스템의 모든 사용자와 모든 저장소에 적용 (SYSTEM)</h4>
<pre><code class="language-bash">git config --system</code></pre>
<h4 id="시스템의-특정-사용자에게-적용-global">시스템의 특정 사용자에게 적용 (GLOBAL)</h4>
<pre><code class="language-bash">git config --global</code></pre>
<h4 id="특정-저장소에-적용-local">특정 저장소에 적용 (LOCAL)</h4>
<pre><code class="language-bash">git config --local</code></pre>
<h3 id="user-name-e-mail-username-useremail">USER NAME, E-MAIL (user.name, user.email)</h3>
<h4 id="user-name-username">USER NAME (user.name)</h4>
<pre><code class="language-bash">git config user.name &lt;user_name&gt;</code></pre>
<p>Ex)</p>
<pre><code class="language-bash">git config user.name aiden</code></pre>
<h4 id="user-e-mail-useremail">USER E-MAIL (user.email)</h4>
<pre><code class="language-bash">git config user.email &lt;email_address&gt;</code></pre>
<p>Ex)</p>
<pre><code class="language-bash">git config user.email bizpm.aiden@gmail.com</code></pre>
<h3 id="crlf-coreautocrlf">CRLF (core.autocrlf)</h3>
<p>CRLF는 줄바꿈 문자의 방식을 나타내며, 각 운영체제(OS)마다 차이가 있어 설정을 맞춰주어야 합니다.</p>
<h4 id="운영체제별-crlf">운영체제별 CRLF</h4>
<ul>
<li>WINDOWS : CR(\r), LF(\n) 모두 사용합니다.</li>
<li>MAC, LINUX : LF(\n)만 사용합니다.<h4 id="crlf-coreautocrlf-1">CRLF (core.autocrlf)</h4>
<pre><code class="language-bash">git config core.autocrlf = &lt;value&gt;</code></pre>
<h4 id="crlf-value-true-false-input">CRLF VALUE (TRUE, FALSE, INPUT)</h4>
<h5 id="true--파일-내-줄바꿈-문자를-crlf에서-lf로-변경합니다">TRUE : 파일 내 줄바꿈 문자를 CRLF에서 LF로 변경합니다.</h5>
<pre><code class="language-bash">git config core.autocrlf = true # WINDOWS 운영체제라면 이 설정을 사용합니다.</code></pre>
<h5 id="false--파일-내-줄바꿈-문자-상관없이-작업한-환경의-줄바꿈-문자를-적용합니다">FALSE : 파일 내 줄바꿈 문자 상관없이 작업한 환경의 줄바꿈 문자를 적용합니다.</h5>
<pre><code class="language-bash">git config core.autocrlf = false</code></pre>
<h5 id="input--commit-시에만-crlf를-lf로-변경합니다">INPUT : COMMIT 시에만 CRLF를 LF로 변경합니다.</h5>
<pre><code class="language-bash">git config core.autocrlf = input</code></pre>
<h3 id="기본-editor-설정-coreeditor">기본 EDITOR 설정 (core.editor)</h3>
<pre><code class="language-bash">git config core.editor &lt;editor_name&gt;</code></pre>
Ex) VSCODE 사용 시<pre><code class="language-bash">git config core.editor code</code></pre>
<h3 id="default-branch-설정-initdefaultbranch">DEFAULT BRANCH 설정 (init.defaultBranch)</h3>
MAC은 master가 기본이며, Github은 main이 기본이기 때문에 맞춰줘야 합니다.<pre><code class="language-bash">git config init.defaultBranch &lt;branch_name&gt;</code></pre>
Ex)<pre><code class="language-bash">git config init.defaultBranch main</code></pre>
<h3 id="git-설정-확인-list-show-origin">Git 설정 확인 (list, show, origin)</h3>
<h4 id="전체-설정-확인-list">전체 설정 확인 (list)</h4>
<pre><code class="language-bash">git config --l</code></pre>
<pre><code class="language-bash">git config --list</code></pre>
<h4 id="범위별-설정-확인-show-origin">범위별 설정 확인 (show, origin)</h4>
<pre><code class="language-bash">git config --l --show-origin</code></pre>
<pre><code class="language-bash">git config --list --show-origin</code></pre>
<h4 id="항목별-설정-확인">항목별 설정 확인</h4>
<pre><code class="language-bash">git config &lt;key&gt;</code></pre>
Ex) crlf 설정 확인 시<pre><code class="language-bash">git config core.autocrlf</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] 버전관리]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@bizpm_aiden/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Thu, 15 Feb 2024 02:00:16 GMT</pubDate>
            <description><![CDATA[<h2 id="버전관리">버전관리</h2>
<ul>
<li>최초 버전의 파일에서 수정된 부분 (Diff)만 저장합니다.</li>
<li>Git의 경우 파일 수정 시 스냅샷을 저장합니다.
(단, 수정사항이 없다면 저장하지 않습니다.)</li>
</ul>
<h2 id="git의-영역">Git의 영역</h2>
<img src = "https://velog.velcdn.com/images/bizpm_aiden/post/b30a2d27-1947-4938-aa14-50571abf3f4f/image.png">

<h6 id="이미지-출처-about_staging-area-git-scm">이미지 출처. <a href="https://git-scm.com/about/staging-area">About_Staging Area</a>, git-scm</h6>
<h3 id="working-directory">Working Directory</h3>
<ul>
<li>실제 작업 공간입니다.</li>
<li>ADD 시 Staging Area로 이동합니다.</li>
</ul>
<h3 id="staging-area-index">Staging Area (Index)</h3>
<ul>
<li>ADD 시 이동하는 공간입니다. (버전 생성 전 공간)</li>
<li>COMMIT 시 .git Directory로 이동합니다.
(Staging Area에서 COMMIT 가능)<h3 id="git-directory-repository">.git Directory (Repository)</h3>
</li>
<li>COMMIT 시 버전이 생성됩니다. (버전 관리 공간)</li>
</ul>
<h2 id="git-파일-상태">Git 파일 상태</h2>
<h3 id="modified">MODIFIED</h3>
<ul>
<li>파일을 수정한 상태입니다.
(COMMIT하지 않은 상태)<h3 id="staged">STAGED</h3>
</li>
<li>파일 수정 후 COMMIT을 준비하기 위한 상태입니다.<h3 id="committed">COMMITTED</h3>
</li>
<li>COMMIT되어 .git Directory에 버전이 저장된 상태입니다.</li>
<li>다시 파일을 수정하는 경우 MODIFIED 상태가 됩니다.<h2 id="git-파일-라이프사이클">Git 파일 라이프사이클</h2>
<img src="https://velog.velcdn.com/images/bizpm_aiden/post/d8975bf4-7c43-4244-bea2-6d4ce27f93c3/image.png" alt=""><h6 id="이미지-출처-git-basics---recording-changes-to-the-repository-git-scm">이미지 출처. <a href="https://git-scm.com/about/staging-area">Git Basics - Recording Changes to the Repository</a>, git-scm</h6>
</li>
</ul>
<h3 id="untracked">UNTRACKED</h3>
<ul>
<li>Working Directory에만 존재하며, 아직 Git이 관리하지 않는 상태입니다.</li>
<li>Git이 관리하기 위해서는 ADD를 통해 Staged 상태로 변경해야 합니다.<h3 id="staged-tracked">STAGED (TRACKED)</h3>
</li>
<li>ADD를 통해 Staging Area로 이동한 상태입니다.</li>
<li>COMMIT이 가능한 상태입니다.<h3 id="unmodified-tracked">UNMODIFIED (TRACKED)</h3>
</li>
<li>COMMIT을 통해 .git Directory로 버전이 생성된 상태입니다.</li>
<li>COMMIT 이후 아직 수정되지 않은 상태입니다.<h3 id="modified-tracked">MODIFIED (TRACKED)</h3>
</li>
<li>COMMIT 이후 파일이 수정된 상태입니다.</li>
<li>다시 Staging Area로 옮긴 후 COMMIT을 진행해야 합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] VCS]]></title>
            <link>https://velog.io/@bizpm_aiden/Git-VCS</link>
            <guid>https://velog.io/@bizpm_aiden/Git-VCS</guid>
            <pubDate>Thu, 15 Feb 2024 01:21:45 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>작업 DATA를 VERSION별로 관리하기 위해 Git을 사용합니다.</p>
<h2 id="버전-관리-시스템-vcs-version-control-system">버전 관리 시스템 (VCS, Version Control System)</h2>
<h3 id="필요-목적">필요 목적</h3>
<ul>
<li>하나의 프로젝트를 여러 개발자가 함께 공동 개발하는 경우가 많습니다.</li>
<li>문제 발생 시 특정 버전으로 되돌릴 수 있어야 합니다.</li>
<li>여러 개발 시스템과 연동이 필요합니다.<h3 id="버전-관리-시스템의-변화">버전 관리 시스템의 변화</h3>
<h4 id="local-version-control-system-local-vcs">Local Version Control System (Local VCS)</h4>
</li>
<li>최초의 버전 관리 시스템입니다.</li>
<li>사용자의 컴퓨터 저장소에 버전을 관리하기 때문에 협업이 어렵고 저장소 훼손 시 복구가 어려웠습니다.<h4 id="centralized-version-control-system-cvcs">Centralized Version Control System (CVCS)</h4>
</li>
<li>서버에 버전을 관리하는 방식입니다.</li>
<li>제한적인 협업이 가능하나 서버에 바로 COMMIT하기 때문에 배포되어 다수에게 버그가 발생할 가능성이 있습니다.
(제한적인 협업 : 한 사람이 작업 중인 경우 다른 사람이 작업할 수 없습니다.)</li>
<li>자신만의 버전을 가질 수 없으며, 서버와 연결이 필요해 오프라인으로는 작업이 불가합니다.</li>
<li>단, 보안이 중요한 경우에는 이 방식을 사용할 수 있습니다.<h4 id="distributed-version-control-system-dvcs">Distributed Version Control System (DVCS)</h4>
</li>
<li>현재 가장 많이 사용되는 Git이 분산 버전 처리 시스템입니다.</li>
<li>사용자 컴퓨터 저장소에 버전을 저장하기 때문에 개별 버전 작업과 오프라인 작업이 가능합니다.</li>
<li>원하는 순간에 배포(PUSH)하면 원격 저장소에 작업 내역이 업로드됩니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] SUBQUERY]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL-SUBQUERY</link>
            <guid>https://velog.io/@bizpm_aiden/SQL-SUBQUERY</guid>
            <pubDate>Mon, 12 Feb 2024 10:14:44 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>하나의 SQL문 내 또 다른 SQL문을 사용하기 위한 SQL 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<p>MAIN QUERY가 SUBQUERY를 포함하는 종속적인 관계입니다.</p>
<ul>
<li>SUBQUERY는 MAIN QUERY의 COLUMN을 사용할 수 있습니다.</li>
<li>MAIN QUERY는 SUBQUERY의 COLUMN을 사용할 수 없습니다.</li>
</ul>
<p>SUBQUERY 내에서 ORDER BY는 사용할 수 없습니다.
단일행 혹은 복수행 비교연산자와 함께 사용할 수 있습니다.</p>
<h2 id="문법">문법</h2>
<h3 id="scalar-subquery-select절">SCALAR SUBQUERY (SELECT절)</h3>
<p>SELECT절에 사용하는 SUBQUERY이며, SUBQUERY의 결과는 하나의 COLUMN입니다.</p>
<pre><code class="language-sql">SELECT column1, (SELECT column2 FROM table2 WHERE condtion)
FROM table1
WHERE condition;</code></pre>
<h3 id="inline-view-from절">INLINE VIEW (FROM절)</h3>
<p>FROM절에 사용하는 SUBQUERY이며, MAIN QUERY에서는 INLINE VIEW에서 조회한 COLUMN만 사용 가능합니다.</p>
<pre><code class="language-sql">SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;</code></pre>
<h3 id="nested-subquery-where절">NESTED SUBQUERY (WHERE절)</h3>
<p>WHERE절에 사용하는 SUBQUERY이며, SINGLE ROW, MULTIPLE ROW, MULTIPLE COLUMN으로 종류가 나뉘어집니다.</p>
<h4 id="추가내용-1">추가내용</h4>
<ul>
<li>SINGLE ROW : 하나의 ROW를 검색하는 SUBQUERY</li>
<li>MULTIPLE ROW : 하나 이상의 ROW를 검색하는 SUBQUERY</li>
<li>MULTIPLE COLUMN : 하나 이상의 COLUMN을 검색하는 SUBQUERY<h4 id="single-row-하나의-행을-검색하는-서브쿼리">SINGLE ROW (하나의 행을 검색하는 서브쿼리)</h4>
SUB QUERY의 결과 값이 2개 이상이라면 에러가 발생합니다.<pre><code class="language-sql">SELECT columnname
FROM tablename
WHERE columnname = (SELECT columnname
                  FROM tablename
                  WHERE condition)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
<h4 id="multiple-row---in-subquery-결과-중-포함될-때">MULTIPLE ROW - IN (SUBQUERY 결과 중 포함될 때)</h4>
<pre><code class="language-sql">SELECT columnname
FROM tablename
WHERE columnname IN (SELECT columnname
                  FROM tablename
                  WHERE condition)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
<h4 id="multiple-row---exists-subquery-결과에-값이-있다면-반환">MULTIPLE ROW - EXISTS (SUBQUERY 결과에 값이 있다면 반환)</h4>
<pre><code class="language-sql">SELECT columnname
FROM tablename
WHERE columnname EXISTS (SELECT columnname
                  FROM tablename
                  WHERE condition)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
<h4 id="multiple-row---any-subquery-결과-중-최소한-하나라도-만족한다면">MULTIPLE ROW - ANY (SUBQUERY 결과 중 최소한 하나라도 만족한다면)</h4>
비교 연산자를 함께 사용합니다.<pre><code class="language-sql">SELECT columnname
FROM tablename
WHERE columnname = ANY (SELECT columnname
                  FROM tablename
                  WHERE condition)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
<h4 id="multiple-row---all-subquery-결과를-모두-만족한다면">MULTIPLE ROW - ALL (SUBQUERY 결과를 모두 만족한다면)</h4>
비교 연산자를 함께 사용합니다.<pre><code class="language-sql">SELECT columnname
FROM tablename
WHERE columnname = ALL (SELECT columnname
                  FROM tablename
                  WHERE condition)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
<h4 id="multiple-column-연관-서브쿼리">MULTIPLE COLUMN (연관 서브쿼리)</h4>
SUBQUERY 내 MAIN QUERY의 COLUMN이 같이 사용되는 경우 사용합니다.<pre><code class="language-sql">SELECT columnname
FROM tablename a
WHERE (a.column1, a.column2,...) IN (SELECT b.column1, b.column2,...
                                   FROM tablename b
                                   WHERE a.column = b.column)
ORDER BY columnname; # MAIN QUERY에서는 ORDER BY 사용 가능합니다.</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] SCALAR FUNCTION]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL-SCALAR-FUNCTION</link>
            <guid>https://velog.io/@bizpm_aiden/SQL-SCALAR-FUNCTION</guid>
            <pubDate>Mon, 12 Feb 2024 09:30:52 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>입력 DATA 값을 기준으로 단일 DATA 값을 출력하기 위한 SQL 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="영문-대문자-변환-ucase">영문 대문자 변환 (UCASE)</h3>
<pre><code class="language-sql">SELECT UCASE(string);</code></pre>
<pre><code class="language-sql">SELECT UCASE(column)
FROM tablename;</code></pre>
<h3 id="영문-소문자-변환-lcase">영문 소문자 변환 (LCASE)</h3>
<pre><code class="language-sql">SELECT LCASE(string);</code></pre>
<pre><code class="language-sql">SELECT LCASE(column)
FROM tablename;</code></pre>
<h3 id="문자열-부분-반환-mid">문자열 부분 반환 (MID)</h3>
<p>string을 start_position 번째에서 length만큼 반환합니다.</p>
<pre><code class="language-sql">SELECT MID(string, start_position, length);</code></pre>
<h4 id="추가내용">추가내용</h4>
<p>start_position에 - 를 붙인다면 뒤에서 n번째라는 의미입니다.</p>
<pre><code class="language-sql">SELECT MID(string, -start_position, length);</code></pre>
<h3 id="문자열-길이-반환-length">문자열 길이 반환 (LENGTH)</h3>
<pre><code class="language-sql">SELECT LENGTH(string);</code></pre>
<pre><code class="language-sql">SELECT LENGTH(column)
FROM tablename;</code></pre>
<h4 id="추가내용-1">추가내용</h4>
<ul>
<li>공백도 자리로 인식한다.</li>
<li>NULL은 NULL로 반환한다.<h3 id="숫자-반올림-round">숫자 반올림 (ROUND)</h3>
number를 decimals_place에서 반올림합니다.<pre><code class="language-sql">SELECT ROUND(number, decimals_place);</code></pre>
<pre><code class="language-sql">SELECT ROUND(column, decimals_place)
FROM tablename;</code></pre>
<h4 id="decimals_place-반올림-소수점-위치">decimals_place (반올림 소수점 위치)</h4>
</li>
<li>0은 소수점 첫째자리를 의미하며, 1은 소수점 둘째자리를 의미합니다.</li>
<li>생략 시 0 (소수점 첫째자리)로 간주됩니다.</li>
<li>-1은 일의 자리입니다.</li>
</ul>
<h3 id="현재-날짜-시간-반환-now">현재 날짜, 시간 반환 (NOW)</h3>
<pre><code class="language-sql">SELECT NOW();</code></pre>
<h3 id="숫자-1000단위-콤마-형식으로-변환-format">숫자 1,000단위 콤마(,) 형식으로 변환 (FORMAT)</h3>
<p>1,000단위 콤마 형식의 number를 decimal_place까지 표시합니다.</p>
<pre><code class="language-sql">SELECT FORMAT(number, decimal_place);</code></pre>
<pre><code class="language-sql">SELECT FORMAT(column, decimal_place)
FROM tablename;</code></pre>
<h4 id="decimal_place-표시할-소수점-위치">decimal_place (표시할 소수점 위치)</h4>
<ul>
<li>0은 소수점을 표시하지 않겠다는 의미입니다.</li>
<li>2는 소수점 둘째자리까지 표시한다는 의미입니다.<h2 id="예시">예시</h2>
가정)</li>
<li>TABLE NAME : testTABLE</li>
<li>COLUMN 1 NAME : TYPE</li>
<li>COLUMN 2 NAME : PRICE</li>
<li>COLUMN 3 NAME : NAME<h3 id="영문-대문자-변환-ucase-1">영문 대문자 변환 (UCASE)</h3>
aiden을 대문자로 변환하라.<pre><code class="language-sql">SELECT UCASE(&quot;aiden&quot;);</code></pre>
NAME COLUMN을 대문자로 변환하라.<pre><code class="language-sql">SELECT UCASE(NAME)
FROM testTABLE;</code></pre>
<h3 id="영문-소문자-변환-lcase-1">영문 소문자 변환 (LCASE)</h3>
AIDEN을 소문자로 변환하라.<pre><code class="language-sql">SELECT LCASE(&quot;AIDEN&quot;);</code></pre>
NAME COLUMN을 소문자로 변환하라.<pre><code class="language-sql">SELECT LCASE(NAME)
FROM testTABLE;</code></pre>
<h3 id="문자열-부분-반환-mid-1">문자열 부분 반환 (MID)</h3>
Aiden을 2번째에서 3만큼 반환하라.<pre><code class="language-sql">SELECT MID(&quot;Aiden&quot;, 2, 3);</code></pre>
<h4 id="추가내용-2">추가내용</h4>
Aiden을 뒤에서 2번째에서 3만큼 반환하라.<pre><code class="language-sql">SELECT MID(&quot;Aiden&quot;, -2, 3);</code></pre>
<h3 id="문자열-길이-반환-length-1">문자열 길이 반환 (LENGTH)</h3>
Aiden의 길이를 반환하라.<pre><code class="language-sql">SELECT LENGTH(&quot;Aiden&quot;);</code></pre>
NAME COLUMN의 길이를 반환하라.<pre><code class="language-sql">SELECT LENGTH(NAME)
FROM testTABLE;</code></pre>
<h3 id="숫자-반올림-round-1">숫자 반올림 (ROUND)</h3>
</li>
</ul>
<p>1234.5를 소수점 첫째자리에서 반올림하라.</p>
<pre><code class="language-sql">SELECT ROUND(1234.5, 0); # 0은 생략 가능합니다.</code></pre>
<p>PRICE COLUMN을 일의 자리에서 반올림하라.</p>
<pre><code class="language-sql">SELECT ROUND(PRICE, -1)
FROM testTABLE;</code></pre>
<h3 id="현재-날짜-시간-반환-now-1">현재 날짜, 시간 반환 (NOW)</h3>
<pre><code class="language-sql">SELECT NOW();</code></pre>
<h3 id="숫자-1000단위-콤마-형식으로-변환-format-1">숫자 1,000단위 콤마(,) 형식으로 변환 (FORMAT)</h3>
<p>123456을 1,000단위 콤마 형식으로 변환하라.</p>
<pre><code class="language-sql">SELECT FORMAT(123456, 0);</code></pre>
<p>PRICE COLUMN을 1,000단위 콤마 형식으로 변환하며, 소수점 3째자리까지 표시하라.</p>
<pre><code class="language-sql">SELECT FORMAT(PRICE, 3)
FROM testTABLE;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] HAVING]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL-HAVING</link>
            <guid>https://velog.io/@bizpm_aiden/SQL-HAVING</guid>
            <pubDate>Fri, 09 Feb 2024 06:56:08 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>AGGREGATE FUNCTION (집계함수)를 조건에 추가해 조회하기 위한 SQL 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<ul>
<li>AGGREGATE FUNCTION은 WHERE 절에서는 사용할 수 없어 HAVING을 사용한다.</li>
<li>HAVING 절은 GROUP BY와 함께 사용된다.</li>
</ul>
<h2 id="문법">문법</h2>
<h3 id="aggregate-function-조건-조회-having">AGGREGATE FUNCTION 조건 조회 (HAVING)</h3>
<pre><code class="language-sql">SELECT column1, column2,...
FROM tablename
WHERE conditon
GROUP BY column1, column2,...
HAVING condtion # AGGREGATE FUNCTION (집계함수)
ORDER BY column1, column2,...;</code></pre>
<h2 id="예시">예시</h2>
<p>가정)</p>
<ul>
<li>TABLE NAME : testTABLE</li>
<li>COLUMN 1 NAME : TYPE</li>
<li>COLUMN 2 NAME : PRICE</li>
<li>COLUMN 3 NAME : NAME<h3 id="그룹화-조회-group-by">그룹화 조회 (GROUP BY)</h3>
NAME과 PRICE를 TYPE에 따라 확인하라.
(단, PRICE가 평균 PRICE보다 높은 DATA만 확인하라.)<pre><code class="language-sql">SELECT TYPE, NAME, PRICE
FROM testTABLE
GROUP BY TYPE
HAVING PRICE &gt; AVG(PRICE)
ORDER BY PRICE;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] GROUP BY]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL-GROUP-BY</link>
            <guid>https://velog.io/@bizpm_aiden/SQL-GROUP-BY</guid>
            <pubDate>Fri, 09 Feb 2024 06:48:30 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>특정 COLUMN을 그룹화한 후 데이터 조회하기 위한 SQL 문법입니다.</p>
<h3 id="추가내용">추가내용</h3>
<p>DISTINCT와 비슷하지만 DISTINCT는 ORDER BY를 사용할 수 없고 GROUP BY는 ORDER BY를 사용할 수 있다.</p>
<h2 id="문법">문법</h2>
<h3 id="그룹화-조회-group-by">그룹화 조회 (GROUP BY)</h3>
<pre><code class="language-sql">SELECT column1, column2,...
FROM tablename
WHERE conditon
GROUP BY column1, column2,...
ORDER BY column1, column2,...;</code></pre>
<h2 id="예시">예시</h2>
<p>가정)</p>
<ul>
<li>TABLE NAME : testTABLE</li>
<li>COLUMN 1 NAME : TYPE</li>
<li>COLUMN 2 NAME : PRICE</li>
<li>COLUMN 3 NAME : NAME<h3 id="그룹화-조회-group-by-1">그룹화 조회 (GROUP BY)</h3>
NAME과 PRICE를 TYPE에 따라 확인하라.<pre><code class="language-sql">SELECT TYPE, NAME, PRICE
FROM testTABLE
GROUP BY TYPE
ORDER BY PRICE;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] AGGREGATE FUNCTION]]></title>
            <link>https://velog.io/@bizpm_aiden/SQL-AGGREGATE-FUNCTION</link>
            <guid>https://velog.io/@bizpm_aiden/SQL-AGGREGATE-FUNCTION</guid>
            <pubDate>Fri, 09 Feb 2024 06:28:37 GMT</pubDate>
            <description><![CDATA[<h2 id="사용목적">사용목적</h2>
<p>AGGREGATE FUNCTION (집계함수)는 여러 COLUMN 혹은 TABLE 전체 COLUMN에서 하나의 특정 결과값을 반환하는 SQL 문법입니다.</p>
<h2 id="문법">문법</h2>
<h3 id="갯수-계산-count">갯수 계산 (COUNT)</h3>
<pre><code class="language-sql">SELECT COUNT(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="합계-계산-sum">합계 계산 (SUM)</h3>
<pre><code class="language-sql">SELECT SUM(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="평균-계산-avg">평균 계산 (AVG)</h3>
<pre><code class="language-sql">SELECT AVG(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="가장-작은-값-계산-min">가장 작은 값 계산 (MIN)</h3>
<pre><code class="language-sql">SELECT MIN(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="가장-큰-값-계산-max">가장 큰 값 계산 (MAX)</h3>
<pre><code class="language-sql">SELECT MAX(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="첫번째-결과-값-first">첫번째 결과 값 (FIRST)</h3>
<pre><code class="language-sql">SELECT FIRST(column)
FROM tablename
WHERE condition;</code></pre>
<h3 id="마지막-결과-값-last">마지막 결과 값 (LAST)</h3>
<pre><code class="language-sql">SELECT LAST(column)
FROM tablename
WHERE condition;</code></pre>
<h2 id="예시">예시</h2>
<p>가정)</p>
<ul>
<li>TABLE NAME : testTABLE</li>
<li>COLUMN 1 NAME : NAME</li>
<li>COLUMN 2 NAME : AGE<h3 id="갯수-계산-count-1">갯수 계산 (COUNT)</h3>
</li>
</ul>
<pre><code class="language-sql">SELECT COUNT(NAME)
FROM testTABLE
WHERE NAME LIKE &#39;%김%&#39;;</code></pre>
<h3 id="합계-계산-sum-1">합계 계산 (SUM)</h3>
<pre><code class="language-sql">SELECT SUM(AGE)
FROM testTABLE
WHERE AGE &gt; 10;</code></pre>
<h3 id="평균-계산-avg-1">평균 계산 (AVG)</h3>
<pre><code class="language-sql">SELECT AVG(AGE)
FROM testTABLE
WHERE AGE &gt; 10;</code></pre>
<h3 id="가장-작은-값-계산-min-1">가장 작은 값 계산 (MIN)</h3>
<pre><code class="language-sql">SELECT MIN(AGE)
FROM testTABLE
WHERE AGE &gt; 10;</code></pre>
<h3 id="가장-큰-값-계산-max-1">가장 큰 값 계산 (MAX)</h3>
<pre><code class="language-sql">SELECT MAX(AGE)
FROM testTABLE
WHERE AGE &lt; 50;</code></pre>
<h3 id="첫번째-결과-값-first-1">첫번째 결과 값 (FIRST)</h3>
<pre><code class="language-sql">SELECT FIRST(NAME)
FROM testTABLE
WHERE NAME LIKE &#39;%김%&#39;;</code></pre>
<h3 id="마지막-결과-값-last-1">마지막 결과 값 (LAST)</h3>
<pre><code class="language-sql">SELECT LAST(NAME)
FROM testTABLE
WHERE NAME LIKE &#39;%김%&#39;;</code></pre>
]]></description>
        </item>
    </channel>
</rss>