Oracle DB

[Oracle DB] 데이터베이스의 개념과 SQL(+오라클 설치 테스트)

소댓 2023. 2. 20. 22:36

해당 게시물에서는 코드의 'SQL>' 부분이 제외됨

* DB 데이터 베이스

- Clientserver

> server client가 무언가를 요청하면 server가 제공

> clientserver는 누가 정보를 요청하고 누가 제공하냐에 따라서 클라이언트와 서버로 나눠짐

 

 

*Oracle 다운로드

Oracle – resources – developer download – database – database enterprise

 

* 다운로드 전에 사전 점검!

1. 기존에 오라클 설치 한 적 있는지 > uninstall(잘못하면 날아감)

2.  영문명으로 된 계정으로 로그인 후

> 개발자한글 xxx // 한글은 주석 정도만

> 사용자 이름이 영어여야 함

3. C or D : database.zip c:\database\

>> CMD에서 설치 확인

 

* Oracle 설치 테스트

> 클라이언트 확인 프로그램 : SQL*PLUS

> SQL*PLUSORACLE을 연결하는 법 : SQLPLUS ID/PW 입력해서 접속

> scott/tiger(일반사용자계정), system/ORACLE(관리자계정)

> 명령을 전달하는 명령어를 SQL Querry Language

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
sqlplus system/ORACLE 
-- ORACLE 접속
 
show user
USER은 "SYSTEM"입니다
-- SCOTT 계정은 테스트용 계정
-- 주석은 실행되지 않는 코드
 
alter user scott
identified by tiger
account unlock;
-- scott 사용자의 비번으로 tiger 계정을 풀어줌
 
sqlplus scott/tiger
 
show user
-- USER은 "SCOTT"입니다
 
SQL> desc dept
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)
 
SQL> desc 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)
cs

 

 

* DB?

- 회사 간 데이터의 유실 및 중복을 방지하기 위해 중간에 파일을 관리하는 프로그램을 별도로 마련

: DBMS(DataBase Management System)

> 다른 회사 간에도 같은 DBMS를 사용하기 때문에 알아서 데이터 관리가 가능 : 무결성 보장!

> 저장하고 관리하는 파일 모음을 작은 의미의 DB라고 부름

> DB 프로그램 회사에는 Oracle, My SQL. MS-SQL, DB2 등이 있음

 

- 사용하던 DB 회사가 부도가 난다면? DB 전환과정에서 전환 비용이 많이 들게 됨

> 전환하면서 드는 비용을 줄여주기 위해 미국산업표준협회:ANSI’에서

  DB제조사들을 불러모아 인터페이스, 사용법, 명령은 똑같이 사용하도록 하라!

>> 모든 DB들의 사용법이 동일하게 통일됨 > 표준 사용법 : SQL(구조적 질의어)

 

 

 

* 관계형 데이터베이스 : 데이터를 표(테이블) 형태로 보여줌

> ROW : 행 / COLUMN : 열

- SELECTION : 특정 행 선택 / PROJECTION : 특정 열 선택

- JOIN : 나눠져 있는 테이블의 컬럼들을 마치 하나의 테이블의 데이터를 꺼내오듯이 연결하여 꺼내오는 기법

 

*

SELECT 컬럼명 : SELECT

FROM 테이블명   : FROM

                                 2개 이상 절 :

                                 SELET

>> 모든 DB의 표준 방식이기 때문에 줄여쓰거나 다르게 쓸 수 없음

*

SELECT * FROM DEPT;

Select * from dept;

SELECT *

FROM DEPT;

>> SQL 특징 : 대소문자를 구분하지 않는다.

 
SQL> desc dept ( 부서) 
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 DEPTNO   (부서번호)             NOT NULL NUMBER(2)
 DNAME    (부서명)                             VARCHAR2(14)
 LOC         (부서위치)                          VARCHAR2(13)

SQL> DESC 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)

 

* NULL : 해당사항 없음

- 0이 아님

- 공백 아님

- 할당 연산 비교 의미가 없음

?, (무한대)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SET NULL ""
 
