[TIL] Day22 - RANK / GROUP BY / DML / VIEW

JIONY·2022년 8월 25일

TIL - DBMS & SQL

목록 보기
3/5
post-thumbnail

2차 평가가 있는 날이었는데 가볍게 풀고 만점~! 기분이 좋은 것과 별개로 계속해서 맥북 M1에서 오라클 디비를 실행하고 싶어서 마음이 다글다글이었음. 볼륨을 걸고 컨테이너 띄우기가 자꾸 에러가 나는 게 문제였는데, 해당 부분을 적극적으로 도와주시는 개발자 분과 블로그 댓글을 통해 결국 해결책을 찾았음. 짱짱 대단하신 분.. 누군가에게 에러에 대한 해결책을 문의할 수 있다는 것이 심적으로도 넘 도움이 됐음. 유용한 정보를 공유하는 것에 그치치 않고 질문을 남기는 모든 사람에게 피드백을 주고자 하시는 부분이 증맬 짱짱이라고 생각함.. 집요하게 해결방안 강구를 요청드린 덕분에..
???: 개발자 블로그에 닉넴 박제된 썰 푼다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 내 덕분에 이 글에 추가 해결책을 남길 수 있게 되었다고 언급해주셔서 감작 놀래버린.. 감사합니다 흡 빨리 따라해보러 가야지


분석 함수

  • 총합, 평균 등 데이터 분석을 위해 복수행 기준의 데이터를 모아 처리하는 것을 목적으로 하는 다중행 함수
  • 복수행을 그룹별로 묶어 그룹당 단일 계산 결과를 반환(단일행 함수와 집계 함수의 합성 형태)

집계 함수

day21에도 있는 내용이지만 분석 함수에 포함되므로 한 번 더 정리

  • 여러 행 또는 테이블 전체 행으로부터 하나의 결과값을 반환
  • NULL값 처리
    • 특정 컬럼을 지정한 경우 null 포함, 전체에 대한 집계의 경우 null 불포함
  • SELECT 절에 컬럼/단일행 함수와 같이 사용 불가
  • [대표] 합계, 평균, 최대, 최소, 개수
-- SELECT PRODUCT.*, SUM(PRICE) FROM PRODUCT;
SELECT SUM(PRICE) "합계" FROM PRODUCT;
SELECT AVG(PRICE) "평균" FROM PRODUCT;
SELECT MAX(PRICE) "최대" FROM PRODUCT;
SELECT MIN(PRICE) "최소" FROM PRODUCT;
SELECT COUNT(PRICE) "개수" FROM PRODUCT;

그룹 함수

  • 그룹별 소계 및 중계 등 중간 합계 분석 데이터 산출
  • ROLL UP, CUBE, GROUPING SETS
  • GROUP BY절 필수

GROUP BY

SELECT [GROUP BY 절에 지정된 컬럼] [GROUP BY별로 집계할 값] 
FROM 테이블
GROUP BY [그룹으로 묶을 컬럼]

HAVING

  • 그룹에 특정 조건을 추가하는 구문
    • [참고] WHERE는 개별 데이터 필터링 조건
  • 구문 실행 순서 때문에 HAVING절에는 별칭 사용 불가
SELECT [GROUP BY 절에 지정된 컬럼] [GROUP BY별로 집계할 값] 
FROM 테이블
GROUP BY [그룹으로 묶을 컬럼]
HAVING [그룹 성립 조건]

윈도우 함수

  • 데이터베이스를 사용한 온라인 분석처리 용도
  • GROUP BY절 사용 불가 → PARTITION BY로 분류
    • PARTITION BY는 GROUP BY와 같은 집약기능이 없기 때문에 레코드가 줄어들지 않음. 그저 함수 적용 범위를 묶는 역할
  • OVER 필수
    • 함수 적용 기준(분류, 정렬)을 제시
    • 분류: PARTITION BY 컬럼명
    • 정렬: ORDER BY 컬럼명 ASC/DESC

Rank

  • 공동순위가 있을 수 있음
  • OVER 뒤에 순위를 매기는 조건을 작성
  • PARTITION BY를 통해 분류 가능
    • ex. 상품 종류별 가격 순위
-- Q. PRODUCT 상품 정보를 고가 순으로 순위 매기기
SELECT 
    PRODUCT.*, 
    -- RANK()OVER(가격 내림차순) 순위
    RANK()OVER(ORDER BY PRICE DESC) 순위
FROM PRODUCT;

