반응형

■ 주석

1줄 주석 : -- (블록 잡고 ctrl + /)                                --○ 새로운 개념

여러줄 주석 : /* ~ */                                               --==>> 결과값

  -->> 설명

--○ 현재 접속한 자신의 계정 확인


SELECT USER

FROM DUAL;

--==>> HR


--※ sys로 접속한 상태에서! 시작



--○ 사용자 계정 생성 및 패스워드 설정

create user scott

identified by tiger;

--==>>User SCOTT이(가) 생성되었습니다.


--○ 권한 부여

GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT;

--==>>Grant을(를) 성공했습니다.

--테이블스페이스는 테이블들이 논리적으로 저장되는 공간


--○ 구조적인 변경

ALTER USER SCOTT DEFAULT TABLESPACE USERS;

--==>>User SCOTT이(가) 변경되었습니다.


--○ 구조적인 변경

ALTER USER SCOTT TEMPORARY TABLESPACE TEMP;

--==>>User SCOTT이(가) 변경되었습니다.


--지금부터 SCOTT으로 접속~~!

--CONNECT SCOTT/TIGER



-- 사용자 확인

SELECT USER

FROM DUAL;

--==>> SCOTT


--○ 테이블 생성(DEPT)

CREATE TABLE DEPT

(DEPTNO   NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY

, DNAME   VARCHAR2(14) 

, LOC     VARCHAR2(13) 

);


--하나의 항목속성을 컬럼이라 부름

--==>>Table DEPT이(가) 생성되었습니다.



--○ 확인

SELECT *

FROM DEPT;


--○ 테이블 생성(EMP)

CREATE TABLE EMP

       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY

       ,  ENAME VARCHAR2(10)

       ,  JOB VARCHAR2(9)

       ,  MGR NUMBER(4)

       ,  HIREDATE DATE

       ,  SAL NUMBER(7,2)

       ,  COMM NUMBER(7,2)

       ,  DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT

       );

--==>>Table EMP이(가) 생성되었습니다.


--○ 확인

SELECT *

FROM EMP;


--○ 데이터 입력(DEPT TABLE)

--약식 구문으로 입력하고 있으나 권장하지는 않음

INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');

INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');

INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');

INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

--==>> 4행이 삽입되었습니다.


--○ 데이터 입력(EMP TABLE)


INSERT INTO EMP VALUES

(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);

INSERT INTO EMP VALUES

(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);

INSERT INTO EMP VALUES

(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);

INSERT INTO EMP VALUES

(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);

INSERT INTO EMP VALUES

(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);

INSERT INTO EMP VALUES

(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);

INSERT INTO EMP VALUES

(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);

INSERT INTO EMP VALUES

(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);

INSERT INTO EMP VALUES

(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);

INSERT INTO EMP VALUES

(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);

INSERT INTO EMP VALUES

(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);

INSERT INTO EMP VALUES

(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);

INSERT INTO EMP VALUES

(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);

INSERT INTO EMP VALUES

