알고리즘/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;
조건을 맞춰서 출력한다.
반응형