<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Let's record it </title>
        <link>https://velog.io/</link>
        <description>Moving forward based on records</description>
        <lastBuildDate>Wed, 11 Jun 2025 01:28:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Let's record it </title>
            <url>https://velog.velcdn.com/images/dreamer_2023/profile/2595ff5e-92a2-4bfa-bbaa-ff0c1a49fa7f/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Let's record it . All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dreamer_2023" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 우유와 요거트가 담긴 장바구니]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9A%B0%EC%9C%A0%EC%99%80-%EC%9A%94%EA%B1%B0%ED%8A%B8%EA%B0%80-%EB%8B%B4%EA%B8%B4-%EC%9E%A5%EB%B0%94%EA%B5%AC%EB%8B%88</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9A%B0%EC%9C%A0%EC%99%80-%EC%9A%94%EA%B1%B0%ED%8A%B8%EA%B0%80-%EB%8B%B4%EA%B8%B4-%EC%9E%A5%EB%B0%94%EA%B5%AC%EB%8B%88</guid>
            <pubDate>Wed, 11 Jun 2025 01:28:27 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/62284">https://school.programmers.co.kr/learn/courses/30/lessons/62284</a></li>
</ul>
<p>데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다.
우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 
이때 결과는 장바구니의 아이디 순으로 나와야 합니다.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : GROUP BY + HAVING</p>
<pre><code class="language-sql">SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN (&#39;Milk&#39;, &#39;Yogurt&#39;)
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID</code></pre>
</li>
<li><p>두번째 풀이 : EXISTS</p>
<pre><code class="language-sql">SELECT DISTINCT CART_ID
FROM CART_PRODUCTS
WHERE NAME = &#39;Milk&#39;
AND EXISTS (
 SELECT 1
 FROM CART_PRODUCTS cp2
 WHERE cp2.CART_ID = CART_PRODUCTS.CART_ID
   AND cp2.NAME = &#39;Yogurt&#39;
)
ORDER BY CART_ID</code></pre>
</li>
<li><p>세번째 풀이 : INTERSECT</p>
<pre><code class="language-sql">SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = &#39;Milk&#39;
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = &#39;Yogurt&#39;
ORDER BY CART_ID</code></pre>
</li>
</ol>
<blockquote>
<p>처음에 바로 WHERE 절 사용으로 틀려서 당황했다 - 다시 풀이보기</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 서울에 위치한 식당 목록 출력하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%84%9C%EC%9A%B8%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%EB%8B%B9-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%84%9C%EC%9A%B8%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%EB%8B%B9-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 11 Jun 2025 00:59:47 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131118">https://school.programmers.co.kr/learn/courses/30/lessons/131118</a></li>
</ul>
<p>REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 
이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 
결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li>첫번째 풀이 : 오답</li>
</ol>
<ul>
<li>왜 틀린건지 몰랐는데,, 서울 != 서울특별시,,<pre><code class="language-sql">SELECT 
  I.REST_ID,
  I.REST_NAME,
  I.FOOD_TYPE,
  I.FAVORITES,
  I.ADDRESS,
  ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I
JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE &#39;서울특별시%&#39;
GROUP BY I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS
ORDER BY SCORE DESC, I.FAVORITES DESC</code></pre>
</li>
</ul>
<ol start="2">
<li>두번째 풀이 : 정답</li>
</ol>
<pre><code class="language-sql">SELECT 
    I.REST_ID,
    I.REST_NAME,
    I.FOOD_TYPE,
    I.FAVORITES,
    I.ADDRESS,
    ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I
JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE &#39;서울%&#39;
GROUP BY I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS
ORDER BY SCORE DESC, I.FAVORITES DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 년, 월, 성별 별 상품 구매 회원 수 구하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 11 Jun 2025 00:47:35 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131532">https://school.programmers.co.kr/learn/courses/30/lessons/131532</a></li>
</ul>
<p>USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 
결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : 쿼리문 미완성 😢
구현하지 못한 부분 : 년, 월, 성별이 일치하면 count함수로 개수 세기
GROUP BY 에 대한 이해도 부족</p>
<pre><code class="language-sql">SELECT
 YEAR(S.SALES_DATE) AS YEAR,
 MONTH(S.SALES_DATE) AS MONTH,
 U.GENDER
FROM ONLINE_SALE S
JOIN USER_INFO U ON U.USER_ID = S.USER_ID
WHERE U.GENDER IS NOT NULL</code></pre>
</li>
<li><p>두번째 풀이 </p>
</li>
</ol>
<pre><code class="language-sql">SELECT 
    YEAR(S.SALES_DATE) AS YEAR,
    MONTH(S.SALES_DATE) AS MONTH,
    U.GENDER,
    COUNT(DISTINCT S.USER_ID) AS USERS
FROM ONLINE_SALE S
JOIN USER_INFO U ON U.USER_ID = S.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR(S.SALES_DATE), MONTH(S.SALES_DATE), U.GENDER
ORDER BY YEAR, MONTH, GENDER</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 저자 별 카테고리 별 매출액 집계하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A0%80%EC%9E%90-%EB%B3%84-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%A7%A4%EC%B6%9C%EC%95%A1-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A0%80%EC%9E%90-%EB%B3%84-%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%B3%84-%EB%A7%A4%EC%B6%9C%EC%95%A1-%EC%A7%91%EA%B3%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Jun 2025 02:38:35 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/144856">https://school.programmers.co.kr/learn/courses/30/lessons/144856</a></li>
</ul>
<p>2022년 1월의 도서 판매 데이터를 기준으로 
저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 
저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li>첫번째 풀이 : 오답 </li>
</ol>
<pre><code class="language-sql">SELECT 
    A.AUTHOR_ID,
    A.AUTHOR_NAME,
    B.CATEGORY,
    (B.PRICE * S.SALES) AS SALES
FROM BOOK_SALES S
JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE DATE_FORMAT(S.SALES_DATE, &#39;%Y-%m&#39;) = &#39;2022-01&#39;
GROUP BY A.AUTHOR_NAME
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC</code></pre>
<blockquote>
<p>수정한 부분 </p>
</blockquote>
<ol>
<li>매출액 합산을 안함 - SUM() 함수 추가</li>
<li>GROUP BY 절에 SELECT한 필드값 누락</li>
</ol>
<ol start="2">
<li>두번째 풀이 : 정답<pre><code class="language-sql">SELECT 
 A.AUTHOR_ID,
 A.AUTHOR_NAME,
 B.CATEGORY,
 SUM(B.PRICE * S.SALES) AS SALES
FROM BOOK_SALES S
JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE DATE_FORMAT(S.SALES_DATE, &#39;%Y-%m&#39;) = &#39;2022-01&#39;
GROUP BY A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A1%B0%ED%9A%8C%EC%88%98%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EA%B2%8C%EC%8B%9C%ED%8C%90%EC%9D%98-%EC%B2%A8%EB%B6%80%ED%8C%8C%EC%9D%BC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A1%B0%ED%9A%8C%EC%88%98%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EA%B2%8C%EC%8B%9C%ED%8C%90%EC%9D%98-%EC%B2%A8%EB%B6%80%ED%8C%8C%EC%9D%BC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Jun 2025 02:19:47 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 :  <a href="https://school.programmers.co.kr/learn/courses/30/lessons/164671">https://school.programmers.co.kr/learn/courses/30/lessons/164671</a></li>
</ul>
<p>USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 
첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요. 
기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<p>1.첫번째 풀이 : 정답 :)</p>
<pre><code class="language-sql">SELECT 
    CONCAT(&#39;/home/grep/src/&#39;, F.BOARD_ID, &#39;/&#39;, F.FILE_ID, F.FILE_NAME, F.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_FILE F
JOIN USED_GOODS_BOARD B ON F.BOARD_ID = B.BOARD_ID
WHERE B.VIEWS = (
        SELECT MAX(VIEWS)
        FROM USED_GOODS_BOARD)
ORDER BY FILE_ID DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 자동차 평균 대여 기간 구하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%ED%8F%89%EA%B7%A0-%EB%8C%80%EC%97%AC-%EA%B8%B0%EA%B0%84-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%ED%8F%89%EA%B7%A0-%EB%8C%80%EC%97%AC-%EA%B8%B0%EA%B0%84-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Jun 2025 01:59:45 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/157342">https://school.programmers.co.kr/learn/courses/30/lessons/157342</a></li>
</ul>
<p>CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 
평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 
결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li>첫번째 풀이 : GROUP BY + HAVING</li>
</ol>
<pre><code class="language-sql">SELECT 
    CAR_ID,
    ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1) &gt;= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC</code></pre>
<blockquote>
<p>바로 쿼리문 작성 실패 - 원인 파악</p>
</blockquote>
<ol>
<li>복잡하게 생각해서 서브쿼리로 접근 
간단한 GROUP BY + HAVING으로 해결 가능한 문제였는데 과도하게 복잡화</li>
<li>⭐ WHERE는 그룹화 전 개별 행 필터링 , HAVING은 그룹화 후 그룹 조건 필터링</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EC%9E%A5%EA%B8%B0%EB%8B%A8%EA%B8%B0-%EB%8C%80%EC%97%AC-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EC%9E%A5%EA%B8%B0%EB%8B%A8%EA%B8%B0-%EB%8C%80%EC%97%AC-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Jun 2025 01:35:32 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/151138">https://school.programmers.co.kr/learn/courses/30/lessons/151138</a></li>
</ul>
<p>CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 
대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 &#39;장기 대여&#39; 그렇지 않으면 &#39;단기 대여&#39; 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 
결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li>첫번재 풀이 : 오답</li>
</ol>
<pre><code class="language-sql">SELECT 
    HISTORY_ID,
    CAR_ID,
    DATE_FORMAT(START_DATE, &#39;%Y-%m-%d&#39;) AS START_DATE,
    DATE_FORMAT(END_DATE, &#39;%Y-%m-%d&#39;) AS END_DATE,
    CASE
        WHEN DATEDIFF(END_DATE, START_DATE) &gt;= 30 THEN &#39;장기 대여&#39;
        ELSE &#39;단기 대여&#39;
    END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, &#39;%Y-%m&#39;) = &#39;2022-09&#39;
ORDER BY HISTORY_ID DESC</code></pre>
<ol start="2">
<li>수정된 쿼리 : 정답<blockquote>
<p>수정 부분 : DATEDIFF(END_DATE, START_DATE) ** +1 **
<code>DATEDIFF(END_DATE, START_DATE)</code> 함수 : 두 날짜 사이의 일수 차이를 계산
<code>DATEDIFF</code>는 날짜 간격을 계산하지만, 실제 대여 기간은 시작일부터 종료일까지 포함된 총 일수이므로 <code>+1</code> 필요!!!!!</p>
</blockquote>
</li>
</ol>
<p>그냥 수학을 못하는 사람이었다^0^... 날짜 계산 헷갈리지 않도록 조심하자</p>
<pre><code class="language-sql">SELECT 
    HISTORY_ID,
    CAR_ID,
    DATE_FORMAT(START_DATE, &#39;%Y-%m-%d&#39;) AS START_DATE,
    DATE_FORMAT(END_DATE, &#39;%Y-%m-%d&#39;) AS END_DATE,
    CASE
        WHEN DATEDIFF(END_DATE, START_DATE) +1 &gt;= 30 THEN &#39;장기 대여&#39;
        ELSE &#39;단기 대여&#39;
    END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, &#39;%Y-%m&#39;) = &#39;2022-09&#39;
ORDER BY HISTORY_ID DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 재구매가 일어난 상품과 회원 리스트 구하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%AC%EA%B5%AC%EB%A7%A4%EA%B0%80-%EC%9D%BC%EC%96%B4%EB%82%9C-%EC%83%81%ED%92%88%EA%B3%BC-%ED%9A%8C%EC%9B%90-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%AC%EA%B5%AC%EB%A7%A4%EA%B0%80-%EC%9D%BC%EC%96%B4%EB%82%9C-%EC%83%81%ED%92%88%EA%B3%BC-%ED%9A%8C%EC%9B%90-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Jun 2025 13:55:15 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131536">https://school.programmers.co.kr/learn/courses/30/lessons/131536</a></li>
</ul>
<p>ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 
재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 
결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<blockquote>
<p>어떻게 쿼리를 짜야할지 아무생각이 안났다...</p>
</blockquote>
<pre><code class="language-sql">SELECT DISTINCT o1.USER_ID, o1.PRODUCT_ID
FROM ONLINE_SALE o1
WHERE EXISTS (
        SELECT *
        FROM ONLINE_SALE o2
        WHERE o1.USER_ID = o2.USER_ID AND o1.PRODUCT_ID = o2.PRODUCT_ID
        GROUP BY USER_ID, PRODUCT_ID
        HAVING COUNT(*) &gt; 1
)
ORDER BY  o1.USER_ID ASC, o1.PRODUCT_ID DESC</code></pre>
<p>다시 풀어보기 !!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EB%8C%80%EC%97%AC%EC%A4%91-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5-%EC%97%AC%EB%B6%80-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D%EC%97%90%EC%84%9C-%EB%8C%80%EC%97%AC%EC%A4%91-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5-%EC%97%AC%EB%B6%80-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Jun 2025 13:29:00 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/157340">https://school.programmers.co.kr/learn/courses/30/lessons/157340</a></li>
</ul>
<p>CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 
2022년 10월 16일에 대여 중인 자동차인 경우 &#39;대여중&#39; 이라고 표시하고, 
대여 중이지 않은 자동차인 경우 &#39;대여 가능&#39;을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 
자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 
이때 반납 날짜가 2022년 10월 16일인 경우에도 &#39;대여중&#39;으로 표시해주시고 
결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : 오답</p>
<pre><code class="language-sql">SELECT
 CAR_ID,
 CASE
     WHEN &#39;2022-10-16&#39; BETWEEN START_DATE AND END_DATE THEN &#39;대여중&#39;
     ELSE &#39;대여 가능&#39;
 END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC</code></pre>
</li>
<li><p>두번째 풀이 : 정답</p>
<blockquote>
<p>첫번째 풀이의 문제점 
1️⃣ GROUP BY CAR_ID만 사용하면 어떤 기록을 기준으로 판단해야 할지 불분명
  -&gt; CAR_ID가 동일한데 데이터가 여러 개이기 때문!
2️⃣ 특정 날짜에 대여중인 자동차들의 목록을 먼저 구하고 각 자동차가 그 목록에 포함되는지 확인</p>
</blockquote>
</li>
</ol>
<pre><code class="language-sql">SELECT CAR_ID,
    (CASE 
        WHEN CAR_ID IN (SELECT CAR_ID 
                        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                        WHERE &#39;2022-10-16&#39; BETWEEN START_DATE AND END_DATE)
        THEN &#39;대여중&#39;
        ELSE &#39;대여 가능&#39;
        END) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 없어진 기록 찾기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%97%86%EC%96%B4%EC%A7%84-%EA%B8%B0%EB%A1%9D-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%97%86%EC%96%B4%EC%A7%84-%EA%B8%B0%EB%A1%9D-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Wed, 04 Jun 2025 01:13:49 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/59042">https://school.programmers.co.kr/learn/courses/30/lessons/59042</a></li>
</ul>
<p>천재지변으로 인해 일부 데이터가 유실되었습니다. 
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : NOT EXISTS 서브쿼리 사용</p>
<blockquote>
<p>직관적으로 존재하지 않으면 true를 반환</p>
</blockquote>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS O
WHERE
 NOT EXISTS (SELECT * FROM ANIMAL_INS I WHERE I.ANIMAL_ID = O.ANIMAL_ID)
ORDER BY ANIMAL_ID</code></pre>
</li>
<li><p>두번째 풀이 : LEFT JOIN 사용</p>
<blockquote>
<p>FROM절 테이블 기준으로 JOIN
LEFT JOIN 테이블에 일치하는 값이 없으면 NULL로 채워짐</p>
</blockquote>
</li>
</ol>
<pre><code class="language-sql">SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 잡은 물고기의 평균 길이 구하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-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/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-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>Wed, 04 Jun 2025 00:40:44 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/293259">https://school.programmers.co.kr/learn/courses/30/lessons/293259</a></li>
</ul>
<p>잡은 물고기의 평균 길이를 출력하는 SQL문을 작성해주세요.
평균 길이를 나타내는 컬럼 명은 AVERAGE_LENGTH로 해주세요.
평균 길이는 소수점 3째자리에서 반올림하며, 10cm 이하의 물고기들은 10cm 로 취급하여 평균 길이를 구해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<blockquote>
<p>고민했던 부분 : CASE문의 위치 </p>
</blockquote>
<ol>
<li><p>처음 작성 코드 : 오답</p>
<pre><code class="language-sql">SELECT ROUND(SUM(LENGTH)/COUNT(ID),2) AS AVERAGE_LENGTH
FROM FISH_INFO
WHERE CASE 
     WHEN LENGTH IS NULL THEN 10
     WHEN LENGTH &lt;= 10 THEN 10
     END</code></pre>
</li>
<li><p>수정한 코드 : 정답</p>
<pre><code class="language-sql">SELECT ROUND(AVG(CASE 
                 WHEN LENGTH IS NULL THEN 10
                 WHEN LENGTH &lt;= 10 THEN 10  
                 ELSE LENGTH END), 2) AS AVERAGE_LENGTH
FROM FISH_INFO;</code></pre>
</li>
</ol>
<h3 id="차이점과-문제점">차이점과 문제점</h3>
<ol>
<li><p><strong>CASE문 위치 실수</strong></p>
<ul>
<li>❌ WHERE절에 CASE문 → 행을 필터링하는 조건으로 사용됨</li>
<li>✅ SELECT절 AVG() 안에 CASE문 → 각 행의 값을 조건부로 변환</li>
</ul>
</li>
<li><p><strong>WHERE절에서 CASE문의 문제</strong></p>
<ul>
<li>WHERE절은 참/거짓 조건이 와야 하는데, CASE문이 10이라는 숫자값을 반환</li>
<li>결과적으로 WHERE 10 (항상 참)이 되어 모든 행이 선택되지만 원하는 로직이 아님</li>
</ul>
</li>
<li><p><strong>계산 방식의 차이</strong></p>
<ul>
<li>❌ 원본 LENGTH 값들의 합계를 행 수로 나눔 (조건부 변환 없음)</li>
<li>✅ 각 LENGTH를 조건에 따라 변환한 후 평균 계산</li>
</ul>
</li>
<li><p><strong>ELSE절 누락</strong></p>
<ul>
<li>CASE문에서 ELSE가 없으면 조건에 해당하지 않는 경우 NULL 반환</li>
</ul>
</li>
</ol>
<blockquote>
<p>CASE문은 <strong>값을 변환</strong>할 때는 SELECT절에, <strong>조건을 판단</strong>할 때는 WHERE절에 사용하자!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 대장균의 크기에 따라 분류하기 1]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%8C%80%EC%9E%A5%EA%B7%A0%EC%9D%98-%ED%81%AC%EA%B8%B0%EC%97%90-%EB%94%B0%EB%9D%BC-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%8C%80%EC%9E%A5%EA%B7%A0%EC%9D%98-%ED%81%AC%EA%B8%B0%EC%97%90-%EB%94%B0%EB%9D%BC-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0-1</guid>
            <pubDate>Wed, 04 Jun 2025 00:14:19 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/299307">https://school.programmers.co.kr/learn/courses/30/lessons/299307</a></li>
</ul>
<p>대장균 개체의 크기가 100 이하라면 &#39;LOW&#39;, 100 초과 1000 이하라면 &#39;MEDIUM&#39;, 1000 초과라면 &#39;HIGH&#39; 라고 분류합니다. 
대장균 개체의 ID(ID) 와 분류(SIZE)를 출력하는 SQL 문을 작성해주세요.
이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : 오답</p>
<blockquote>
<p>문제점 : SQL에서는 100 &lt; SIZE_OF_COLONY &lt;= 1000 같은 범위 표현 불가 !!!!</p>
</blockquote>
<pre><code class="language-sql">SELECT
 ID,
 CASE
     WHEN SIZE_OF_COLONY &lt;= 100 THEN &#39;LOW&#39;
     WHEN 100 &lt; SIZE_OF_COLONY &lt;= 1000 THEN &#39;MEDIUM&#39;
     ELSE &#39;HIGH&#39;
 END AS SIZE
FROM ECOLI_DATA
ORDER BY ID ASC</code></pre>
</li>
<li><p>두번째 풀이 : 정답</p>
<blockquote>
<p>범위 조건 수정하니 정답 :)</p>
</blockquote>
<pre><code class="language-sql">SELECT
 ID,
 CASE
     WHEN SIZE_OF_COLONY &lt;= 100 THEN &#39;LOW&#39;
     WHEN SIZE_OF_COLONY &lt;= 1000 THEN &#39;MEDIUM&#39;
     ELSE &#39;HIGH&#39;
 END AS SIZE
FROM ECOLI_DATA
ORDER BY ID ASC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 조건에 맞는 사용자 정보 조회하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 30 May 2025 01:28:43 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/164670">https://school.programmers.co.kr/learn/courses/30/lessons/164670</a></li>
</ul>
<p>USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 
이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 
전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 
결과는 회원 ID를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 </p>
<pre><code class="language-sql">SELECT
 DISTINCT(u.USER_ID),
 u.NICKNAME,
 CONCAT(u.CITY, &#39; &#39;, u.STREET_ADDRESS1, &#39; &#39; ,u.STREET_ADDRESS2) AS 전체주소,
 CONCAT (
     SUBSTRING(u.TLNO,1,3), &#39;-&#39;,
     SUBSTRING(u.TLNO,4,4), &#39;-&#39;,
     SUBSTRING(u.TLNO,8,4)
 ) AS 전화번호
FROM USED_GOODS_BOARD b
JOIN USED_GOODS_USER u ON b.WRITER_ID = u.USER_ID 
GROUP BY b.WRITER_ID
HAVING COUNT(b.WRITER_ID) &gt;= 3
ORDER BY u.USER_ID DESC</code></pre>
</li>
<li><p>두번째 풀이 </p>
<pre><code class="language-sql">SELECT
 DISTINCT(u.USER_ID) AS USER_ID,
 u.NICKNAME,
 CONCAT(u.CITY, &#39; &#39;, u.STREET_ADDRESS1,&#39; &#39;, u.STREET_ADDRESS2) AS 전체주소,
 CONCAT (
     SUBSTRING(u.TLNO,1,3), &#39;-&#39;,
     SUBSTRING(u.TLNO,4,4), &#39;-&#39;,
     SUBSTRING(u.TLNO,8,4)
 ) AS 전화번호
FROM USED_GOODS_BOARD b
JOIN USED_GOODS_USER u ON b.WRITER_ID = u.USER_ID
WHERE b.WRITER_ID IN (
 SELECT WRITER_ID
 FROM USED_GOODS_BOARD
 GROUP BY WRITER_ID
 HAVING COUNT(BOARD_ID) &gt;= 3
)
ORDER BY u.USER_ID DESC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] Python 개발자 찾기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-Python-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-Python-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Fri, 30 May 2025 00:31:45 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/276013">https://school.programmers.co.kr/learn/courses/30/lessons/276013</a></li>
</ul>
<p>DEVELOPER_INFOS 테이블에서 Python 스킬을 가진 개발자의 정보를 조회하려 합니다. 
Python 스킬을 가진 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이</p>
<pre><code class="language-sql">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 ASC</code></pre>
</li>
<li><p>두번째 풀이 : WHERE절에서 가독성 향상 :)</p>
<pre><code class="language-sql">SELECT 
 ID,
 EMAIL,
 FIRST_NAME,
 LAST_NAME
FROM DEVELOPER_INFOS
WHERE &#39;Python&#39; IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID ASC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%8B%9D%EB%8B%B9-%EC%A0%95%EB%B3%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%8B%9D%EB%8B%B9-%EC%A0%95%EB%B3%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 May 2025 01:43:08 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131123">https://school.programmers.co.kr/learn/courses/30/lessons/131123</a></li>
</ul>
<p>REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>서브 쿼리 작성 전</p>
<blockquote>
<p>서브쿼리로 조회할 정보 : 음식 종류별로 즐겨찾기수가 가장 많은 식당 </p>
</blockquote>
<pre><code class="language-sql">SELECT
 FOOD_TYPE,
 REST_ID,
 REST_NAME,
 FAVORITES
FROM REST_INFO 
WHERE (SELECT) -- 미완성
ORDER BY FOOD_TYPE DESC</code></pre>
</li>
<li><p>완성된 쿼리문 : 서브쿼리 사용</p>
<pre><code class="language-sql">SELECT
 FOOD_TYPE,
 REST_ID,
 REST_NAME,
 FAVORITES
FROM REST_INFO r1
WHERE FAVORITES = (
 SELECT MAX(FAVORITES)
 FROM REST_INFO r2
 WHERE r2.FOOD_TYPE = r1.FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC</code></pre>
</li>
<li><p>서브쿼리에 윈도우 함수 사용 </p>
<blockquote>
<p><strong>윈도우 함수 (Window Function)</strong>
윈도우 함수는 행과 행 간의 관계를 쉽게 정의하기 위해 만들어진 함수
GROUP BY 없이도 그룹핑 연산을 수행할 수 있는 기능 </p>
</blockquote>
</li>
</ol>
<pre><code class="language-sql">SELECT 
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM (
    SELECT 
        FOOD_TYPE,
        REST_ID,
        REST_NAME,
        FAVORITES,
        ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) as rn
    FROM REST_INFO
) ranked
WHERE rn = 1
ORDER BY FOOD_TYPE DESC;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 5월 식품들의 총매출 조회하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-5%EC%9B%94-%EC%8B%9D%ED%92%88%EB%93%A4%EC%9D%98-%EC%B4%9D%EB%A7%A4%EC%B6%9C-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-5%EC%9B%94-%EC%8B%9D%ED%92%88%EB%93%A4%EC%9D%98-%EC%B4%9D%EB%A7%A4%EC%B6%9C-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 May 2025 00:49:55 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131117">https://school.programmers.co.kr/learn/courses/30/lessons/131117</a></li>
</ul>
<p>FOOD_PRODUCT와 FOOD_ORDER 테이블에서 
생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 
이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li>첫번째 풀이 : 정답</li>
</ol>
<pre><code class="language-sql">SELECT 
    p.PRODUCT_ID,
    p.PRODUCT_NAME,
    SUM(o.AMOUNT * p.PRICE) AS TOTAL_SALES
FROM FOOD_PRODUCT p
JOIN FOOD_ORDER o ON o.PRODUCT_ID = p.PRODUCT_ID
WHERE DATE_FORMAT(o.PRODUCE_DATE, &#39;%Y-%m&#39;) = &#39;2022-05&#39;
GROUP BY o.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, p.PRODUCT_ID ASC</code></pre>
<ol start="2">
<li>정확한 쿼리문 
: PRODUCT_NAME 컬럼도 필요하다면 GROUP BY에 추가해주기<blockquote>
<p>GROUP BY에는 SELECT절의 모든 non-aggregate 컬럼 추가
항상 표준 SQL로 작성하는 것이 좋음 (다른 DB 호환성, 명확성)</p>
</blockquote>
</li>
</ol>
<pre><code class="language-sql">SELECT 
    p.PRODUCT_ID,
    p.PRODUCT_NAME,
    SUM(o.AMOUNT * p.PRICE) AS TOTAL_SALES
FROM FOOD_PRODUCT p
JOIN FOOD_ORDER o ON o.PRODUCT_ID = p.PRODUCT_ID
WHERE DATE_FORMAT(o.PRODUCE_DATE, &#39;%Y-%m&#39;) = &#39;2022-05&#39;
GROUP BY p.PRODUCT_ID, p.PRODUCT_NAME  -- ❗ 두 컬럼 모두 포함
ORDER BY TOTAL_SALES DESC, p.PRODUCT_ID ASC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 식품분류별 가장 비싼 식품의 정보 조회하기]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%8B%9D%ED%92%88%EB%B6%84%EB%A5%98%EB%B3%84-%EA%B0%80%EC%9E%A5-%EB%B9%84%EC%8B%BC-%EC%8B%9D%ED%92%88%EC%9D%98-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%8B%9D%ED%92%88%EB%B6%84%EB%A5%98%EB%B3%84-%EA%B0%80%EC%9E%A5-%EB%B9%84%EC%8B%BC-%EC%8B%9D%ED%92%88%EC%9D%98-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 May 2025 00:25:57 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/131116">https://school.programmers.co.kr/learn/courses/30/lessons/131116</a></li>
</ul>
<p>FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 
이때 식품분류가 &#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;인 경우만 출력시켜 주시고
결과는 식품 가격을 기준으로 내림차순 정렬해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : 오답</p>
<pre><code class="language-sql">SELECT 
 CATEGORY, 
 PRICE AS MAX_PRICE, 
 PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN (&#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;)
GROUP BY CATEGORY
HAVING MAX(PRICE)
ORDER BY MAX_PRICE DESC</code></pre>
</li>
<li><p>두번재 풀이 : 조건절에 서브쿼리 사용</p>
<blockquote>
<p>WHERE절 : 가격이 제일 비싼 식품 -&gt; 식품분류가 &#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;인 경우</p>
</blockquote>
<pre><code class="language-sql">SELECT 
 CATEGORY, 
 PRICE AS MAX_PRICE, 
 PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN
 (
     SELECT MAX(PRICE) 
     FROM FOOD_PRODUCT
     GROUP BY CATEGORY
 )   
AND CATEGORY IN (&#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;)
ORDER BY MAX_PRICE DESC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 보호소에서 중성화한 동물]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%B3%B4%ED%98%B8%EC%86%8C%EC%97%90%EC%84%9C-%EC%A4%91%EC%84%B1%ED%99%94%ED%95%9C-%EB%8F%99%EB%AC%BC</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%B3%B4%ED%98%B8%EC%86%8C%EC%97%90%EC%84%9C-%EC%A4%91%EC%84%B1%ED%99%94%ED%95%9C-%EB%8F%99%EB%AC%BC</guid>
            <pubDate>Mon, 26 May 2025 16:41:07 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/59045">https://school.programmers.co.kr/learn/courses/30/lessons/59045</a></li>
</ul>
<p>보호소에 들어올 당시에는 중성화1되지 않았지만, 
보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 
아이디 순으로 조회하는 SQL 문을 작성해주세요.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 풀이 : NOT LIKE</p>
<pre><code class="language-sql">SELECT
 i.ANIMAL_ID,
 i.ANIMAL_TYPE,
 i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.SEX_UPON_INTAKE LIKE &#39;%Intact%&#39;
AND o.SEX_UPON_OUTCOME NOT LIKE &quot;Intact%&quot;
ORDER BY i.ANIMAL_ID ASC</code></pre>
</li>
<li><p>두번째 풀이 : ⚠️ WHERE 괄호 주의 ⚠️</p>
<pre><code class="language-sql">SELECT
 i.ANIMAL_ID,
 i.ANIMAL_TYPE,
 i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.SEX_UPON_INTAKE LIKE &#39;Intact%&#39;
AND (o.SEX_UPON_OUTCOME LIKE &quot;Spayed%&quot; 
     OR o.SEX_UPON_OUTCOME LIKE &quot;Neutered%&quot;) 
ORDER BY i.ANIMAL_ID ASC</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 오랜 기간 보호한 동물(2)]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%98%A4%EB%9E%9C-%EA%B8%B0%EA%B0%84-%EB%B3%B4%ED%98%B8%ED%95%9C-%EB%8F%99%EB%AC%BC2</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%98%A4%EB%9E%9C-%EA%B8%B0%EA%B0%84-%EB%B3%B4%ED%98%B8%ED%95%9C-%EB%8F%99%EB%AC%BC2</guid>
            <pubDate>Mon, 26 May 2025 16:01:46 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/59411">https://school.programmers.co.kr/learn/courses/30/lessons/59411</a></li>
</ul>
<p>입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 
이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<pre><code class="language-sql">SELECT 
    i.ANIMAL_ID,
    i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
ORDER BY DATEDIFF(o.DATETIME, i.DATETIME) DESC
LIMIT 2</code></pre>
<blockquote>
<p>📅 시간, 날짜 연산 함수
DATE_DIFF(end_date, start_date) : 두 개의 날짜 간의 일 수 차이를 계산해 반환하는 함수</p>
</blockquote>
<p>출처: <a href="https://boring9.tistory.com/45">https://boring9.tistory.com/45</a> [보딩코:티스토리]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / SQL] 있었는데요 없었습니다]]></title>
            <link>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%88%EC%97%88%EB%8A%94%EB%8D%B0%EC%9A%94-%EC%97%86%EC%97%88%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@dreamer_2023/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%9E%88%EC%97%88%EB%8A%94%EB%8D%B0%EC%9A%94-%EC%97%86%EC%97%88%EC%8A%B5%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Mon, 26 May 2025 15:47:22 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<ul>
<li>링크 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/59043">https://school.programmers.co.kr/learn/courses/30/lessons/59043</a></li>
</ul>
<p>보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 
이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.</p>
<h1 id="나의-풀이">나의 풀이</h1>
<ol>
<li><p>첫번째 오답 : 날짜 기준 비교연산이 헷갈림</p>
<pre><code class="language-sql">SELECT 
 i.ANIMAL_ID,
 i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.DATETIME &lt; o.DATETIME
ORDER BY i.DATETIME ASC</code></pre>
</li>
<li><p>수정 쿼리문 : 비교 연산자 수정 </p>
<pre><code class="language-sql">SELECT 
 i.ANIMAL_ID,
 i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.DATETIME &gt; o.DATETIME
ORDER BY i.DATETIME ASC</code></pre>
</li>
</ol>
<blockquote>
<p>보호 시작일 보다 입양일이 더 빠른,
보호 시작일 &gt; 입양일 (날짜가 더 이르다)</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>