[SQL] 데이터 추출 및 정렬

Jonie Kwon·2022년 4월 12일
0
post-thumbnail
post-custom-banner

SELECT

SELECT [컬럼명]
FROM [테이블명]

SELECT * 
FROM gmv_trend;
SELECT yyyy, gmv 
FROM gmv_trend;

DISTINCT

중복 제거
SELECT DISTINCT *

WHERE

집계 전 데이터를 필터링
WHERE [조건]

  • 조건
    - <>, !=, =, >=, <=, <, >
    - IN (a, ~, b), NOT IN (a, ~, b)
    - BETWEEN a AND b, NOT BETWEEN a AND b
    - LIKE '%~%', NOT LIKE '%~%' 특정 문자열 포함/불포함
    - ILIKE '%~%', NOT ILIKE '%~%' *영어일 경우 알파벳 대소문자 구분하지 않음
    - IS NULL, IS NOT NULL
SELECT * 
FROM gmv_trend
where yyyy=2022;
SELECT * 
FROM gmv_trend
WHERE yyyy<>2017;
  • yyyy가 2017인 것은 제외
SELECT * 
FROM gmv_trend
WHERE category NOT LIKE '%패션';
  • 패션으로 끝나지 않는 것만 선택
SELECT * 
FROM gmv_trend
WHERE category IN ('가전·전자·통신기기', '사무·문구', '패션용품 및 액세서리');
  • '가전·전자·통신기기', '사무·문구', '패션용품 및 액세서리' 카테고리만 선택
SELECT * 
FROM gmv_trend 
WHERE (gmv < 50000 OR gmv >1000000) AND yyyy=2021;
  • gmv가 50000보다 작거나 1000000만보다 큰 2021년도 데이터만 선택

GROUP BY

GROUP BY [컬럼명 or 컬럼 순서]

SELECT category, yyyy, SUM(gmv) AS gmv
FROM gmv_trend
GROUP BY category, yyyy;
  • 카테고리와 연도별 총 매출액(sum)을 gmv로 출력 SUM(gmv) AS gmv
  • AS는 생략 가능하지만 예약어(ex. year)일 경우 에러발생 --> 큰 따옴표로 감싸주어야 함
SELECT category, yyyy "year", SUM(gmv) AS gmv
FROM gmv_trend
GROUP BY category, yyyy;
  • GROUP BY절에 불러오는 컬럼의 위치를 숫자로 표현하여 지정할 수 있음
  • 집계함수를 제외하고는 SELECT절의 컬럼을 모두 GROUP BY절에 명시해야 한다.
  • SELECT절 순서를 바꿀 때 마다 GROUP BY절도 바꾸어야하는 번거로움이 없어서 주로 사용한다.
SELECT category, yyyy "year", SUM(gmv) gmv
FROM gmv_trend
GROUP BY 1, 2; 		--집계함수 컬럼 수까지 입력
  • WHERE절은 FROM절과 GROUP BY절 사이에 작성
SELECT category, yyyy "year", SUM(gmv) gmv
FROM gmv_trend
WHERE category = "컴퓨터 및 주변기기'
GROUP BY 1, 2; 		

HAVING

집계 후 조건을 필터링
HAVING [집계함수 조건절]

집계함수의 종류
- SUM, MIN, MAX, AVG ...

SELECT category, SUM(gmv) gmv
FROM gmv_trend
WHERE yyyy=2021
GROUP BY 1
HAVING SUM(gmv) >= 1000000;

ORDER BY

ORDER BY [컬럼명 or 컬럼순서]

SELECT *
FROM gmv_trend
ORDER BY category, yyyy, mm, platform_type;
  • 정렬 기준 컬럼은 항상 select에 포함되어 있어야 함
SELECT yyyy, mm, SUM(gmv) gmv
FROM gmv_trend
GROUP BY 1,2
ORDER BY gmv, yyyy, mm;
  • ASC 오름차순(default) / DESC 내림차순
SELECT yyyy, mm, SUM(gmv) gmv
FROM gmv_trend
WHERE yyyy>=2018
GROUP BY 1,2
ORDER BY 1 DESC, 2 ASC;

LIMIT

불러올 데이터 수 제한
LIMIT [숫자]

JOIN ON

필요한 정보가 각기 다른 테이블에 분산 저장되어 있을 때, 하나의 테이블로 가져와 데이터를 추출하기 위해 사용
JOIN [테이블2] ON [테이블1.KEY = 테이블2.KEY]

  • JOIN의 종류
유형조인 결과필요 상황
(INNER) JOIN두 개의 테이블에 모두 존재하는 행만 남음두 개의 테이블에 JOIN KEY가 빠짐없이 있을 때
LEFT JOIN왼쪽 테이블을 기준으로 오른쪽 테이블을 연결
오른쪽 테이블에 조인되는 값이 없는 경우 null로 표기)
한 개 이상의 테이블에 JOIN KEY의 값이 비어있거나,
테이블 1에 있는 값이 테이블 2에는 없을 때
RIGHT JOIN오른쪽 테이블을 기준으로 오른쪽 테이블을 연결
왼쪽 테이블에 조인되는 값이 없는 경우 null로 표기)
대부분 LEFT JOIN을 사용
FULL JOIN모든 값이 합쳐짐
  • 카테고리별 주요 상품 매출 확인
  • 2개의 JOIN을 이용하여 3개의 테이블(online_order, item, category)을 연결
SELECT c.cate1, c.cate2, c.cate3, i.item_name, SUM(gmv) AS gmv
FROM online_order oo
JOIN item i ON oo.itemid = i.id
JOIN category c ON i.category_id = c.id
ORDER BY gmv DESC
  • LEFT JOIN
SELECT ui.gender, ui.age_band, SUM(gmv) gmv
FROM online_order oo
LEFT JOIN user_info ui ON oo.userid = ui.userid
GROUP BY 1,2
ORDER BY 1,2;

  • JOIN KEY가 한 개 이상인 경우 AND로 여러 키를 사용 할 수 있다

JOIN 주의사항

  • JOIN KEY 특정 테이블에 의도치 않게 중복 값이 있으면 JOIN 결과 중복 발생
    - 중복 값을 알려주지 않기 때문에 직접 체크해야 함
profile
메모하는 습관
post-custom-banner

0개의 댓글