DB/Oracle 48

DB 37강. DDL

SCOTT의 테이블에서 우클릭하여 새 테이블을 생성해준다. VARCHAR2는 20개의 크기를 지정해준 뒤 3개를 넣으면 크기가 줄어든다. 하지만 CHAR는 내가 1글자를 넣든 3글자를 넣든 항상 크기가 고정이다. 이때 크기는 길이가 아닌 Byte의 크기이다. 그렇게 때문에 GENDER의 크기는 한글이 들어갈 수 있는 3바이트로 지정해준다. 만들어준 테이블의 스키마는 아래와 같다. 테이블을 생성할 때 NO 컬럼을 Primary Key로 지정해두었다. Primary Key는 그 값으로 행을 유일하게 결정할 수 있는 값을 말한다. 우리는 툴의 도움을 받아 테이블을 간편하게 만들었지만 실제로는 이 코드가 실행된 것이다. 이 값은 default이기 때문에 지워도 괜찮다. USING INDEX PCTFREE 10 ..

DB/Oracle 2022.02.14

DB 36강. PIVOT ★

PIVOT함수는 오라클만 가지고 있다. 우리가 아는 달력의 모양은 아래 사진과 같다. 달력 테이블에서 데이터를 확인하면 아래와 같이 나온다. SELECT * FROM cal; 데이터는 저장될 때 세로로 저장되기 때문이다. 세로 데이터를 가로 데이터로 예쁘게 바꿔 줄 때 PIVOT을 사용한다. PIVOT의 원리는 DECODE이다. 새로운 컬럼을 만들어 줄 때 이렇게 사용했었다. -- 가짜 컬럼에 날짜(NUM_DAY)만 붙여넣으면 끝 SELECT week, 1 일, 2 월, 3 화, 4 수, 5 목, 6 금, 7 토 FROM cal GROUP BY week ORDER BY week; 우리는 날짜 데이터를 넣고 싶으니까 decode를 사용해준다. -- 일요일이면 num_day 뿌리고 아니면 null 뿌려 SE..

DB/Oracle 2022.02.11

DB 35강. ROLL UP

PARTITION BY는 소계와 통계 값을 내주진 않는다. 이때는 ROLL UP을 사용해준다. 그룹별로 값을 내준다. -- 부서별 통계 SELECT deptno, sum(sal) FROM emp GROUP BY deptno; 이 쿼리의 결과에는 통계는 없고 소계만 나와있다. -- 부서별 통계 SELECT deptno, sum(sal) FROM emp GROUP BY rollup(deptno); GROUP BY rollup(deptno); rollup안에 원하는 컬럼을 넣으면 전체 총계가 나온다. SELECT deptno, ename, sum(sal) FROM emp GROUP BY rollup(deptno, ename); rollup안에 2개의 컬럼이 들어가면 두 컬럼에 대한 rollup이 발생한다. 규..

DB/Oracle 2022.02.10

DB 34강. PARTITION BY

UNION ALL을 이용해 각 부서별 월급 순위를 매긴다. 그룹별로 통계를 내는 통계 쿼리를 만들어보자. -- UNION ALL은 컬럼 개수가 같아야 합칠 수 있음 -- ROLL UP SELECT deptno, sal, rank() OVER (ORDER BY sal DESC) FROM emp WHERE deptno = 10 UNION ALL SELECT null, sum(sal), null FROM emp WHERE deptno = 10 UNION ALL SELECT deptno, sal, rank() OVER (ORDER BY sal DESC) FROM emp WHERE deptno = 20 UNION ALL SELECT null, sum(sal), null FROM emp WHERE deptno = ..

DB/Oracle 2022.02.10

DB 33강. HAVING

그룹핑한 데이터에서 조건을 걸 수 없다. WHRER보다 GROUP BY가 먼저 실행되기 때문이다. 이때 HAVING을 이용한다. WHERE이 실행되는 순서때문에 나온 것이다. 순서가 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY이기 때문! 오라클 쿼리 실행 순서 1. FROM : SQL 테이블 최우선 확인 2. WHERE : 테이블에서 주어진 조건에 맞는 레코드 추출 3. GROUP BY : 공통적인 데이터끼리 그룹 생성 4. HAVING : 주어진 조건에 맞는 그룹 추출 5. SELECT : 최종적으로 추출된 프로젝션 조회 6. ORDER BY : 추출된 데이터 정렬 -- having은 group by되고 난 뒤에 조건절 SELECT job, m..

DB/Oracle 2022.02.10

