본문 바로가기

교육 및 세미나/신입사원 교육

4일차(2018.01.05)

오라클 접속 및 구동

오라클 인스턴스 상태 조회

# 오라클 인스턴스 상태 조회
SQL> select status from v$instance;

# 결과값:
STATUS
 
------------------------
 
OPEN


# 오라클 서버가 정상적으로 startup 되었음을 의미

일반 사용자 계정인 『hr』로 접속 시도

# 두 번째로... 일반 사용자 계정인 『hr』로 접속 시도

SQL> connect hr/lion

# 결과값
ERROR:
ORA-28000: the account is locked

# 설명
# 일반 사용자 계정인 『hr』은 잠겨있는 상태이므로 오라클 서버 접속이 불가능한 상태

Warning: You are no longer connected to ORACLE.

# 기존에 sys 계정으로 연결되어 있었으나 유효하지 않은 연결 시도로 인해 기존 연결까지 해제되는 상황

현재 오라클 서버에 존재하는 사용자 계정에 대한 정보 조회

# 현재 오라클 서버에 존재하는 사용자 계정에 대한 정보 조회
SQL> set linesize 600;
SQL> select username, account_status from dba_users;

# 결과값

USERNAME                                                     ACCOUNT_STATUS

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

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

SYS                                                          OPEN

SYSTEM                                                       OPEN

ANONYMOUS                                                    OPEN

APEX_PUBLIC_USER                                             LOCKED

FLOWS_FILES                                                  LOCKED

APEX_040000                                                  LOCKED

OUTLN                                                        EXPIRED & LOCKED

DIP                                                          EXPIRED & LOCKED

ORACLE_OCM                                                   EXPIRED & LOCKED

XS$NULL                                                      EXPIRED & LOCKED

MDSYS                                                        EXPIRED & LOCKED

USERNAME                                                     ACCOUNT_STATUS

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

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

CTXSYS                                                       EXPIRED & LOCKED

DBSNMP                                                       EXPIRED & LOCKED

XDB                                                          EXPIRED & LOCKED

APPQOSSYS                                                    EXPIRED & LOCKED

HR                                                           EXPIRED & LOCKED

16 rows selected.

# 설명
# 위의 조회 구문을 통해 hr 계정이 존재하지만 유효기간만료 & 잠겨있음을 확인할 수 있다.

※ host 명령어

  • 도스 명령 체계로 전환하거나 한 칸 띄운 다음 도스 명령 입력이 가능하다.
  • 예를 들면 『host dir』, 『host cls』, 『host ipconfig』등...
  • 유닉스 계역에서는 『host』명령어 뿐만 아니라 『!』도 사용 가능.
  • 하지만, 윈도우 계역에서는 『host』 명령어만 사용 가능하다.

hr 계정 잠금 해제 (sys로 연결된 상태)

# hr 계정 잠금 해제 (sys로 연결된 상태)

SQL> alter user hr account unlock;

# 결과값
User altered.

계정 잠금이 해제된 hr 계정으로 다시 접속 시도

# 계정 잠금이 해제된 hr 계정으로 다시 접속 시도

SQL> conn hr/lion

# 결과값

ERROR:

ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

계정 정보 변경(sys로 연결) → 패스워드 설정 변경

# 계정 정보 변경(sys로 연결) → 패스워드 설정 변경
SQL> alter user hr identified by lion;

# 결과 값
User altered.

패스워드를 유효하게 설정한 이후 hr 계정으로 다시 접속 시도

# 패스워드를 유효하게 설정한 이후 hr 계정으로 다시 접속 시도
SQL> conn hr/lion

# 결과 값
Connected.

# →확인
SQL> show user

# 결과 값
USER is "HR"

오라클 서버에 존재하는 계정 정보 조회 구문 실행

# 오라클 서비에 존재하는 계정 정보 조회 구문 실행
SQL> select username, account_status from dba_users;

# 결과 값
ERROR at line 1:

ORA-00942: table or view does not exist

Oracle에서 주석처리

--1줄 주석문 처리

/*
여러줄
(다중행)
주석문
처리
*/

실습

Oracle SQL Developer 프로그램 사용

새로 만들기/데이터베이스 접속

환경설정

20180105_sys.sql

SELECT USER
FROM DUAL;

--==>>SCOTT

테이블 생성 (DEPT)

