001

002
테이블명.을 붙여야 한다. 003

"" 더블 쿼테이션 마크가 붙는 경우 004

005

009
Null : 데이터가 없는 상태, 즉 데이터가 할당되지 않은 상태 또는 알 수 없는 값. 
011

012 - LIKE
% : 0개 이상의 임의 문자와 일치 _ : 하나의 문자와 일치 013
is null 
TRUE AND NULL = NULL
AND 연산자 진리 연산표
| AND | TRUE | FALSE | NULL |
|---|---|---|---|
| TRUE | TRUE | FALSE | NULL |
| FALSE | FALSE | FALSE | FALSE |
| NULL | NULL | FALSE | NULL |
| OR | TRUE | FALSE | NULL |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| FALSE | TRUE | FALSE | NULL |
| NULL | TRUE | NULL | NULL |
| NOT | TRUE | FALSE | NULL |
|---|---|---|---|
| TRUE | FALSE | TRUE | NULL |
016

017 substr
SELECT SUBSTR('SMITH', 1, 3)
FROM DUAL;
-- DUAL : 간단하게 함수를 이용해서 계산 결과값을 확인 할 때 사용하는 테이블
018 INSTR

019 replace
- 월급의 숫자 0부터 3까지 *별표처리
021

022 trim, rtrim, ltrim

insert into emp(empno,ename,sal,job,deptno) values(8291, 'JACK ', 3000, 'SALESMAN', 30);
commit; -- 공백 데이터 넣기


026 MONTHS_BETWEEN

027 ADD_MONTHS


028 돌아오는 특정 요일 날짜 출력

029 특정 날짜가 있는 달의 마지막 날짜 출력 LAST_DAY

030 문자형으로 데이터 변환

| 형식 | 포맷 | 형식 | 포맷 |
|---|---|---|---|
| 연도 | RRRR, YYYY, RR, YY | 주 | WW, IW, W |
| 월 | MM, MON | 시간 | HH, HH24 |
| 일 | DD | 분 | MI |
| 요일 | DAY, DY | 초 | SS |
₩ 원화 단위 사용 가능031 날짜형

ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/RR';
# 지금 접속한 세션에서만 유효. 로그아웃하고 다시 새로 접속하면 파라미터 설정 값은 사라진다.
SELECT ename, hiredate
FROM emp
WHERE hiredate = TO_DATE('81/11/17' 'RR/MM/DD');
# 다시 날짜 포맷 변경
ALTER SESSION SET NLS_DATE_FORMAT='RR/MM/DD';
032 3)
SET AUTOT ON: SQL을 실행할 때 출력되는 결과와 실행계획을 한 번에 보여달라는 SQLPLUS 명령어
실행계획: 오라클이 SQL을 실행할 때 어떠한 방법으로 데이터를 검색하겠다는 계획서
- SET AUTOT ON
- SELECT ENAME, SAL
FROM EMP32
WHERE SAL = 3000;

033 4)
-- 033 NVL2
-- NULL이 아닌 사원들은 sal+comm 을 출력, NULL인 사원들은 sal을 출력
SELECT ENAME, SAL, COMM, NVL2(COMM, SAL+COMM, SAL)
FROM EMP
WHERE JOB IN ('SALESMAN', 'ANALYSIST');

034 if문을 SQL로 표현하기 ① - DECODE

035 ② CASE문

SELECT job, MAX(SAL) --- 4 (실행순서)
FROM emp --- 1
WHERE job='SALESMAN' --- 2
GROUP BY job; --- 3
037 최소값
ORDER BY 절은 항상 맨 마지막에 작성하고 실행 또한 맨 마지막에 실행된다.

038 AVG
039 sum
SELECT job, SUM(SAL) --- 5
FROM emp --- 1
WHERE job != 'SALESMAN' --- 2
GROUP BY job --- 3
HAVING sum(sal) >= 4000 --- 4
ORDER BY sum(sal) DESC; --- 6
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' 조건은 메인 쿼리이다. 서브 쿼리는 괄호 안이 서브 쿼리이다.