해당 게시물에서는 코드의 'SQL>' 부분이 제외됨
* DB 데이터 베이스
- Client와 server
> server에 client가 무언가를 요청하면 server가 제공
> client와 server는 누가 정보를 요청하고 누가 제공하냐에 따라서 클라이언트와 서버로 나눠짐
*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*PLUS와 ORACLE을 연결하는 법 : 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 테이블에서 SAL이 3000이상인 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'; |