041 RANK
042 DENSE_RANK
043 데이터 분석 함수로 등급 출력하기 NTILE
1등급(0~25%) | 2등급(25%~50%) | 3등급(50~75%) | 4등급(75~100%) |
---|
045 데이터 분석 함수로 데이터를 가로로 출력하기
046 데이터 분석 함수로 바로 전 행과 다음 행 출력하기 (LAG, LEAD)
048 COLUMN을 ROW로 출력하기 (PIVOT)
SELECT *
FROM (select job, sal from emp)
PIVOT (sum(sal) for job in ('ANALYST', 'CLERK','MANAGER', 'SALESMAN'));
-- 더블쿼테이션으로 변경
SELECT *
FROM (select job, sal from emp)
PIVOT (sum(sal) for job in ('ANALYST' as "ANALYST", 'CLERK' as "CLERK",
'MANAGER' as "MANAGER", 'SALESMAN' as "SALESMAN"));
049 테이블의 열을 행으로 출력하는 방법
1. 테이블 생성
create table order2
( ename varchar2(10),
bicycle number(10),
camera number(10),
notebook number(10) );
insert into order2 values('SMITH', 2,3,1);
insert into order2 values('ALLEN',1,2,3 );
insert into order2 values('KING',3,2,2 );
commit;
-------------------------------------------------
2. 조회
SELECT *
FROM ORDER2
UNPIVOT (건수 FOR 아이템 IN (BICYCLE, CAMERA, NOTEBOOK));
INCLUDE NULLS
050 데이터 분석 함수로 누적 데이터 출력하기 sum over
윈도우 기준 | 윈도우 방식 | 설명 |
---|---|---|
ROWS | UNBOUNDED PRECEDING | 맨 첫번째 행을 가리킵니다. |
ROWS | UNBOUNDED FOLLOWING | 맨 마지막 행을 가리킵니다. |
ROWS | CURRENT ROW | 현재 행을 가리킵니다. |
051 데이터 분석 함수로 비율 출력 RATIO_TO_REPORT
-- 값이 동일하다고 알 수 있음.
SELECT EMPNO, ENAME, SAL, RATIO_TO_REPORT(SAL) OVER() AS 비율,
SAL/SUM(SAL) OVER () AS "비교 비율"
FROM EMP
WHERE DEPTNO = 20;
052 데이터 분석 함수로 집계 결과 출력 ROLLUP
부서번호별
토탈 월급이 출력된다. 부서번호별 직업별
토탈 월급이 출력된다. 053 데이터를 집계한 결과를 추가적으로 전체 집계를 위쪽에 출력
- | - | - |
---|---|---|
1 | deptno, job | 부서 번호별 직업별 토탈 월급 |
2 | deptno | 부서 번호별 토탈 월급 |
3 | job | 직업별 토탈 월급 |
4 | () | 전체 토탈 월급 |
054 데이터 분석 함수로 집계 결과 출력 GROUPING SETS
057 출력되는 행 제한하기
2) with ties n번째 값과 동일하다면 같이 출력
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC FETCH FIRST 2 ROWS WITH TIES;
-- 057 4) OFFSET과 FETCH 믹스
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC OFFSET 9 ROWS
FETCH FIRST 2 ROWS ONLY;
---OFFSET 9로 출력된 5개의 행 중에서 2개의 행만 출력되고 있음
058 EQUI JOIN 이퀄
-- 별칭 사용
SELECT E.ENAME, D.LOC, E.JOB
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.JOB = 'ANALYST';
059 NON EQUI JOIN
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, salgrade S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
-- 두 테이블 사이에 동일한 컬럼은 없지만, 비슷한 컬럼 연결
060
-- 060 OUTER JOIN
SELECT E.ENAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO (+) = D.DEPTNO;
061 SELF JOIN
062 여러 테이블의 데이터를 조인해서 출력하기 ON절
오라클 조인 : EQUI JOIN / NON EQUI JOIN / OUTER JOIN / SELF JOIN
ANSI/ISO SQL:1999 standards : ON절을 사용한 JOIN / LEFT/RIGHT/FULL OUTER JOIN / USING 절을 사용한 JOIN / NATURAL JOIN / CROSS JOIN
- | 오라클 EQUI JOIN | ON절을 사용한 조인 |
---|---|---|
테이블 1개 | SELECT E.ENAME, D.LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; | SELECT E.ENAME, D.LOC FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO); |
테이블 여러개 | SELECT E.E.NAME, D.LOC FROM EMP E, DEPT D, SALGRADE S WEHRE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL; | SELECT E.ENAME, D.LOC, S.GRADEFROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL); |
연결고리가 되는 조인 조건을 테이블의 개수에서 하나를 차감해서 기술
063 USING절
- | 오라클 EQUI JOIN | ON절을 사용한 조인 |
---|---|---|
TABLE 1개 | SELECT E.ENAME, D.LOC FROM EMP E, DEPT DWHERE E.DEPTNO = D.DEPTNO; | SELECT E.ENAME, D.LOC FROM EMP E JOIN DEPT D USING (DEPTNO); |
TABLE 여러개 | SELECT E.ENAME, D.LOC FROM EMP E, DEPT D, SALGRADE S WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL; | SELECT E.ENAME, D.LOC, S.GRADE FROM EMP E JOIN DEPT D USING (DEPTNO) JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL); |
064 NATURAL JOIN
조인조건을 주지 않고 EQUI 조인을 하는 방법
SELECT E.ENAME AS 이름, E.JOB AS 직업, E.SAL AS 월급, D.LOC AS 부서위치
FROM EMP E NATURAL JOIN DEPT D
WHERE E.JOB = 'SALESMAN';
```
조인 조건을 명시적으로 작성하지 않아도, FROM 절에 EMP와 DEPT 사이에 NATURAL JOIN 하겠다고 기술하면, 조인이 되는 쿼리
두 테이블에 둘 다 존재하는 동일한 컬럼을 기반으로 암시적인 조인을 수행
동일한 컬럼인 DEPTNO를 오라클이 알아서 찾아 이를 이용하여 조인을 수행한다.
DEPTNO는 별칭없이 수행해야 한다.
-> E.DEPTNO=30이 아니라, DEPTNO=30 으로 수정이 필요하다.
065 LEFT/RIGHT OUTER JOIN
066 FULL OUTER JOIN
SELECT E.ENAME AS 이름, E.JOB AS 직업, E.SAL AS 월급, D.LOC AS 부서위치
FROM EMP E FULL OUTER JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO);
067 집합 연산자로 데이터를 위아래로 연결하기 (UNION ALL)
- UNION ALL
위쪽 쿼리 컬럼의 개수
가 동일해야 한다.- UNION ALL 위쪽 쿼리와 아래쪽 쿼리
컬럼의 데이터 타입이 동일
해야 한다.- 결과로 출력되는 컬럼명은
위쪽 쿼리의 컬럼명
으로 출력된다.ORDER BY
절은제일 아래쪽 쿼리에만
작성할 수 있다.
---------------------------
CREATE TABLE A (COL1 NUMBER(10) );
INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);
INSERT INTO A VALUES(4);
INSERT INTO A VALUES(5);
commit;
CREATE TABLE B (COL1 NUMBER(10));
INSERT INTO A VALUES(3);
INSERT INTO A VALUES(4);
INSERT INTO A VALUES(5);
INSERT INTO A VALUES(6);
INSERT INTO A VALUES(7);
commit;
SELECT COL1 FROM A
UNION ALL
SELECT COL1 FROM B;
068 집합 연산자로 데이터를 위아래로 연결 UNION
- 중복된 데이터를 하나의 고유한 값으로 출력
- 첫 번째 컬럼의 데이터를 기준으로 내림차순으로 정렬하여 출력
CREATE TABLE C (COL1 NUMBER(10) );
INSERT INTO C VALUES(1);
INSERT INTO C VALUES(2);
INSERT INTO C VALUES(3);
INSERT INTO C VALUES(4);
INSERT INTO C VALUES(5);
COMMIT;
CREATE TABLE D (COL1 NUMBER(10) );
INSERT INTO D VALUES(3);
INSERT INTO D VALUES(4);
INSERT INTO D VALUES(5);
INSERT INTO D VALUES(6);
INSERT INTO D VALUES(7);
COMMIT;
SELECT COL1 FROM C
UNION
SELECT COL1 FROM D;
069 집합 연산자로 데이터의 교집합을 출력 INTERSECT
----------------------------------
CREATE TABLE E (COL1 NUMBER(10) );
INSERT INTO E VALUES(1);
INSERT INTO E VALUES(2);
INSERT INTO E VALUES(3);
INSERT INTO E VALUES(4);
INSERT INTO E VALUES(5);
COMMIT;
CREATE TABLE F (COL1 NUMBER(10) );
INSERT INTO F VALUES(3);
INSERT INTO F VALUES(4);
INSERT INTO F VALUES(5);
INSERT INTO F VALUES(6);
INSERT INTO F VALUES(7);
COMMIT;
SELECT COL1 FROM E
INTERSECT
SELECT COL1 FROM F;
------------------------------------
070 집합 연산자로 데이터의 차이를 출력하기 MINUS
---
CREATE TABLE G (COL1 NUMBER(10) );
INSERT INTO G VALUES(1);
INSERT INTO G VALUES(2);
INSERT INTO G VALUES(3);
INSERT INTO G VALUES(4);
INSERT INTO G VALUES(5);
COMMIT;
CREATE TABLE H (COL1 NUMBER(10) );
INSERT INTO H VALUES(3);
INSERT INTO H VALUES(4);
INSERT INTO H VALUES(5);
INSERT INTO H VALUES(6);
INSERT INTO H VALUES(7);
COMMIT;
SELECT COL1 FROM G
MINUS
SELECT COL1 FROM H;
071 서브쿼리
---071 서브쿼리 (단일행 서브쿼리)
--- JONES보다 더 많은 월급을 받는 사원들의 이름과 월급 출력
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME='JONES');
AND ENAME !='SCOTT'
조건은 메인 쿼리이다. 서브 쿼리는 괄호 안이 서브 쿼리이다. 072 서브쿼리 사용하기 2 - 다중 행 서브쿼리
종류 | 설명 |
---|---|
단일 행 서브쿼리 | 서브쿼리에서 메인 쿼리로 하나의 값이 반환됨 |
다중 행 서브쿼리 | 서브 쿼리에서 메인 쿼리로 여러 개의 값이 반환됨 |
다중 컬럼 서브 쿼리 | 서브 쿼리에서 메인 쿼리로 여러 개의 컬럼 값이 반환됨 |
종류 | 연산자 |
---|---|
단일 행 서브 쿼리 | =, !=, >, <, >=, <= |
다중 행 서브쿼리 | in, not in, >any, <ant, >all, <all |
연산자 | 설명 |
---|---|
in | 리스트의 값과 동일 |
Not in | 리스트의 값과 동일하지 않다 |
>all | 리스트의 가장 큰 값보다 크다 |
>any | 리스트에서 가장 작은 값보다 크다 |
<all | 리스트에서 가장 작은 값보다 작다 |
<any | 리스트에서 가장 큰 값보다 작다. |
073 서브쿼리 사용하기 not in
-- 073 not in
select ename, sal, job
from emp
where empno not in (select mgr
from emp
where mgr is not null);
-- 서브쿼리문이 먼저 실행되었다고 가정
select ename, sal, job
from emp
where empno not in (7839, 7698, 7902, 7566, 7788, 7782);
074 서브쿼리 사용하기 4 - exists 와 not exists
-- 특정 테이블의 데이터가 다른 테이블에도 존재하는지 여부를 확인하는 방법
--074 exists not exists
select *
from dept d
where exists (select *
from emp e
where e.deptno = d.deptno);
075 HAVING 절의 서브쿼리
SELECT문의 6가지 절 | 서브쿼리 사용 여부 | 서브 쿼리 이름 |
---|---|---|
SELECT | 가능 | 스칼라(SCALAR) 서브 쿼리 |
FROM | 가능 | IN LINE VIEW |
WHERE | 가능 | 서브 쿼리 |
🚨GROUP BY | 불가능 | |
HAVING | 가능 | 서브 쿼리 |
ORDER BY | 가능 | 스칼라 서브 쿼리 |
076 FROM절의 서브 쿼리
이름과 월급과 순위를 출력하는 데 순위가 1인 사원만 출력
FROM 절의 서브쿼리를 IN LINE VIEW라고 한다.
서브쿼리의 별칭을 V로 사용했다.
077 SELECT 절의 서브 쿼리
078 insert 데이터 입력하기
null입력 방법 | 값 | insert문 예제 |
---|---|---|
암시적으로 입력 | INSERT INTO EMP(empno, ename, sal) VALUES(2912, 'JANE', 4500); | |
명시적으로 입력 | null | INSERT INTO EMP(empno, ename, sal, job) VALUES (8381, 'JACK', NULL, NULL); |
명시적으로 입력 | '' | INSERT INTO EMP(empno, ename, sal, job) VALUES(8381, 'JACK', '', ''); |
INSERT - 데이터 입력
UPDATE - 데이터 수정
DELETE - 데이터 삭제
MERGE - 데이터, 입력, 수정, 삭제를 한 번에 진행
079 데이터 수정 UPDATE
UPDATE문 | 가능 여부 |
---|---|
UPDATE | 서브 쿼리 가능 |
SET | 서브 쿼리 가능 |
WHERE | 서브 쿼리 가능 |
080 - 데이터 삭제
TRUNCATE TABLE emp; : 모든 데이터를 한 번에 삭제 , 데이터 삭제 후에는 취소가 불가능 하여 DELETE보다 삭제되는 속도가 빠르다.
데이터를 모두 지우고, 테이블 구조만 남겨두는 것
DROP TABLE emp; :
테이블 전체를 한 번에 삭제
하는 명령어, 삭제 후 취소(Rollback)은 불가능 하지만, 플래쉬백(Flashback)으로 테이블을 복구할 수는 있다.
delete table emp; (where절을 사용하지 않으면 전체가 삭제)
- DML문이고, TRUNCATE와 DROP은 DDL문이다. DDL: Data Definition Language약자.
- DDL문은 수행되면서 암시적인 commit이 발생한다.
DELETE | TRUNCATE | DROP | |
---|---|---|---|
데이터 | 삭제 | 삭제 | 삭제 |
저장 공간 | 남김 | 삭제 | 삭제 |
저장 구조 | 남김 | 남김 | 삭제 |
취소 여부 | 가능 | 불가능 | 불가능 |
플래쉬 백 여부 | 가능 | 불가능 | 가능 |
종류 | 설명 |
---|---|
CREATE | 객체를 생성 |
ALTER | 객체를 수정 |
DROP | 객체를 삭제 |
TRUNCATE | 객체를 삭제 |
RENAME | 객체의 이름을 변경 |