SQL 연구 위업. 프로그래머 (3) (JOIN – ON, GROUP BY – HAVING)

가입하다

-- 코드를 입력하세요
SELECT A.FLAVOR
FROM FIRST_HALF AS A 
     JOIN ICECREAM_INFO AS B
ON A.FLAVOR = B.FLAVOR
WHERE A.TOTAL_ORDER > 3000 AND 
      B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC

조건에 맞는 중고거래 댓글을 찾아보세요

SELECT 
  B.TITLE, 
  B.BOARD_ID, 
  R.REPLY_ID, 
  R.WRITER_ID, 
  R.CONTENTS, 
  DATE_FORMAT(R.CREATED_DATE, "%Y-%m-%d") AS CREATED_DATE 
FROM 
  USED_GOODS_BOARD AS B 
  JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID 
WHERE 
  B.CREATED_DATE >= "2022-10-01" 
  AND B.CREATED_DATE <= "2022-10-31" 
ORDER BY 
  R.CREATED_DATE, 
  B.TITLE;

제품별 오프라인 매출 계산

지름길: https://school.programmers.co.kr/learn/courses/30/lessons/131533

-- 코드를 입력하세요
SELECT P.product_code,
       Sum(P.price * S.sales_amount) AS SALES
FROM   product P
       JOIN offline_sale S
         ON P.product_id = S.product_id
GROUP  BY P.product_code
ORDER  BY sales DESC,
          P.product_code

기준에 부합하는 도서 및 저자 목록 출력

지름길: https://school.programmers.co.kr/learn/courses/30/lessons/144854

-- 코드를 입력하세요
SELECT book_id,
       author_name,
       Date_format(published_date, "%y-%m-%d") AS PUBLISHED_DATE
FROM   book AS B
       JOIN author AS A
         ON B.author_id = A.author_id
WHERE  B.category = "경제"
ORDER  BY B.published_date;

그룹 애프터 – HAVE

GROUP BY – HAVING을 사용하면 특정 열로 그룹화할 수 있으며 이때 HAVING 절과 일치하는 조건으로 그룹화할 수 있습니다.

여기를 읽으면 이해하게 될 것입니다.

https://wkdtjsgur100.github.io/groupby-having/

교환된 제품 및 회원 목록 가져오기

프로그래머 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131536

-- 코드를 입력하세요
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING count(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;

위의 문제로 샘플 코드를 만들 수 있는데 이것만으로는 헷갈려서 좀 더 풀어보도록 하겠습니다.

같은 이름을 가진 동물의 수 찾기

지름길: https://school.programmers.co.kr/learn/courses/30/lessons/59041

-- 코드를 입력하세요
SELECT NAME,
       Count(*)
FROM   animal_ins
WHERE  NAME IS NOT NULL
GROUP  BY NAME
HAVING Count(*) >= 2
ORDER  BY NAME

가격대별로 제품 수 결정

지름길: https://school.programmers.co.kr/learn/courses/30/lessons/131530

-- 코드를 입력하세요
SELECT Truncate(price, -4) AS PRICE_GROUP,
       Count(*)            AS PRODUCTS
FROM   product
GROUP  BY price_group
ORDER  BY price_group

TRUNCATE는 숫자를 내림하는 데 사용할 수 있습니다.

위의 예에서는 만원의 숫자로 선택된 아이들이 그룹화 되었습니다.

그것은 멋 있었어.

부서별 총 발령인원 표시

지름길: https://school.programmers.co.kr/learn/courses/30/lessons/132202

-- 코드를 입력하세요
SELECT mcdp_cd        AS 진료과코드,
       Count(mcdp_cd) AS 5월예약건수
FROM   appointment
WHERE  Month(apnt_ymd) = 5
       AND Year(apnt_ymd) = 2022
GROUP  BY mcdp_cd
ORDER  BY 5월예약건수,
          진료과코드

ORDER BY로 “5월 예약건수”라고 말했는데 계속 틀렸어요. ORDER BY의 경우 따옴표 없이 5월의 예약 수를 지정해야 합니다.

같은 이름을 가진 동물의 수 찾기

바로가기 : https://school.programmers.co.kr/learn/courses/30/lessons/59041

-- 코드를 입력하세요
SELECT NAME,
       Count(NAME) AS "COUNT"
FROM   animal_ins
WHERE  NAME IS NOT NULL
GROUP  BY NAME
HAVING Count(NAME) > 1
ORDER  BY NAME;

입양 시기 찾기(1)

바로가기 : https://school.programmers.co.kr/learn/courses/30/lessons/59412

-- 코드를 입력하세요
SELECT Hour(datetime)   AS HOUR,
       Count(animal_id) AS COUNT
FROM   animal_outs
WHERE  Hour(datetime) >= 9
       AND Hour(datetime) <= 19
GROUP  BY hour
ORDER  BY hour;

질문 1: where 절과 having 절 모두 조건을 설정할 수 있는데 어느 것이 성능면에서 더 좋습니까?

A: HAVING 그룹은 아이들을 SLELECT하고 그들을 조건화합니다.

WHERE는 SELECT하는 동안 GROUP으로 가져온 자식을 필터링하기 위한 것입니다.

따라서 WHERE로 행 수를 줄인 후 다음 작업을 수행하는 것이 훨씬 빠릅니다.

질문 2: 조건식과 BETWEEN의 성능 차이는 무엇입니까?

원천 : https://velog.io/@ggomjae/Mysql-Query-Between-and-performance-difference-comparison-dummy-data-500.000

결과: 불평등이 빠르게 진행됩니다.

상식적으로 봤을 때 = >= 같은 연산자가 BETWEEN IS 같은 연산자보다 빠르다는 것은 알고 있었지만 그 이유는 몰랐습니다.

나는해야한다 즉시 끝까지 읽으십시오.

추천도서이기도 한데 꼭 읽어봐야겠다.

재료별로 분류된 총 아이스크림 주문

바로가기 : https://school.programmers.co.kr/learn/courses/30/lessons/133026

-- 코드를 입력하세요
SELECT I.ingredient_type,
       Sum(total_order) AS TOTAL_ORDER
FROM   first_half AS F
       JOIN icecream_info AS I
         ON F.flavor = I.flavor
GROUP  BY I.ingredient_type
ORDER  BY total_order