SELECT EMPNO, ENAME, SAL, SAL*12, COMM, SAL*12+COMM
FROM EMP;
 
     EMPNO ENAME             SAL     SAL*12       COMM SAL*12+COMM
---------- ---------- ---------- ---------- ---------- -----------
      7369 SMITH             800       9600
      7499 ALLEN            1600      19200        300       19500
      7521 WARD             1250      15000        500       15500
      7566 JONES            2975      35700
      7654 MARTIN           1250      15000       1400       16400
      7698 BLAKE            2850      34200
      7782 CLARK            2450      29400
      7788 SCOTT            3000      36000
      7839 KING             5000      60000
      7844 TURNER           1500      18000          0       18000
      7876 ADAMS            1100      13200
 
     EMPNO ENAME             SAL     SAL*12       COMM SAL*12+COMM
---------- ---------- ---------- ---------- ---------- -----------
      7900 JAMES             950      11400
      7902 FORD             3000      36000
      7934 MILLER           1300      15600
cs

> 널 값을 ""로 설정

 

 

* ALIAS

1. 공백 KEYWORD

2. 공백 "KEYWORD"

3. AS KEYWORD

4. AS "KEYWORD"

> 2번과 4(“~”)은 대문자 소문자 특수문자도 별칭으로 사용 가능함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
SELECT EMPNO, ENAME, SAL, SAL*12, COMM, SAL*12+NVL(COMM,0)
FROM EMP;
     EMPNO ENAME             SAL     SAL*12       COMM SAL*12+NVL(COMM,0)
---------- ---------- ---------- ---------- ---------- ------------------
      7369 SMITH             800       9600                          9600
      7499 ALLEN            1600      19200        300              19500
      7521 WARD             1250      15000        500              15500
      7566 JONES            2975      35700                         35700
      7654 MARTIN           1250      15000       1400              16400
      7698 BLAKE            2850      34200                         34200
      7782 CLARK            2450      29400                         29400
      7788 SCOTT            3000      36000                         36000
      7839 KING             5000      60000                         60000
      7844 TURNER           1500      18000          0              18000
      7876 ADAMS            1100      13200                         13200
 
     EMPNO ENAME             SAL     SAL*12       COMM SAL*12+NVL(COMM,0)
---------- ---------- ---------- ---------- ---------- ------------------
      7900 JAMES             950      11400                         11400
      7902 FORD             3000      36000                         36000
      7934 MILLER           1300      15600                         15600
 
SELECT EMPNO, ENAME, SAL, SAL*12, COMM, SAL*12+NVL(COMM,0) ANNSAL
FROM EMP;
 
     EMPNO ENAME             SAL     SAL*12       COMM     ANNSAL
---------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH             800       9600                  9600
      7499 ALLEN            1600      19200        300      19500
      7521 WARD             1250      15000        500      15500
      7566 JONES            2975      35700                 35700
      7654 MARTIN           1250      15000       1400      16400
      7698 BLAKE            2850      34200                 34200
      7782 CLARK            2450      29400                 29400
      7788 SCOTT            3000      36000                 36000
      7839 KING             5000      60000                 60000
      7844 TURNER           1500      18000          0      18000
      7876 ADAMS            1100      13200                 13200
 
     EMPNO ENAME             SAL     SAL*12       COMM     ANNSAL
---------- ---------- ---------- ---------- ---------- ----------
      7900 JAMES             950      11400                 11400
      7902 FORD             3000      36000                 36000
      7934 MILLER           1300      15600                 15600
cs

 

 

 

 

* SELECT : DB에 어떤 자료를 꺼내오라는 명령문

- SELECT COL1, COL2, *, FUNC, SAL*12, ALIAS, ‘XXXX’, ||, FUNCTION, ALIAS, DISTINCT

  FROM TAB1;

> 이 문장 어디에도 용량은 상관이 없다. 네이버, 구글이 데이터 끌어올 때도 이렇게

>> DB의 규모가 크든 작든 모든 데이터를 가져올 수 있는 명령문!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 사원번호 사원명 급여
 
SELECT EMPNO, ENAME, SAL
FROM EMP;
 
     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            1100
 
     EMPNO ENAME             SAL
