본문 바로가기

Oracle

(12)
Oracle - View 객체 다음과 같은 TABLE이 있다. NAME SAL ---------- ---------- A 100 B 200 C 300 D 400 여기서 B의 급여보다 많은 사람을 출력하려면 아래와 같이 서브쿼리를 이용하면 된다. SELECT * FROM TAB01 WHERE SAL > (SELECT SAL FROM TAB01 WHERE NAME='B'); 위 예시에서는 3줄로 끝났지만, 만약 서브쿼리가 50줄 이상이라면? 가독성은 현저히 떨어질 것이다. 이런 경우에 VIEW라는 가상의 테이블을 만들어 불러오도록 하는 역할을 할 수 있다. 다음과 같이 VIEW를 생성한다. -- VIEW 삭제 DROP VIEW VIEW01; -- VIEW 만들기 CREATE VIEW VIEW01 AS (SELECT SAL FROM TAB..
Oracle 테이블의 Column 추가·수정·삭제·이름 변경 ** Column의 수정 작업은, 처음 데이터를 만들거나 데이터가 별로 없을 때 하는 것이 좋다. - 테이블 컬럼 추가 ALTER TABLE 테이블명 ADD(컬럼명 데이터타입(크기)); TAB01 테이블의 NAME 컬럼을 VARCHAR 타입 20byte로 추가 시 --TABLE COLUMN 추가 ALTER TABLE TAB01 ADD(NAME VARCHAR(20)); - 테이블 컬럼 수정 ALTER TABLE 테이블명 MODIFY(컬럼명 데이터타입(크기)); TAB01 테이블의 NAME 컬럼을 VARCHAR 타입 30byte로 변경 시 --TABLE COLUMN 변경 ALTER TABLE TAB01 MODIFY(NAME VARCHAR(30)); - 테이블 컬럼 삭제 ALTER TABLE 테이블명 DROP..
Oracle - 누적 합계를 해주는 SUM OVER 다음과 같은 데이터가 있다.(ENO는 부서 번호, SAL은 월급) ID ENO NAME SAL ---------- ---------- ---------- ---------- 1 10 홍길동1 10 2 10 홍길동1 20 3 20 홍길동2 30 4 20 홍길동2 40 5 20 홍길동2 50 6 30 홍길동3 60 7 30 홍길동3 10 8 40 홍길동4 20 9 50 홍길동5 30 10 50 홍길동5 40 다음 3가지를 출력하려고 한다. 1. ID가 증가할수록 누적되는 월급 합계 2. 부서 별 ID 오름차순으로 누적되는 월급 합계 3. 전체 합계 ORACLE에 있는 SUM OVER 함수를 통해 다음과 같이 할 수 있다. SELECT ID, ENO, NAME,SAL, -- 1. SUM(SAL) OVER (O..
Oracle - 중복된 데이터가 2개 이상일 경우 다음과 같은 데이터가 있다. ID ENO NAME ---------- ---------- -------------------- 1 10 홍길동1 2 10 홍길동1 3 20 홍길동2 4 20 홍길동2 5 20 홍길동2 6 30 홍길동3 7 30 홍길동3 8 40 홍길동4 9 50 홍길동5 10 50 홍길동5 여기는 ENO와 NAME가 공통으로 중복되는 부분이 여러 개 있다. 이럴 경우 DISTINCT로 해도 중복된 부분은 삭제되지 않는다. 중복된 부분을 삭제하고 싶은데, 삭제할 부분을 우선 출력한다고 가정한다면 1. 남길 부분 출력 2. not으로 남기지 않을 부분 출력 이런 식으로 query를 짜야 한다고 느껴진다. 1. 남길 부분 출력 우린 가장 먼저 만들어진 데이터를 남길 생각이다. 즉, 중복되는 데..
Oracle - DML(데이터 조작: 추가·수정·삭제) 기존 테이블 복제 DEPT테이블 복사한 새 테이블 DEPT_TEMP을 만들려면 다음과 같다. CREATE TABLE DEPT_TEMP AS SELECT * FROM DEPT; 테이블에 데이터 추가 시, INSERT문을 이용해 추가할 수 있다. Ex) 50번 부서번호, 부서 이름 DATABASE, 위치 SEOUL 추가 INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC) VALUES (50, 'DATABASE', 'SEOUL'); -- 열 지정 없이 추가. 순서대로 자동 지정해 추가함. INSERT INTO DEPT_TEMP VALUES (60, 'NETWORK', 'BUSAN'); -- NULL 값 지정해 추가. INSERT INTO DEPT_TEMP (DEPTNO, DNAME, ..
Oracle - SubQuery 데이터의 비교를 위해 사용한다. 비교 대상과 같은 자료형이여야 하기 때문에, Main Query의 WHERE COLUMN과 SELECT COLUMN은 같아야 한다. -- '가가'보다 월급이 많은 사람 출력 SELECT * FROM TAB01 WHERE SAL > (SELECT SAL FROM TAB01 WHERE NAME='가가'); -- 평균 월급보다 더 많이 받는 사람 출력 SELECT * FROM TAB01 WHERE SAL > (SELECT AVG(SAL) FROM TAB01); -- 서울에 일하지 않는 직원 출력. '가가'는 직장이 서울이다. SELECT * FROM TAB01 WHERE LOC != (SELECT LOC FROM TAB01 WHERE NAME='가가'); -- '가가'와 동일한..
Oracle - join join은 다음과 같이 분류한다. 1. 내부 join(=등가, equi join) (inner join) 1) 자연 join 2) on join 3) using join - 비등가(not equi=on, using) join 2. 외부 join (outer join) 3. 교차 join (cross join) 4. 셀프 join (self join) etc. semi join, anti join ...... @@@(다 알아야 하나..) 하지만, 대부분 우리가 쓰는 join은 equi join에서 대부분 사용한다. cross join(실제 테이블에서는 이렇게 하면 위험함!) --TSQL JOIN SELECT * FROM TAB01, TAB02; --또는(ANSI JOIN), 권장하는 방식 SELECT * ..
Oracle EMP Table 예시 책이나 페이지를 보면, 항상 EMP 테이블을 기준으로 설명하는 경우가 많다. 어디서 가져왔는지 설명도 안 하고 막막했는데, 구글링해서 찾으니 자료가 많았다. ORACLE DB 공부 할 때 이거 복붙하고 시작하면 된다. CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7, 2), COMM NUMBER(7, 2), DEPTNO NUMBER(2)); INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 7902, TO_DATE('17-12-1980', 'DD-MM-YYYY'), 800, NULL, 20); IN..