(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

--==>> 14행이 삽입되었습니다.


--○ 테이블 생성(BONUS)

CREATE TABLE BONUS

( ENAME VARCHAR2(10)

  , JOB VARCHAR2(9)  

  , SAL NUMBER

  , COMM NUMBER

) ;

--==>> Table BONUS이(가) 생성되었습니다.


--○ 테이블 생성(SALGRADE)

DROP TABLE SALGRADE;

CREATE TABLE SALGRADE

      ( GRADE NUMBER,

LOSAL NUMBER,

HISAL NUMBER );

--==>> Table SALGRADE이(가) 생성되었습니다.


--○ 데이터 입력(SALGRADE TABLE)

INSERT INTO SALGRADE VALUES (1,700,1200);

INSERT INTO SALGRADE VALUES (2,1201,1400);

INSERT INTO SALGRADE VALUES (3,1401,2000);

INSERT INTO SALGRADE VALUES (4,2001,3000);

INSERT INTO SALGRADE VALUES (5,3001,9999);

--==>>5행이 삽입되었습니다.


COMMIT;

--COMMIT명령어 = 메모리상에 올라가진 내용을 HDD에 기록하라!

--==>> 커밋 완료



--ROLLBACK;

--ROLLBACK명령어 = COMMIT과 반대


/*

DB운영에서 가장 중요한 것은 메모리이다

메모리를 얼만큼 아끼는 지가 시간과 비용을 얼만큼 아끼는가 이기 때문이다.


*/







--○ 현재 SCOTT 계정이 소유하고 있는 테이블 조회


SELECT *

FROM TAB;

--==>> TAB는 TABLE의 약자

/*

BONUS    TABLE

DEPT     TABLE

EMP       TABLE

SALGRADE TABLE


SCOTT이 총 4개의 테이블을 가지고 있다!

*/


중요!!!


--------------------------------------------------

--■■■ SELECT 문의 처리(PARSING) 순서 ■■■--

--------------------------------------------------

                --필수 암기--

/*

SELECT 컬럼명   -- ⑤   세로방향으로 추려냄

FROM 테이블명   -- ①

WHERE  조건절   -- ②   가로방향으로 추려냄 

GROUP BY   절   -- ③   그룹화

HAVING     절   -- ④   그룹의 조건

ORDER BY   절   -- ⑥   오름차순 / 내림차순


※ 쿼리문 구성할 때 ORDER BY를 사용하지 않는 경우가 있다.

   ORDER BY정렬은 리소스 소모가 굉장히 심해서 

   시스템 부하가 많이 발생하기 때문!

   WHERE 조건절에 만족하는 데이터들만 메모리 상에 올라간다.

   그러므로 WHERE 조건절이 없으면 모든 데이터를 다 스캔하기 때문에 메모리 사용량이 늘어난다.

   

   

   SELECT ENAME

   FROM EMP;

   조건이 하나도 없으므로 TABLE 전체를 스캔하여 메모리 상에 올라간다.

   

   SELECT ENAME, JOB, EMPNO

   FROM EMP

   WHERE ENAME = 'JSW';

   WHERE 조건에 맞는 데이터만 메모리 상에 올라감. 메모리 절약

   

   

*/


--○ BONUS 테이블 조회

SELECT *

FROM BONUS;



--○ 부서정보(DEPT) 테이블 조회

SELECT *

FROM DEPT;


--○ 사원정보(EMP) 테이블 조회

SELECT *

FROM EMP;


--○ 급여 등급(SALGRADE) 테이블 조회

SELECT *

FROM SALGRADE;



--○ 테이블의 구조 확인

DESCRIBE EMP;


/* 실행 결과


이름       널        유형           

-------- -------- ------------ 

EMPNO    NOT NULL 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) 


*/


/*

---------------------------------

--■■■ 주요 자료형 ■■■--

---------------------------------


1. 숫자형  NUMBER

           NUMBER(3)  = -999~999까지 입력 가능

           NUMBER(4,1) = -999.X ~ 999.X 소숫점 첫번째까지 입력가능

                        전체가 4자리이고 소숫점이 1자리

                        

2. 문자형   고정형 크기

            CHAR(10)  = 10바이트 크기인 문자

                        5바이트 만큼의 데이터를 입력해도 10바이트를 차지한다.

            가변형 크기

            VARCHAR2(10)  = 가변형이라고 해서 명시되어 있는 바이트를 넘어갈 수 없다.

                            오버플로우로 짤리는 것이아니라 처음부터 에러가 난다.

                            헤더에 관련 자료의 크기나 정보의 크기가 더 크기때문에 참조할 때 리소스가 더 많이 소모된다.

                            따라서 고정된 길이의 데이터는 CHAR형을 사용한다.

                            

            숫자로 구성된 데이터지만 숫자로 처리하면 안되는 것

            1. 전화번호

            2. 학번

            3. 주민번호

            

            첫시작이 0으로 시작하게 된다면 숫자형이면 앞에 0이 삭제되기 때문!!

            

            

            NCHAR(N)  -   유니코드기반 글자수 (N글자 입력가능)

            NVARCHAR2(N)  - 유니코드기반 글자수 (N글자 입력가능)


3. 날짜형

          DATE  -   




*/


SELECT SYSDATE

FROM DUAL;

--==>>18/01/05


--SESSION  - 연결과 관련되어 있는 정보를 담아두는 공간

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';


SELECT SYSDATE

FROM DUAL;

--==>>2018-01-05 14:49:06


SELECT 0123

FROM DUAL;

--==>> 123


SELECT '0123'

FROM DUAL;

--==>>0123


--------------------------------------------------------------------------------


--○ EMP 테이블에서 부서번호가 20번인 사원들의 정보 중 

--   사원번호, 사원명, 급여, 직종명, 부서번호 조회



SELECT EMPNO

      ,ENAME

      , SAL

      , JOB

      , DEPTNO

FROM EMP

WHERE DEPTNO=20;


-- ※ 각 컬럼에 별칭을 부여할 수 있다.


SELECT EMPNO AS "사원번호", ENAME "사원명", SAL 급여, JOB "직종 명", DEPTNO

FROM EMP

WHERE DEPTNO=20;



--○ EMP 테이블에서 부서번호가 20번과 30번 직원들의 정보 중

--   사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.


SELECT EMPNO 사원번호, ENAME 사원이름, JOB 직종명, SAL 급여, DEPTNO 부서번호

FROM EMP

WHERE DEPTNO=20 OR DEPTNO=30

ORDER BY SAL ASC;


--위와 아래는 같은 구문


SELECT EMPNO 사원번호, ENAME 사원이름, JOB 직종명, SAL 급여, DEPTNO 부서번호

FROM EMP

WHERE DEPTNO IN(20,30);



--○ || 문자열 결합 연산자


SELECT 'A'||'B'

FROM DUAL;


--○ EMP 테이블에서 직종이 CLERK인 사원들의 정보를 모두 조회한다


SELECT *

FROM EMP

WHERE JOB='CLERK';


-- 오라클에서 입력된 데이터(값) 만큼은 반드시 대소문자 구분을 해야한다.


--○ 테이블 복사

--> 내부적으로 대상 테이블 안에 들어있는 데이터 내용만 복사하는 과정


CREATE TABLE TBL_EMP

AS  -- 저거저거~~ 저거로 만들어달라

SELECT *

FROM EMP;


SELECT *

FROM TBL_EMP;



--○ 이미 만들어진 테이블에 컬럼 추가

-- TBL_EMP 테이블에 주민번호 정보를 담을 수 있는 컬럼(SSN) 추가


ALTER TABLE TBL_EMP

ADD SSN CHAR(13);

--==>> Table TBL_EMP이(가) 변경되었습니다.


/*

INSERT / UPDATE / DELETE 와 같은 DML구문을 작성한 이후에는

선택적으로 COMMIT이나 ROLLBACK을 해야한다.


다른 구문들은 자동적으로 COMMIT을 실행해준다!


한쪽은 오토 COMMIT을 해주는 사이에 잘못 적힌 데이터를 수정하지 않았을 경우

잘못된 데이터가 메모리에 올라 갈 수 있다 주의 주의 

*/


-- 컬럼이 추가된 테이블 구조 확인

DESC TBL_EMP;


/*

이름       널 유형           

-------- - ------------ 

EMPNO      NUMBER(4)    

ENAME      VARCHAR2(10) 

JOB        VARCHAR2(9)  

MGR        NUMBER(4)    

HIREDATE   DATE         

SAL        NUMBER(7,2)  

COMM       NUMBER(7,2)  

DEPTNO     NUMBER(2)    

SSN        CHAR(13) 

*/



SELECT *

FROM TBL_EMP;

/*

SSN이 NULL로 되어있음

1. 컬럼의 구성되어 있는 순서는 중요하지 않다 아니 의미가 없다.

2. 데이터를 채우려면 UPDATE해야함

   레코드 한개가 하나의 데이터인데 SSN에 데이터를 삽입하려면

   UPDATE를 사용해야함

*/


ALTER TABLE TBL_EMP DROP COLUMN SSN;


SELECT *

FROM TBL_EMP;


SELECT *

FROM EMP;


ALTER TABLE TBL_EMP

ADD SSN CHAR(13);


/*

DELETE 실수를 하지 않는 방법


SELECT *

FROM TBL_EMP

WHERE EMPNO=7369;


처음에 삭제해야 하는 것을 확인!!


DELETE

FROM TBL_EMP

WHERE EMPNO=7369;


COMMIT;


SELECT *을 DELETE로 바꾼후 실행!

*/


-- TBL_EMP 테이블 삭제


DROP TABLE TBL_EMP;

--오라클 휴지통에 들어가 있음


SELECT *

FROM TAB;

--이상한 글자가 있음 DROP 한 것

-- BIN$Aa411Q6JRXexdxVM7/zvrw==$0

------------------------------------------------------------------------------


--○ NULL의 처리


SELECT 2, 1+2, 3-1

FROM DUAL;


--==>>2 3 2




SELECT 2+NULL, 2-NULL, 2*NULL, 2/NULL

FROM DUAL;

--==>>NULL NULL NULL NULL


--※ NULL은 현실에 존재하는 특정한 값을 의미하는 것이 아니라

--   아무것도 들어있지 않은 상태를 의미하는 값이므로 

--   NULL을 대상으로 연산을 수행할 경우 또는 특정 연산 과정에 NULL이 포함될 경우

--   결과는 무조건 NULL이다.



--○  다시 EMP 테이블을 복사하여 TBL_EMP테이블을 생성


CREATE TABLE TBL_EMP

AS

SELECT *

FROM EMP;

--==>>Table TBL_EMP이(가) 생성되었습니다.



--○ TBL_EMP 테이블에서 커미션(COMM) → 수당이 NULL인 사원들의

--   사원명, 직종명, 급여, 커미션을 조회한다.


SELECT ENAME 사원명, JOB 직종명, SAL 급여, COMM 커미션

FROM TBL_EMP

WHERE COMM IS NULL;


--※ NULL은 값으로 존재하는 것이 아니기 때문에 값으로 비교할 수 없다.

--   =, >=, <=, !=, <>, >, < 와 같은 연산자를 사용할 수 없다.  !=와 <> ^= 모두 같지 않다는 의미


--○ TBL_EMP 테이블에서 20번 부서에 근무하지 않는 사원들의 정보를 

--   사원번호, 사원명, 부서번호로 조회한다.


SELECT EMPNO 사원번호, ENAME 사원명, DEPTNO 부서번호 

FROM TBL_EMP

WHERE DEPTNO!=20;


SELECT EMPNO 사원번호, ENAME 사원명, DEPTNO 부서번호

FROM TBL_EMP

WHERE NOT DEPTNO=20;



--TBL_EMP 테이블에서 COMM(커미션)이 NULL이 아닌 것을 조회


SELECT *

FROM TBL_EMP

WHERE COMM IS NOT NULL;



SELECT *

FROM TBL_EMP

WHERE NOT COMM IS NULL;



--○ TBL_EMP 테이블에서 모든 사원들의 

--   사원번호, 사원명, 급여, 커미션, 연봉 정보를 조회한다.

--   단, 급여(SAL)는 매월 지급한다.

--   수당(COMM)은 1회/년 지급한다.


ALTER TABLE TBL_EMP

ADD MONEY NUMBER(10);


ALTER TABLE TBL_EMP DROP COLUMN MONEY;


SELECT EMPNO 사원번호, ENAME 사원명, SAL 급여, COMM 커미션, (SAL*12)+(NVL(COMM,0)) 연봉

FROM TBL_EMP;



반응형

'Database' 카테고리의 다른 글

오라클 다중 WHERE조건  (0) 2018.06.25
무결성 (Integrity)  (0) 2018.01.12
JOIN (조인)  (0) 2018.01.12
오라클 SQL Developer 2018.01.09  (0) 2018.01.09
데이터베이스와 DBMS 개요  (0) 2018.01.09

+ Recent posts