---------- ---------- ----------
      7900 JAMES             950
      7902 FORD             3000
      7934 MILLER           1300
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT ENAME || ' IS A ' || JOB, 100
FROM EMP;
 
ENAME||'ISA'||JOB                100
------------------------- ----------
SMITH IS A CLERK                 100
ALLEN IS A SALESMAN              100
WARD IS A SALESMAN               100
JONES IS A MANAGER               100
MARTIN IS A SALESMAN             100
BLAKE IS A MANAGER               100
CLARK IS A MANAGER               100
SCOTT IS A ANALYST               100
KING IS A PRESIDENT              100
TURNER IS A SALESMAN             100
ADAMS IS A CLERK                 100
 
ENAME||'ISA'||JOB                100
------------------------- ----------
JAMES IS A CLERK                 100
FORD IS A ANALYST                100
MILLER IS A CLERK                100
cs
1
2
3
4
5
6
7
8
9
10
11
12
--JOB에는 어떤 것들이 있는지 알아보고자 한다. 어떤 SQL문을 사용하면 좋을까?
 
SELECT DISTINCT JOB
EMP;
 
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
cs

 

* 저장장소
Bit : 1, 0 정도의 크기를 담을 수 있는 영역
8 bit == > 1byte
1byte * 1024 == > 1Kbyte
1Kbyte * 1024 == > 1MB
1MB * 1024 == > 1GB
1GB * 1024 == > 1TB
1TB * 1024 == > 1PB
1PB * 1024 ==> 1EB
오라클은 수백 엑사바이트까지 표현할 수 있음..
수백 엑사바이트가 하나의 테이블로 표현 가능함

 

 

 

*

SELECT EMPNO, ENAME, SAL

FROM EMP;

> 전체 데이터를 다 보여달라는 것. 일부만 보고 싶다면?

*

SELECT COL1, COL2, *, FUNC, SAL*12, ALIAS, ‘XXXX’, ||, FUNCTION, ALIAS, DISTINCT

FROM TAB1

WHERE CONDITION (연산자 : 1. 비교연산자 : >, <, >=, <=, =, !=, <> )

*

SELECT EMPNO, ENAME, SAL

FROM EMP

WHERE SAL >= 3000;

> EMP 테이블에서 SAL3000이상인 EMPNO, ENAME, SAL 컬럼을 가져오는 것

> SAL값이 >=3000에서 TRUE인 행만!

 

1
2
3
4
5
6
7
8
9
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL >= 3000;
 
     EMPNO ENAME             SAL
---------- ---------- ----------
      7788 SCOTT            3000
      7839 KING             5000
      7902 FORD             3000
cs
1
2
3
4
5
6
7
8
9
10
11
--10번 부서 사원들의 사번, 이름, 급여, 부서번호
 
SELECT EMPNO, ENAME, SAL, DEPTNO
ROM EMP
WHERE DEPTNO=10;
 
     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7782 CLARK            2450         10
      7839 KING             5000         10
      7934 MILLER           1300         10
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--급여가 1500 이하인 사원의 사번, 이름, 입사일을 출력
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
WHERE SAL <= 1500;
 
     EMPNO ENAME      HIREDATE
---------- ---------- --------
      7369 SMITH      80/12/17
      7521 WARD       81/02/22
      7654 MARTIN     81/09/28
      7844 TURNER     81/09/08
      7876 ADAMS      87/05/23
      7900 JAMES      81/12/03
      7934 MILLER     82/01/23
cs
1
2
3
4
5
6
7
8
9
10
--SCOTT의 사번, 이름, 급여, JOB?
 
SELECT EMPNO, ENAME, SAL, JOB
FROM EMP
WHERE ENAME = 'SCOTT';
 
     EMPNO ENAME             SAL JOB
---------- ---------- ---------- ---------
      7788 SCOTT            3000 ANALYST
--'scott'으로 입력하면 오류 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT EMPNO, ENAME, JOB, HIREDATE
FROM EMP
WHERE JOB != 'MANAGER';
 
     EMPNO ENAME      JOB       HIREDATE