--○ 테이블 생성 (DEPT)
CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY
, DNAME VARCHAR2(14)
, LOC   VARCHAR2(13)
);
--==>>Table DEPT이(가) 생성되었습니다.

확인

--○ 확인
SELECT *
FROM DEPT;

테이블 생성 (EMP)

--○ 테이블 생성 (EMP)
CREATE TABLE EMP
( EMPNO    NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY
,	ENAME    VARCHAR2(10)
,	JOB      VARCHAR2(9)
,	MGR      NUMBR(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)

--○ 데이터 입력 (DEPT)
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)

--○ 데이터 입력 (EMP)
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)

--○ 테이블 생성 (BONUS)
CREATE TABLE BONUS
(ENAME VARCHAR2(10)
, JOB   VARCHAR2(9)
, SAL   NUMBER
, COMM   NUMBER
) ;
--==>>Table BONUS이(가) 생성되었습니다.

테이블 생성 (SALGRADE)

--○ 테이블 생성 (SALGRADE)
CREATE TABLE SALGRADE
( GRADE NUMBER
, LOSAL NUMBER
, HISAL NUMBER
);
--==>>Table SALGRADE이(가) 생성되었습니다.

데이터 입력 (SALGRADE)

--○ 데이터 입력 (SALGRADE)
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;
--==>>커밋 완료.

-- ROLLBACK;

현재 SCOTT 계정이 소유하고 있는 테이블 확인(조회)

--○ 현재 SCOTT 계정이 소유하고 있는 테이블 확인(조회)
SELECT *
FROM TAB;
--==>>
/*
BONUS	    TABLE
DEPT	    TABLE
EMP	    TABLE
SALGRADE    TABLE
*/

※※※※※ 중요 ※※※※※

SELECT 문의 처리(PARSING) 순서

SELECT 문의 처리(PARSING) 순서

→ 쿼리문 작성하는 순서

SELECT 컬럼명  --⑤

FROM 테이블명  --① 만족하는 테이블

WHERE 조건절   --② 만족하는 행만 찾아서 메모리

GROUP BY 절    --③

HAVING 조건절  --④ 그룹의 조건절

ORDER BY       --⑥ 정렬, 부하가 나기 때문에 프로젝트에서 제한되는 경우가 있다

보너스 테이블 조회

--○ 보너스 테이블 조회
SELECT *
FROM BONUS;

부서정보 테이블 조회

--○ 부서정보 테이블 조회
SELECT *
FROM DEPT;

사원정보 테이블 조회

--○ 사원정보 테이블 조회
SELECT *
FROM EMP;

급여등급 테이블 조회

--○ 급여등급 테이블 조회
SELECT *
FROM SALGRADE;

테이블의 구조 확인

--○ 테이블의 구조 확인
DESCRIBE EMP;
--==>>
/*
이름       널        유형
-------- -------- ------------
EMPNO    NOT NULL NUMBER(4)
ENAME             VARCHAR2(10)
JOB               VARCHAR2(9)
MGR               NUMBER(4)
HIREDATE          DATE
SAL               NUMBER(7,2)
COMM              NUMBER(7,2)
DEPTNO            NUMBER(2)
*/

주요 자료형

숫자형

  • NUMBER
  • NUMBER(3)  : -999~999
  • NUMBER(4,1) : 7.392 전체가 4자리 중 정수가 1자리

문자형

  • 고정형 크기
    • CHAR
    • CHAR(10) -- 10BYTE '졸려도참자' 10은 바이트 수
    • CHAR(10) ← '명소희' 6바이트지만 고정형이므로 10바이트 소모

전화번호, 주민번화, 학번은 숫자타입으로 저장하면 안된다! 왜나햐면 맨 앞의 수가 0이면 탈락되기 때문이다.

  • 가변형(자료형 헤더에 들어가야함 몇바이트를 사용하는 지 알기 위한 기능이 있기 때문에 자료형이 비쌈)
    • VARCHAR2
    • VARCHAR2(10) -- 10 BYTE '졸리면자자'
    • VARCHAR2(10) ← '자면 안되나요?' 10BYTE 를 초과하므로 입력 불가.VARCHAR2(10) ← '물먹자' 6BYTE 를 소모

앞에 N이 붙게되면 유니코드 고정/가변형 문자데이터 타입

날짜형

  • DATE