-- Q. 상품 종류별 가격 순위 매기기
SELECT
    PRODUCT.*,
    RANK() OVER(PARTITION BY TYPE ORDER BY PRICE DESC) 순위
FROM PRODUCT;




집합 연산

  • SELECT DISTINCT는 중복을 제거하고 조회

집합 연산이 필요한 이유

  • 조건이 복잡해지는 경우 OR, AND 연산만으로는 부족할 때가 있음
    • [참고] UNION ALL: OR 연산으로도 대체 가능, INTERSECT는 AND 연산으로도 대체 가능
  • 차집합 구현

합집합

  • A∪B (UNION, UNION ALL)
    • UNION: UNION DISTINCT
    • UNION ALL: 중복 데이터 포함
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '피카츄'
UNION
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '라이츄';

교집합

  • A∩B (INTERSECT)
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '피카츄'
INTERSECT
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '라이츄';

차집합

  • A-B (MINUS)
  • 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '피카츄'
MINUS
SELECT DISTINCT SUBJECT FROM EXAM WHERE STUDENT = '라이츄';




DML

  • Data Manipulation Language
  • SELECT(조회) / INSERT INTO(삽입)는 day21 참고
  • COMMIT / ROLLBACK의 영향을 받음(트랜잭션 관리가 이루어짐)

UPDATE

  • 기존에 등록한 데이터를 원하는 값으로 변경하는 구문
  • 전체를 변경하는 경우보다 조건을 포함해 원하는 항목만 변경하는 경우가 더 많음
  • [주의] 오라클에서 정수 계산이나 복합 대입 연산자 사용 불가
-- Q. PRODUCT 테이블의 상품 가격을 1200원으로 변경
UPDATE PRODUCT SET PRICE = 1200;
-- script: 10개 행 이(가) 업데이트되었습니다.

-- Q. PRODUCT 테이블 1번 상품 가격을 1500원으로 변경
UPDATE PRODUCT SET PRICE = 1500 WHERE NO = 1;

-- Q. 과자 가격 500원 할인
UPDATE PRODUCT SET PRICE = (PRICE - 500) WHERE TYPE = '과자';

-- Q. 아이스크림 가격 10% 인상
UPDATE PRODUCT SET PRICE = (PRICE * 1.1) WHERE TYPE = '아이스크림';

SELECT * FROM PRODUCT;
ROLLBACK;

DELETE

  • 기존에 등록한 데이터를 없애는 명령
  • 대부분 PK를 이용한 단일 삭제로 처리
-- DELETE [FROM] 테이블 [조건]
DELETE PRODUCT;
DELETE PRODUCT WHERE NO = 1;
DELETE PRODUCT WHERE NO = 12345;
ROLLBACK;




객체

  • USER, TABLE, SEQUENCE (day21 참고)
  • VIEW
  • INDEX (학습 예정)

VIEW

  • 가상 테이블 / 논리 테이블이라고 부름
  • 테이블을 원하는 형태로 바꿔서 보기 위해 사용
  • 필요한 권한
    • CREATE VIEW
    • UNLIMITED SPACE~ (11g이상 버전 사용 중이라면)
  • 원래 조회 전용 객체
    • 원본 테이블과 동일한 컬럼으로 구성되어 있으면 DML 명령 수행도 가능함 (비권장)
GRANT CREATE VIEW TO C\#\#ACADEMY;
SELECT * FROM EXAM;

-- '서술형' 데이터로만 무언가를 하고 싶다면 WHERE를 계속 추가해야 함
-- SELECT * FROM EXAM WHERE TYPE = '서술형';

CREATE VIEW ESSAY AS 
SELECT * FROM EXAM WHERE TYPE = '서술형';

SELECT * FROM ESSAY;
SELECT * FROM ESSAY WHERE SCORE < 60;
  • 테이블과 다른 점: 바꿔치기로 재생성도 가능
    • CREATE OR REPLACE VIEW
CREATE OR REPLACE VIEW ESSAY AS 
SELECT * FROM EXAM WHERE TYPE = '문제해결시나리오';

-- EX. 연도/월/일별 상품 제조 개수
CREATE OR REPLACE VIEW STATUS AS
SELECT 
    EXTRACT(YEAR FROM MADE),
    EXTRACT(MONTH FROM MADE),
    COUNT(*) 개수
FROM PRODUCT
GROUP BY EXTRACT(YEAR FROM MADE), EXTRACT(MONTH FROM MADE)
ORDER BY,ASC;

SELECT,, 개수 FROM STATUS;

0개의 댓글