---------- ---------- --------- --------
      7369 SMITH      CLERK     80/12/17
      7499 ALLEN      SALESMAN  81/02/20
      7521 WARD       SALESMAN  81/02/22
      7654 MARTIN     SALESMAN  81/09/28
      7788 SCOTT      ANALYST   87/04/19
      7839 KING       PRESIDENT 81/11/17
      7844 TURNER     SALESMAN  81/09/08
      7876 ADAMS      CLERK     87/05/23
      7900 JAMES      CLERK     81/12/03
      7902 FORD       ANALYST   81/12/03
      7934 MILLER     CLERK     82/01/23
 
-- =의 반대는 !=(제외한다는 뜻)
cs

 

- ASCII CODE?

American Standard Code for Information Interchange

A : 65 2진수값 / B 66 / C 67 …

a : 97

0 : 48

Enter : 13, 10

 

*

WHERE HIREDATE > ‘81/01/01’

B.C 4312.1.1 ~

~ AD 9999.12.31 23:59:59:59

23/02/19 < 23/02/20 16:40

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--81/01/01 이후에 입사한 사원의 사번, 이름, 입사일?
 
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
WHERE HIREDATE > '81/01/01';
 
     EMPNO ENAME      HIREDATE
---------- ---------- --------
      7499 ALLEN      81/02/20
      7521 WARD       81/02/22
      7566 JONES      81/04/02
      7654 MARTIN     81/09/28
      7698 BLAKE      81/05/01
      7782 CLARK      81/06/09
      7788 SCOTT      87/04/19
      7839 KING       81/11/17
      7844 TURNER     81/09/08
      7876 ADAMS      87/05/23
      7900 JAMES      81/12/03
 
     EMPNO ENAME      HIREDATE
---------- ---------- --------
      7902 FORD       81/12/03
      7934 MILLER     82/01/23
 
cs

 

 

* 논리연산자 : AND, OR

T AND T == > T : AND는 둘 다 만족

T AND F == > F

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--부서번호가 30이고 급여가 1800 이상인 사원들의 사번, 이름, 급여, 부서번호?
 
SELECT EMPNO, ENAME, SAL, DEPTNO
  2  FROM EMP
  3  WHERE DEPTNO = 30
  4  AND SAL >= 1800;
 
     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7698 BLAKE            2850         30
 
--JOB이 MANAGER이고, 급여가 1500 이상인 사원의 사번, 이름, JOB, 급여는?
 
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
WHERE JOB = 'MANAGER'
AND SAL >= 1500;
 
     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7566 JONES      MANAGER         2975
      7698 BLAKE      MANAGER         2850
      7782 CLARK      MANAGER         2450
cs
더보기

+)) 추가 SQL 응용

1. 사번, 이름, 급여? 
SELECT EMPNO, ENAME, SAL
FROM EMP;

2. 부서번호, 부서명 출력?
SELECT DEPTNO, DNAME
FROM DEPT;

3. 급여가 1000 이상인 사원들의 사번, 이름 ,급여?
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL >= 1000;

4. 부서번호가 10번이고 급여가 1500이상인 사원들의 이름, 급여, 부서번호?
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
AND SAL >= 1500;

5. JOB이 MANAGER 가 아닌 사원들의 이름, JOB?
SELECT ENAME, JOB
FROM EMP
WHERE JOB != 'MANAGER';

6. 부서명이 SALES 인 부서의 부서번호, 부서명, 위치?
SELECT DEPTNO, DNAME, LOC
FROM DEPT
WHERE DNAME = 'SALES';

7. JOB이 CLERK 이거나 20번 부서에 속해 있는 사원들의 사번, 이름, 부서번호, JOB?
SELECT EMPNO ,ENAME, DEPTNO, JOB
FROM EMP
WHERE JOB = 'CLERK'
OR DEPTNO = 20;

8. 급여가 1500 이상 3000 사이에 있으면서
JOB이 MANAGER 인 사원의 사번, 이름, JOB ?
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE SAL >= 1500
AND SAL <= 3000
AND JOB = 'MANAGER';

9. 부서위치가 DALLAS인 부서의 부서번호, 부서명?
SELECT DEPTNO, DNAME
FROM DEPT
WHERE LOC = 'DALLAS';