SELECT SYSDATE
FROM DUAL;
--==>18/01/05

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--SESSION 어딘가에 담아둔 정보, 지금 연결에 있어서는 이 포멧으로 보여주라

SELECT SYSDATE
FROM DUAL;
--==>>2018-01-05 14:52:11

SELECT 01092836776
FROM DUAL;
--==>1092836776

SELECT '01092836776'
FROM DUAL;
--==>>01092836776

EMP 테이블에서 부서번호가 20번인 사원들의 정보 중 사원번호, 사원명, 급여, 직종명, 부서번호 조회

SELECT EMPNO, ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO=20;
-- =은 관계 연산자
--한글로 먼저 써보고 SQL문으로 변환하자
--==>>
/*
7369	SMITH	800  CLERK	  20
7566	JONES	2975	MANAGER	20
7788	SCOTT	3000	ANALYST	20
7876	ADAMS	1100	CLERK	  20
7902	FORD	3000	ANALYST	20
*/

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

--   컬럼의 별칭 alias엘리어스

SELECT EMPNO AS "사원번호", ENAME "사원명", SAL 급여, JOB "직종 명", DEPTNO
FROM EMP
WHERE DEPTNO=20;
-- AS를 사용하면 원본 데이터가 변하는 것은 아니다. 보여질 때만

EMP 테이블에서 부서번호가 20번과 30번 직원들의 정보 중 사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.

SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE DEPTNO=20 , DEPTNO = 30;
-- 단일조건이아니라 다중조건(부서번호가 20번과 30번 직원)이라면 논리연산자가 등장해야한다

SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE DEPTNO=20 OR DEPTNO = 30;
-- ||는 문자열 결합 연산자다

SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE DEPTNO IN (20, 30);

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

SELECT *
FROM EMP
WHERE JOB = 'CLERK';
--※ 오라클에서 ... 입력된 데이터(값) 만큼은 반.드.시. 대소문자 구분을 엄격하게 한다.

테이블 복사

--○ 테이블 복사
-->  내부적으로 대상 테이블 안에 들어있는 데이터 내용만 복사하는 과정
CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;
--==>>Table TBL_EMP이(가) 생성되었습니다.

SELECT *
FROM TBL_EMP;
--==>>
/*
7369	SMITH	  CLERK	    7902	1980-12-17 00:00:00	800	    20
7499	ALLEN	  SALESMAN	7698	1981-02-20 00:00:00	1600	300  30
7521	WARD	  SALESMAN	7698	1981-02-22 00:00:00	1250	500  30
7566	JONES	  MANAGER	  7839	1981-04-02 00:00:00	2975	    20
7654	MARTIN	SALESMAN	7698	1981-09-28 00:00:00	1250	1400	30
7698	BLAKE	  MANAGER	  7839	1981-05-01 00:00:00	2850	    30
7782	CLARK	  MANAGER	  7839	1981-06-09 00:00:00	2450	    10
7788	SCOTT	  ANALYST	  7566	1987-07-13 00:00:00	3000	    20
7839	KING	  PRESIDENT	    1981-11-17 00:00:00	5000	    10
7844	TURNER	SALESMAN	7698	1981-09-08 00:00:00	1500	   0	30
7876	ADAMS	  CLERK	    7788	1987-07-13 00:00:00	1100	    20
7900	JAMES	  CLERK	    7698	1981-12-03 00:00:00	950	    30
7902	FORD	  ANALYST 7566	1981-12-03 00:00:00	3000	    20
7934	MILLER	CLERK   	7782	1982-01-23 00:00:00	1300	    10
*/

이미 만들어진 테이블에 컬럼을 추가하거나 제거하는 방법

--○ 이미 만들어진 테이블에 컬럼을 추가하거나 제거하는 방법
--   TBL_EMP 테이블에 주민번호정보를 담을 수 있는 컬럼(SSN) 추가
ALTER TABLE TBL_EMP
ADD SSN CHAR(13);
--==>Table TBL_EMP이(가) 변경되었습니다.

-- DML INSERT/UPDATE/DELETE COMMIT을 받드시 행해야한다. 일단은 AUTO 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;
SELECT EMPNO, ENAME, SSN
FROM TBL_EMP;
-- 컬럼 순서는 무의미하다

TBL_EMP 테이블에 추가한 SSN(주민번호) 칼럼을 구조적으로 제거