DB 32강. 순위 구하기 함수 rank( ) over( )

이전에 순위를 구할 때는 rownum과 인라인 뷰를 사용했었다. 쉽게 순위를 구할 수 있는 함수 rank over를 사용해보자. SELECT ename, rank() OVER (ORDER BY sal DESC), sal FROM emp; 위 결과 데이터는 sal이 중복되면 공동 2등이 생기고 다음은 3등이 아닌 4등으로 넘어간다. 이때 3등으로 표시해주려면 dense_rank over를 사용한다. SELECT ename, dense_rank() OVER (ORDER BY sal DESC), sal FROM emp; [출처] https://cafe.naver.com/metacoding 메타코딩 : 네이버 카페 코린이들의 궁금증 cafe.naver.com 메타 코딩 유튜브 https://www.youtube..

DB/Oracle 2022.02.10

DB 31강. CASE WHEN

decode( )는 조건문의 조건식에 부등호 사용이 안되지만 case when을 사용하면 부등호 사용이 가능하다. if-else와 같은 것이다. case when은 모든 sql이 다 가지고 있기 때문에 decode를 모르고 case when만 알고 있어도 괜찮다! -- student 테이블에서 비만인 그룹의 몸무게 평균과 마른 그룹의 몸무게 평균을 구하시오 -- 60kg 이상 (비만), 60kg 미만(마른) SELECT round(avg(weight), 2) 평균, decode(g1, 1, '비만', '마른') 비만도 FROM ( SELECT name, weight, floor(weight/60) g1 FROM student ORDER BY weight ) GROUP BY g1; -- CASE WHEN으..

DB/Oracle 2022.02.10

DB 30강. GROUP BY

GROUP BY는 세로 연산이다. 세로 연산에는 sum, avg, count, max, min등이 있었다. -- 이건 전체 sum SELECT sum(sal) FROM emp; SELECT sum(sal), job FROM emp; 행의 길이가 맞지않다는 것이다. 오류를 읽어도 이해가 안간다면 왼쪽 상단 코드를 복사해서 구글링해보면 된다! -- 전체 sum이 아닌 직업별 sum -- job이 DISTINCT 중복이 제거가 됨 SELECT sum(sal), job FROM emp GROUP BY job; GROUP BY job, ename 직업과 이름으로 그룹을 만들면 하면 제대로 그룹핑이 안된다. 직업과 이름이 같은 사람이 없기 때문이다. 세로연산을 하는 5가지 함수를 그룹 함수라고 하는데 그룹 함수를 ..

DB/Oracle 2022.02.09

DB 29강. SQL 종류

DML(Data Manipulation Language) 데이터 조작 언어 READ, WRITE 기능 - SELECT(READ), INSERT(WRITE), DELETE(WRITE), UPDATE(WRITE) WRITE 하는 키워드가 위험하다. 데이터를 조작하는 것이기 때문에 아무나 접근 못하게 해야 한다. READ(SELECT)는 동시 접근이 가능하다. 동기화되어있지 않기 때문이다. 100명이 동시에 하나의 데이터를 읽을 수 있다. 100명이 동시에 읽는다는 것은 컨텍스트 스위칭이 일어난다는 것이다. WRITE는 동시 접근이 불가능하다. 동시에 데이터를 수정한다는 게 말이 안 된다. 순차적(동기화 되어있음) 동기화를 위한 세마포어가 있다. 데이터를 수정하는 건 위험하기 때문에 하나의 스레드로만 실행한다..

DB/Oracle 2022.02.09

DB 28강. 인라인뷰

-- 번호는 안붙어있지만 순위는 매겨져있음 SELECT ename, sal FROM emp ORDER BY sal desc; 내림차순으로 정렬된 데이터 옆에 순위를 매기고 싶다. 이때 ROWNUM을 사용한다. 하드 디스크에 있는 데이터를 FROM emp로 퍼올리면 데이터를 하나씩 꺼내며 메모리에 올린다. 하나씩 꺼내 올리기 때문에 rownum이 3보다 작은것들은 찾을 수 있다. -- 하나씩 꺼내기때문에 찾을 수 있음 SELECT ename, sal, rownum FROM emp WHERE rownum < 3; 하지만 바로 3을 찾으면 1과 2를 모르기 때문에 찾을 수 없다. 실행해봐도 아무런 결과값이 없을 것이다. -- rownum이 동작(번호 생성)하는 시점은 프로젝션 할 때이다. -- 1, 2를 모르..

DB/Oracle 2022.02.09