알고리즘/My SQL

[My SQL] GROUP BY ,JOIN - 여러 테이블 조립하기

Judith Hopps 2023. 2. 10. 15:08
반응형

GROUP BY - 조건에 따라 집계된 값을 가져옵니다.

여러 컬럼을 기준으로 그룹화할 수도 있습니다.

-- 코드를 입력하세요
SELECT MCDP_CD AS 진료과코드,COUNT(APNT_YMD)	AS 5월예약건수
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY 5월예약건수,진료과코드
-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)

WITH ROLLUP - 전체의 집계값

  • 위의 각 집계함수 쿼리 끝에 WITH ROLLUP 을 추가하면 총 합이 뜬다.
  • ORDER BY 와는 함께 사용될 수 없습니다.

 

HAVING - 그룹화된 데이터 걸러내기

 WHERE는 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용합니다.

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

 

중복으로 상품을 구매한 회원

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

JOIN(INNER JOIN) - 내부 조인 + ON (키)

  • 양쪽 모두에 값이 있는 행(NOT NULL) 반환
  • 'INNER '는 선택사항

 여러 테이블을 JOIN할 수 있습니다.

-- 코드를 입력하세요
SELECT H.FLAVOR
FROM FIRST_HALF H
JOIN  ICECREAM_INFO I ON I.FLAVOR = H.FLAVOR
WHERE H.TOTAL_ORDER >3000 AND INGREDIENT_TYPE LIKE 'f%' 
ORDER BY TOTAL_ORDER DESC
SELECT I.ANIMAL_ID,	I.NAME
FROM ANIMAL_INS I

JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID

ORDER BY I.DATETIME - O.DATETIME
LIMIT 2

 

 

내부 조인

음식 종류별로 가장 즐겨찾기가 많은 것을 골라낼 것

-- 코드를 입력하세요
SELECT R.FOOD_TYPE,	R.REST_ID,	R.REST_NAME	,R.FAVORITES
FROM REST_INFO R, (SELECT FOOD_TYPE ,MAX(FAVORITES) AS FAV FROM REST_INFO
                GROUP BY FOOD_TYPE) B
WHERE R.FOOD_TYPE = B.FOOD_TYPE AND R.FAVORITES = B.FAV
ORDER BY FOOD_TYPE DESC

HOST_ID가 2개 이상 인것

-- 코드를 입력하세요
SELECT H.ID,H.NAME,H.HOST_ID
FROM PLACES H
WHERE HOST_ID  IN (SELECT HOST_ID FROM PLACES WHERE H.HOST_ID=HOST_ID GROUP BY HOST_ID HAVING COUNT(HOST_ID)>=2)
ORDER BY ID

LEFT/RIGHT OUTER JOIN - 외부 조인

  • 반대쪽에 데이터가 있든 없든(NULL), 선택된 방향에 있으면 출력 - 행 수 결정
  • 'OUTER '는 선택사항
  •  

 차집합 구하기

-- 코드를 입력하세요
SELECT I.NAME,	I.DATETIME
FROM ANIMAL_INS I

LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE   O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3

LEFT 조인을 한 후에 JOIN한 테이블의 아이디가 NULL인 경우만 선택한다.

또는 아래처럼 NOT IN을 사용할 수 있다.

SELECT CategoryID AS ID
FROM Categories
WHERE 
  CategoryID > 4
  AND CategoryID NOT IN (
    SELECT EmployeeID
    FROM Employees
    WHERE EmployeeID % 2 = 0
  );

 

CROSS JOIN - 교차 조인

  • 조건 없이 모든 조합 반환(A * B)

 

합집합 - UNION

UNION 중복을 제거한 집합
UNION ALL 중복을 제거하지 않은 집합

교집합

SELECT CategoryID AS ID FROM Categories C, Employees E 
WHERE C.CategoryID > 4 AND E.EmployeeID % 2 = 0 
		AND C.CategoryID = E.EmployeeID;

조건을 맞춰서 출력한다.

반응형