--○ TBL_EMP 테이블에 추가한 SSN(주민번호) 칼럼을 구조적으로 제거
ALTER TABLE TBL_EMP
DROP COLUMN SSN;
--==>>Table TBL_EMP이(가) 변경되었습니다.

SELECT *
FROM TBL_EMP;

SELECT *
FROM TBL_EMP
WHERE EMPNO='7369';

DELETE
FROM TBL_EMP
WHERE EMPNO='7369';
--==>1 행 이(가) 삭제되었습니다.

DROP TABLE TBL_EMP;
SELECT *
FROM TAB;

NULL의 처리

--○ NULL의 처리

SELECT 2, 1+2, 3-1, 2*10, 10/2
FROM DUAL;
--==>>2	3	2	20	5

SELECT 2+NULL, 2-NULL, 2*NULL, 2/NULL
FROM DUAL;
--==>> (NULL) (NULL) (NULL) (NULL)

--※ NULL 은... 현실에 존재하는 특정한 값을 의미하는 것이 아니라 아무것도 들어있지 않은 상태를 의미하는 값이므로 NULL 을 대상으로 연산을 수행할 경우... 또는 특정 연산 과정에 NULL이 포함될 경우 결과는 무조건 NULL이다.

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

--○ 다시 EMP 테이블을 복사하여 TBL_EMP 테이블 생성
CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;
--==>>Table TBL_EMP이(가) 생성되었습니다.

TBL_EMP 테이블에서 커미션(COMM) → 수당이 NULL 인 사원들의 사원명, 직종명, 급여, 커미션 조회

--○ TBL_EMP 테이블에서 커미션(COMM) → 수당이 NULL 인 사원들의 사원명, 직종명, 급여, 커미션을 조회한다.

SELECT ENAME "사원명", JOB"직종명", SAL"급여", COMM"커미션"
FROM TBL_EMP
WHERE COMM IS NULL;
--NULL은 관계연산자로 비교할 수 없다
--※ NULL 은 값으로 존재하는 것이 아니기 때문에 값으로 비교할 수 없다.
--   =, >=, <=, >, <, !=, <>, ^= 와 같은 연산자를 사용할 수 없다.

TBL_EMP 테이블에서 20번 부서에 근무하지 않는 사원들의 정보를 사원번호, 사원명, 부서번호로 조회

--○ TBL_EMP 테이블에서 20번 부서에 근무하지 않는 사원들의 정보를 사원번호, 사원명, 부서번호로 조회한다.
SELECT EMPNO, ENAME, DEPTNO
FROM TBL_EMP
WHERE DEPTNO != 20;

SELECT EMPNO, ENAME, DEPTNO
FROM TBL_EMP
WHERE DEPTNO <> 20;

SELECT EMPNO, ENAME, DEPTNO
FROM TBL_EMP
WHERE DEPTNO ^= 20;

SELECT EMPNO, ENAME, DEPTNO
FROM TBL_EMP
WHERE NOT DEPTNO = 20;

SELECT ENAME "사원명", JOB"직종명", SAL"급여", COMM"커미션"
FROM TBL_EMP
WHERE NOT COMM IS NULL;

SELECT ENAME "사원명", JOB"직종명", SAL"급여", COMM"커미션"
FROM TBL_EMP
WHERE COMM IS NOT NULL;

TBL_EMP 테이블에서 모든 사원들의 사원번호, 사원명, 급여, 커미션, 연봉 정보를 조회

--○ TBL_EMP 테이블에서 모든 사원들의
--   사원번호, 사원명, 급여, 커미션, 연봉 정보를 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   수당(COMM)은 1회/년 지급한다.
--   연봉 = (급여 * 12) + 커미션
SELECT EMPNO "사원번호", ENAME "사원명", SAL"급여", COMM"커미션", (SAL*12)+COMM "연봉정보"
FROM TBL_EMP;

SELECT EMPNO "사원번호", ENAME "사원명", SAL"급여", COMM"커미션", (SAL*12+COMM) "연봉정보"
FROM TBL_EMP;


'교육 및 세미나 > 신입사원 교육' 카테고리의 다른 글

6일차(2018.01.10)  (0) 2018.01.12
5일차(2018.01.09)  (0) 2018.01.12
3일차(2018.01.04)  (0) 2018.01.09
2일차(2018.01.03)  (0) 2018.01.09
1일차(2018.01.02)  (0) 2018.01.09