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
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'
조건은 메인 쿼리이다. 서브 쿼리는 괄호 안이 서브 쿼리이다.