728x90

DDL (데이터 정의 언어 : Data Define Language)

Schema, Domain,Table, View, Index를 정의하거나 변경 또는 삭제할 때 사용하는 언어

 

DDL 유형

CREATE, ALTER, DROP...

 

[ CREATE ]

1. 테이블 생성 

SQL > CREATE TABLE TBL_PANAME
	(PDCODE     VARCHAR2(10),
	PANDAY      DATE DEFAULT SYSDATE,
	PANSU        NUMBER,
	CONSTRAINT TBL_PANAME_PDCODE_FK --- 테이블 레벨의 제약조건
                    FOREIGN KEY(PDCODE)
                    REFERENCES TBL_PRODUCT(PDCODE)
                    ON DELETE CASCADE );

* CREATE, SELECT, FROM 등을 '키워드' 또는 '예약어'라고 한다

키워드 + 요소를 ---절이라고 한다. ( 예: SELECT + 요소 -> SELECT 절)

 

2. 제약조건

컬럼레벨의 제약조건은 , 없이 뒤에 이어서 CONSTRAINT문법을 적음

테이블 레벨의 제약조건은 컬럼 정의가 끝나고 (, 로 종결) 추가

 

제약조건 명명규칙은 테이블이름(약식)_컬럼명_제약조건종류

* [constraint 제약조건명] 생략가능 
다만 관리가 어렵기때문에 권장하지 않음

 

1) NOT NULL 제약 조건 - 컬럼 레벨의 문법만 가능

SQL> create table test1
	( id number(10) constraint t1_id_nn not null,
    	name varchar2(30) constraint t1_name_nn not null,
        job varchar2(20),
        email varchar2(20),
        phone varchar2(20) constraint t1_ph_nn not null,
        start_date date );

2) UNIQUE 제약조건

중복값 허용 안함

SQL> create table test2
	(id number(10) constraint t2_id_nn not null,
    				constraint t2_id_uk unique,	---comlumn-level constraint
                    (...)                  
    email varchar2(20),
	start_date date,
    constraint t2_email_uk unique(email) ); --- table-level constraint

3) PRIMARY KEY 제약조건

- NOT NULL + UNIQUE 의 성격을 가짐

- 테이블의 대표 컬럼에 적용하는 제약조건 (구별을 할 수 있는 키)

- 주민번호같이 민감한 정보에는 사용하지 않는다.

SQL> CREATE TABLE test3
  2  (id number(10) constraint t3_id_pk primary key,
  3  name varchar2(30) constraint t3_name_nn not null,
  4  job varchar2(20),
  5  email varchar2(20),
  6  phone varchar2(20) constraint t3_ph_nn not null
  7                     constraint t3_ph_uk unique,
  8  start_date DATE,
  9  constraint t3_email_uk UNIQUE(email));

Table created.

4) FOREIGN_KEY 제약조건

자기 자신 테이블이나 다른 테이블 특정칼럼(PK, UK)을 참조하는 제약조건

* 예) 없는 부서 아이디(department_id)를 사원정보(employees)에 입력해선 안된다.

 

4-1) 테이블레벨 제약조건

employess.department_id 컬럼에 제약조건을 걸되, 참조하는 컬럼은 departments.department_id

CREATE TABLE employess (
	employee_id	NUMBER(6),
	last_name	VARCHAR2(25) NOT NULL,
	email		VARCHAR2(25),
	salary		NUMBER(8,2),
	commission_pet	NUMBER(2,2),
	hire_date		DATE NOT NULL,
(...)
	department_id	NUMBER(4),
	CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
		REFERENCES departments(department_id),
	CONSTRAINT emp_email_uk	Unique(email) );

4-2) 컬럼레벨 제약조건

* REFERENCES 절이 있으므로 컬럼레벨에선 제약조건종류(FOREIGN KEY) 키워드를 적지 않는다.

CREATE TABLE employess 
(
	(...)	
	department_id	NUMBER(4) CONSTRAINT emp_dept_fk
		REFERENCES departments(department_id),
    (...)
)

4-3) 자기 자신 컬럼을 참조하는 제약조건

ex) 매니저 아이디는 반드시 사원정보 테이블의 사원ID(employee_id)에 존재하는 값이어야 함

CREATE TABLE employess 
(
	(...)	
	manager_id	NUMBER(6)
    	CONSTRAINT emp_manager_fk REFERENCES
        employee (employee_id)
    (...)
)

 

5) CHECK 제약조건

(...)
	salary NUMBER(2)
    CONSTRAINT emp_salary_min
    	CHECK (salary > 0)	--- salary의 값이 0 이상이어야 함
(...)        

 

3. 제약조건 조회 (데이터 딕셔너리)

(* 테이블 이름은 DB에 저장될 때 무조건 대문자로 저장되기 때문에 조회 시 대문자로 적는다)

SELECT constraint_name, constraint_type, search_condition
       FROM USER_CONSTRAINTS
       WHERE TABLE_NAME = '<테이블이름>';

 

4. 서브쿼리 구문으로 테이블 생성

CREATE TABLE <테이블명>
 AS
  SELECT
  FROM
  WHERE

예) 서브쿼리로 테이블 생성하되, WHERE절 조건에 맞는 VALUES도 가져오기

 

CREATE TABLE dept80
    AS
        SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
          FROM employees
          WHERE department_id = 80;

SELECT결과

EMPLOYEE_ID LAST_NAME                     ANNSAL HIRE_DAT
----------- ------------------------- ---------- --------
        145 Russell                       168000 04/10/01
        146 Partners                      162000 05/01/05
        147 Errazuriz                     144000 05/03/10
        148 Cambrault                     132000 07/10/15
        149 Zlotkey                       126000 08/01/29
        150 Tucker                        120000 05/01/30
        151 Bernstein                     114000 05/03/24
        152 Hall                          108000 05/08/20
        153 Olsen                          96000 06/03/30
        154 Cambrault                      90000 06/12/09
        155 Tuvault                        84000 07/11/23

제약조건 조회결과

SELECT constraint_name, constraint_type, search_condition, r_constraint_name
FROM user_constraints
WHERE table_name = 'DEPT80';

* 제약조건은 NOT NULL 외에 복사되지 않으며 NOT NULL도 제약조건명은 임의로 붙여진다.

CONSTRAINT_NAME            C SEARCH_CONDITION             R_CONSTRAINT_NAME                  
-------------------------------------------------------------------------------
SYS_C007745                C "LAST_NAME" IS NOT NULL       NULL
SYS_C007746                C "HIRE_DATE" IS NOT NULL       NULL

 

예) 서브쿼리로 테이블 생성 시 구조만 가져오기

* WHERE절에 항상 false가 되는 조건을 넣으면 된다.

CREATE TABLE dept80_2
    AS
        SELECT employee_id, last_name, salary * 12 annsal, hire_date
        FROM employees
        WHERE 1 = 2;

5. 테이블 생성 시 대소문자 구분 또는 띄어쓰기 사용하여 생성

소문자 이름 (큰 따옴표 사용)으로 테이블을 특별히 생성하지 않은 경우 테이블 이름은 기본적으로 대문자로 설정된다.

 

1) 대소문자 구분

CREATE TABLE "myTest" (id CHAR(10)); 

2) 대소문자 구분 및 띄어쓰기

CREATE TABLE "my Test" (id CHAR(10)); 

 

위와 같이 ""안에 테이블명을 입력할 경우 대소문자가 구분되고, 띄어쓰기를 사용할 수 있게 된다.

 

 

[ ALTER ]

1. 테이블 수정

1) 테이블에 컬럼 추가

ALTER TABLE dept80
ADD	(job_id VARCHAR2(0) ); -- job_id컬럼추가

2) 테이블 기존 컬럼 삭제

ALTER TABLE dept80
MODIFY	(last_name VARCHAR2(30) ); -- 데이터타입,컬럼사이즈,기본값 등

3) 테이블 기존 컬럼에 제약조건 추가

ALTER TABLE emp2
ADD CONSTRAINT emp_mgr_fk			---emp_mgr_fk 이름으로 제약조건 추가
	FOREIGN KEY(manager_id)			-- manager_id컬럼을 외래키로 지정
    REFERENCES emp2(employee_id);	-- emp2테이블의 employee_id컬럼 참조

4) 테이블 제약조건 삭제

ALTER TABLE emp2
DROP	CONSTRAINT emp_mgr_fk;	---emp_mgr_fk이란 이름의 제약조건 삭제

 

[ DROP ]

1. 테이블 삭제

1) 테이블 삭제

1-1) 휴지통을 거치고 삭제

DROP TABLE emp2;

 

1-2) 휴지통을 거치지 않고 삭제 (PURGE키워드 추가)

DROP TABLE emp2 PURGE;

[ FLASHBACK ]

2) 플래쉬백 테이블

실수로 삭제 시 recyclebin으로부터 복원

 

2-1) 휴지통에서 기존이름, 마지막 동작, 삭제 시간 조회

SELECT original_name, operation, droptime FROM
recyclebin;

select * from tab; 으로 테이블을 조회했을 때 아래와 같이 이상한 이름의 테이블명이 보일 것이다. 이는 휴지통에 들어가있는 테이블을 뜻한다. 휴지통의 가용용량은 DB마다 설정마다 다를 수 있다.

BIN$veCJQvVBOgTgVbkzEzPhBQ==$0 
BIN$vj9KzAO5DMjgVbkzEzPhBQ==$0 
BIN$vj9KzAO9DMjgVbkzEzPhBQ==$0 

 

2-2) 복구

FLASHBACK TABLE emp2 TO BEFORE DROP;

[ TRUNCATE ]

1. 테이블 절단 (TRUNCATE)

- 테이블 구조는 남기고 모든 행 제거

* DDL구문이므로 ROLLBACK 불가

TRUNCATE TABLE <테이블이름>;

* DELETE 문과 차이

- DELETE는 테이블의 특정 행 삭제 또는 WHERE절 생략 시 모든 행 삭제

- DELETE는 DML(데이터 조작어)이나 TRUNCATE는 DDL(데이터 정의어)

- DELETE는 저장공간은 그대로이나 TRUNCATE는 저장공간 제거

- DELETE는 ROLLBACK이 가능하나  TRUNCATE는 ROLLBACK

 

* 프로그래머가 테이블 객체 자체는 필요하나 공간을 지우고 더 이상 새 데이터를 삽입할 필요없을 때 쓸 수 있다.

 

[ VIEW ]

뷰는 하나 이상의 Base table로 생성되나 물리적으로 존재하는 것은 아니다.

SELECT 구문형태로 정의만 되어있는 가상 논리적 테이블을 말한다.

 

  • 뷰의 장점
    - 특정 사용자에게 필요한 필드만 제공가능
    - 복잡한 쿼리 단순화
    - 쿼리 재사용 
  • 뷰의 단점
    - 한 번 정의된 뷰는 변경 불가
    - 삽입, 삭제, 갱신 작업에 제한 있음
    - 자신만의 인덱스를 가질 수 없음

1. 뷰 생성

1) 서브 쿼리 이용 

CREATE VIEW empvu80 AS
    SELECT employee_id, last_name, salary
    FROM employees
    WHERE department_id = 80;

구조 보기

desc empvu80;
이름          널?       유형           
----------- -------- ------------ 
EMPLOYEE_ID NOT NULL NUMBER(6)    
LAST_NAME   NOT NULL VARCHAR2(25) 
SALARY               NUMBER(8,2)  

2) 서브쿼리에 AS키워드 이용

CREATE VIEW salvu50 AS
    SELECT employee_id  id_number, 
    		last_name    name, 
            salary * 12    ann_salary
    FROM employees
    WHERE department_id = 50;

데이터 조회

select * from salvu50;
 ID_NUMBER NAME                      ANN_SALARY
---------- ------------------------- ----------
       120 Weiss                          96000
       121 Fripp                          98400
       122 Kaufling                       94800
  • 표현식이나 함수를 사용한 컬럼은 AS키워드 이용한 컬럼 앨리어스가 필요함.

 

2. 뷰 수정 (OR REPLACE)

VIEW의 생성구문에 OR REPLACE 키워드를 사용하는 경우 동일한 이름의 뷰가 없다면 그대로 생성되고 동일한 이름을 사용하는 뷰가 있다면 새롭게 정의하는 뷰의 내용으로 대체하는 동작을 하게된다.

 

1) AS 사용 (base table이 하나인 simple view)

  • 뷰에서 앨리어스 리스트를 작성한 경우 서브쿼리의 컬럼명보다 우선적으로 적용되어 뷰의 컬럼명으로 사용된다.
CREATE OR REPLACE VIEW empvu80 (
    id_number, name, sal, department_id
) AS
    SELECT employee_id, 
              first_name || ' ' || last_name, 
              salary, department_id
    FROM employees
    WHERE department_id = 80;

조회

ID_NUMBER NAME                                                  SAL DEPARTMENT_ID
---------- ---------------------------------------------- ---------- -------------
       145 John Russell                                        14000            80
       146 Karen Partners                                      13500            80
       147 Alberto Errazuriz                                   12000            80

2) JOIN, 함수 사용 (base table이 하나 이상인 complex view)

CREATE OR REPLACE VIEW dept_sum_vu (
    name, minsal, maxsal, avgsal
) AS
    SELECT d.department_name, MIN(e.salary), MAX(e.salary), AVG(e.salary)
    FROM employees e
    JOIN departments d ON ( e.department_id = d.department_id )
    GROUP BY d.department_name;

조회

NAME                               MINSAL     MAXSAL     AVGSAL
------------------------------ ---------- ---------- ----------
Administration                       4400       4400       4400
Accounting                           8300      12008      10154
Purchasing                           2500      11000       4150

3. 뷰 사용

select salary from employees where employee_id = 145;
    SALARY
----------
     14000

update 후 조회

UPDATE empvu80
SET
    sal = sal + 500
WHERE id_number = 145;
    SALARY
----------
     14500

insert 시 다음과 같이 제약이 따른다.

INSERT INTO empvu80 (
    employee_id, last_name, salary
) VALUES (
    80, 'test', 8000
);

NOT NULL컬럼이 있지만 해당 컬럼의 정보를 가진 뷰를 가지고 있지 않아 삽입할 수 없다.

명령의 99 행에서 시작하는 중 오류 발생 -
insert into empvu80 (employee_id, last_name, salary)
values (80, 'test', 8000)
오류 보고 -
ORA-01400: NULL을 ("HR"."EMPLOYEES"."EMAIL") 안에 삽입할 수 없습니다

4. 뷰 삭제

DROP VIEW empvu80;

 

[ SEQUENCE ]

자동으로 고유 번호를 반환하는 오브젝트

 

1. 시퀀스 생성

CREATE SEQUENCE dept_deptid_seq2 
INCREMENT BY 10
START WITH 120 
MAXVALUE 9999 
NOCACHE 
NOCYCLE;

옵션

  • INCREMENT BY 생성할 숫자의 증감 간격을 설정하는 옵션절
  • START WITH 숫자 생성을 시작할 값을 설정
  • MAXVALUE 최대값 지정
    NOMAXVALUE 최대값 지정하지 않음 10^27
  • MINVALUE 최소값 지정
    NOMINVALUE 최소값 지정하지 않음 -(10^26)
  • CYCLE 최대|최소값 도달 시 초기화
    NOCYCLE 한계값 도달 시 멈춤

CACHE 미리 지정된 개수의 값을 생성 기본값
NOCACHE 값을 미리 생성하지 않음. 권장하지 않음

 

2. 시퀀스 사용

아래 쿼리 조회 시 INCREMENT BY만큼 증가한다.

select dept_deptid_seq.nextval
from dual;

INSERT 활용

INSERT INTO departments (
    department_id, department_name
) VALUES (
    dept_deptid_seq.NEXTVAL, 'LAST'
);

alter sequence

  • start with 를 제외한 나머지 옵션은 수정 가능

 

'DB' 카테고리의 다른 글

[오라클 DB] 일반 함수/그룹함수  (0) 2021.03.10
[오라클 DB] 함수-숫자  (0) 2021.03.10
[오라클 DB] 함수-문자)  (0) 2021.02.26
[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
728x90

NVL

  • 컬럼의 NULL 값을 실제값으로 대체해서 출력해주는 함수

  • NULL값이 아닌 행은 원래 값을 출력하고 NULL을 가진 행에서만 대체값으로 결과를 출력한다.

  • 기존의 데이터와 NULL의 대체값이 같은 행에 출력되기 때문에 대체값도 컬럼의 데이터 타입과 동일해야한다.

SQL> SELECT commission_pct, NVL(commission_pct, 0)
  2  FROM employees;
(...)
COMMISSION_PCT NVL(COMMISSION_PCT,0)
-------------- ---------------------
            .2                    .2
           .15                   .15
            .1                    .1
                                   0
                                   0
(...)

NVL2

  • NULL값의 여부에 따라 간접적으로 결과를 연산하는 함수

  • NVL2(NULL여부를 판단할 컬럼, NULL값이 아닌경우 출력값, NULL값인 경우 출력값)

  • 2,3번째 인자가 값이 함수의 출력 결과가 되므로 데이터 타입이 통일되어야 한다.

 

NULLIF

만약(if) 첫번째 인자와 두번째 인자값을 비교해서 같으면 NULL, 다르면 첫번째인자값을 출력하는 함수

SQL> select first_name, length(first_name) "expr1", 
  2  last_name, LENGTH(last_name) "expr2", 
  3  nullif(length(first_name), length(last_name)) result 
  4  from employees; 

FIRST_NAME   expr1 LAST_NAME        expr2  RESULT 
-------------------- ---------- ------------------------- ---------- ---------- 
Ellen       5 Abel    4       5 
Sundar       6 Ande    4       6 
Mozhe       5 Atkinson    8       5 

 

COALESCE

  • 여러 대체값을 줄 수 있는 함수.

  • NULL값이 아닌 첫 대체값이 출력된다.

즉 널이 아닌 값을 찾아 출력하는 식이다. ( a가 널이고 b가 널이면 널이아닌 c출력)

SQL> SELECT last_name, employee_id,
  2  COALESCE(TO_CHAR(commission_pct), TO_CHAR(manager_id), 'No commission and No manager')
  3  FROM employees;


LAST_NAME                 EMPLOYEE_ID COALESCE(TO_CHAR(COMMISSION_PCT),TO_CHAR
------------------------- ----------- ----------------------------------------
King                              100 No commission and No manager
Kochhar                           101 100
De Haan                           102 100
Hunold                            103 102
Ernst                             104 103
Austin                            105 103
(...)

사장(king)은 커미션과 매니저 아이디가 없어서 마지막 인자의 값이 출력된 걸 알 수 있다.

 

 

ex) 사원들 이름과 커미션을 출력하되, 커미션 없는 사람은 No Commission출력하기

NVL 함수 이용

SQL> select last_name, nvl(to_char(commission_pct), 'No Commission')
  2  from employees;
(...)
LAST_NAME		  COMM
------------------------- ----------------------------------------
Livingston		  .2
Grant			  .15
Johnson 		  .1
Taylor			  No Commission
Fleaur			  No Commission
Sullivan		  No Commission
(...)

COALESCE 함수 이용

  1  select last_name,
  2  coalesce(to_char(commission_pct), 'No Commission') COMM
  3* from employees

 

 

그룹 함수(여러 행 함수)

  • 그룹 단위로 연산하는 함수

  • GROUP BY절을 통해서 그룹을 나누지 않았다면 테이블의 행 전체가 하나의 그룹

  • 그룹 함수는 연산에서 NULL값을 제외하고 연산한 결과를 출력


숫자 데이터 입력 함수

AVG([DISTINCT|ALL] n) 평균

STDDEV([DISTINCT|ALL] n) 표준편차

VARIANCE([DISTINCT|ALL] n) 분산

SUM([DISTINCT|ALL] n) 합계

 

___ : 기본 옵션

 

ex) 월급의 각 항목별 연산

SQL> SELECT AVG(salary), STDDEV(salary), VARIANCE(salary), SUM(salary)
  2  FROM employees;


AVG(SALARY) STDDEV(SALARY) VARIANCE(SALARY) SUM(SALARY)
----------- -------------- ---------------- -----------
 6461.83178     3909.57973       15284813.7      691416

ex) distinct로 중복제외한 연산

SQL> select avg(distinct salary), avg(salary) from employees;

AVG(DISTINCTSALARY) AVG(SALARY)
------------------- -----------
	 7067.37931  6461.83178

 

모든 데이터를 연산하는 함수

COUNT(*|[DISTINCT|ALL] expr) 행 개수 카운트

MAX([DISTINCT|ALL] expr) 최대값

MIN([DISTINCT|ALL] expr) 최소값

 

ex) 커미션을 받는 사원이 35명뿐이기 때문에(null값이 아닌 레코드) salary의 count와 값이 다름을 알 수 있다.

SQL> select count(*) from employees;

  COUNT(*)
----------
       107
SQL> select count(salary), max(salary), min(salary) from employees;

COUNT(SALARY) MAX(SALARY) MIN(SALARY)
------------- ----------- -----------
	  107	    24000	 2100

SQL> select count(commission_pct), max(hire_date), min(employee_id) from employees;

COUNT(COMMISSION_PCT) MAX(HIRE_ MIN(EMPLOYEE_ID)
--------------------- --------- ----------------
		   35 21-APR-08 	     100

 

GROUP BY 절 결합

ex) 그룹별 카운트

 

  1  select department_id, COUNT(*), AVG(SALARY)
  2  from employees
  3* group by department_id

DEPARTMENT_ID	COUNT(*) AVG(SALARY)
------------- ---------- -----------
	  100	       6  8601.33333
	   30	       6	4150
       (...)

 

'DB' 카테고리의 다른 글

[오라클DB] DDL  (0) 2021.03.24
[오라클 DB] 함수-숫자  (0) 2021.03.10
[오라클 DB] 함수-문자)  (0) 2021.02.26
[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
728x90

[숫자함수]

ROUND : 반올림

TRUNC : 버림

MOD : 나머지

 

예) 숫자 함수와 표현식 응용

1600/300으로 표현식을 쓰면 정수가 아닌 5.33333333의 결과가 출력된다. 이 때는 TRUNC를 통해 소수점을 버릴 수 있다.

SQL> select round(45.926, 2), trunc(45.926, 2), mod(1600, 300), trunc(1600/300, 0)
  2  from dual;

ROUND(45.926,2) TRUNC(45.926,2) MOD(1600,300) TRUNC(1600/300,0)
--------------- --------------- ------------- -----------------
	  45.93 	  45.92 	  100		      5

예) ROUND함수에 0이하의 숫자를 두번째 인자에 써서 반올림할 수도 있다.

아래 45에서 일의 자리가 0, 십의 자리가 -1 이며 이 이하의 값 (에 : -2)을 지정하면 결과값이 0으로 출력된다.

SQL> select round(45.926, -1)
  2  from dual;

ROUND(45.926,-1)
----------------
	      50

SQL> select round(45.926, 0)
  2  from dual;

ROUND(45.926,0)
---------------
	     46
         
SQL> select round(45.926, -2) from dual;

ROUND(45.926,-2)
----------------
	       0

두번째 인자를 생략하면  (    ,  0 ) 으로 지정한 것과 같다.

 

 

예) 인상급여와 증가분을 구하는 예제 (소수점 첫째자리 반올림)

SQL> select employee_id, last_name, salary,
  2  round (salary*1.155) "New Salary",
  3  round (salary*1.155 - salary) Increase
  4  from employees;

EMPLOYEE_ID LAST_NAME			  SALARY New Salary   INCREASE
----------- ------------------------- ---------- ---------- ----------
	100 King			   24000      27720	  3720
	101 Kochhar			   17000      19635	  2635
	102 De Haan			   17000      19635	  2635
	103 Hunold			    9000      10395	  1395
	104 Ernst			    6000       6930	   930
	105 Austin			    4800       5544	   744
	106 Pataballa			    4800       5544	   744

 

 

SQL> select to_number('24,900.55', '99,999.99') from dual;

TO_NUMBER('24,900.55','99,999.99')
----------------------------------
  24900.55

'DB' 카테고리의 다른 글

[오라클DB] DDL  (0) 2021.03.24
[오라클 DB] 일반 함수/그룹함수  (0) 2021.03.10
[오라클 DB] 함수-문자)  (0) 2021.02.26
[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
728x90

레퍼런스 (오라클 12.2) :

docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Functions.html#GUID-D079EFD3-C683-441F-977E-2C9503089982

 

SQL Language Reference

 

docs.oracle.com

 

concat (문자열 결합)

SQL> select concat('Hello', 'World')
  2  from dual;

CONCAT('HE
----------
HelloWorld

 

substr (문자열 자르기)

SQL> select substr('HelloWorld', 1, 5)
  2  from dual;

SUBST
-----
Hello

substr ('자를문자열', 시작인덱스(1부터시작), 자를 문자열 수)

 

시작인덱스는 문자열 끝부터 역순세기도 지원한다. (끝자리가 -1)

SQL> select substr('HelloWorld', -3, 3)
  2  from dual;

SUB
---
rld

자를 문자열 수는 왼쪽에서 오른쪽 방향으로만 지원한다. 따라서 아래와 같은 방법으론 원하는 결과(rld출력)가 나오지 않는다.

SQL> select substr('HelloWorld', -1, 3)
  2  from dual;

S
-
d
SQL> select substr('HelloWorld', -1, -3)
  2  from dual;

S
-

substr함수를 where절에 응용

SQL> select last_name, hire_date
  2  from employees
  3  where substr(hire_date, -2, 2) = '04';

LAST_NAME		  HIRE_DATE
------------------------- ---------
Weiss			  18-JUL-04
Mallin			  14-JUN-04
Russell 		  01-OCT-04
(...)

 

length (문자열 길이 구하기)

SQL> select length('helloworld') * 7 + 2
  2  from dual;

LENGTH('HELLOWORLD')*7+2
------------------------
		      72

helloworld의 길이는 10이므로 10 x 7 + 2의 연산이 이루어져 72가 출력된다.

 

instr (문자열 인덱스 찾기)

레퍼런스 : docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/INSTR.html#GUID-47E3A7C4-ED72-458D-A1FA-25A9AD3BE113

 

SQL Language Reference

 

docs.oracle.com

문법

{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])

|   = or
[   = option
(전체문자열, 찾고싶은 문자열 [, 해당인덱스부터 검색 [, 찾은 문자열 여러개면 n번째 나타나는 문자열인지 지정 ] ])

 

반환값은 찾은 인덱스 (정수)

 

예)

SQL> select instr('hello', 'l')
  2  from dual;

INSTR('HELLO','L')
------------------
		 3

예) substr과 결합해 응용

SQL> select substr('helloworld', instr('helloworld', 'h'), 4)
  2  from dual;

SUBS
----
hell

예)

SELECT INSTR('CORPORATE FLOOR','OR', 3, 2) "Instring"
  2    FROM DUAL;

  Instring
----------
	14

위의 INSTR 함수의 3번째 인자는 "찾기 시작할 인덱스", 4번째 인자는 "두번째로 찾은 문자열"

 

max (최대 길이 구하기)

예) last_name컬럼 데이터의 최대길이 구하기

SQL> select max(length(last_name))
  2  from employees;

MAX(LENGTH(LAST_NAME))
----------------------
		    11

 

lpad, rpad

(길이가 n이 되도록 문자식으로 채운 표현식 반환.

lpad는 왼쪽부터, rpad는 오른쪽부터 채움)

예)

SQL> select lpad(salary, 10, '*') as lpad, rpad(salary, 10, '*') as rpad
  2  from employees;

LPAD		     RPAD
-------------------- --------------------
*****24000	     24000*****
*****17000	     17000*****
*****17000	     17000*****
(...)

암시적 형변환하여 숫자값을 문자값으로 변환하여 결과 출력

 

예) 왼쪽에 공백을 넣어 정렬 맞추기

SQL> select lpad(last_name, 11, ' ') || ' is babo. '
  2  from employees;

LPAD(LAST_NAME,11,'')||'ISBABO.'
------------------------------------------------------
       Abel is babo.
       Ande is babo.
   Atkinson is babo.
     Austin is babo.

 

replace (문자열 치환)

SQL> select replace('jack and jue', 'j', 'bl')
  2  from dual;

REPLACE('JACKA
--------------
black and blue

TRIM

  • 입력받은 문자열 양쪽 끝의 지정 문자 제거

SQL> SELECT TRIM(' ' FROM '     HelloWorld    ')
  2  FROM dual;
  
TRIM(''FRO
----------
HelloWorld

'     HelloWorld    '의 양끝에서 ' ' 가 제거된 모습

 

 

'DB' 카테고리의 다른 글

[오라클 DB] 일반 함수/그룹함수  (0) 2021.03.10
[오라클 DB] 함수-숫자  (0) 2021.03.10
[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
[오라클 DB] DQL  (0) 2021.02.03
728x90

SELECT 구문

문자열 결합 (  | | )

 

리터럴 문자는 작은 따옴표로 감싼다 ( '  ' )

SQL> select last_name || '___' || job_id as "employees"
  2* from employees

employees
--------------------------------------
Abel___SA_REP
Ande___SA_REP
Atkinson___ST_CLERK

 

DISTINCT 키워드

중복된 값을 제거 후 조회하며 NULL값도 하나의 값이기 때문에 조회 시 나옴

SQL> select distinct department_id
  2  from employees;

DEPARTMENT_ID
-------------
          100
           30

           90

 

문자열 비교

: 왼쪽부터 한글자씩 아스키코드 비교. 문자열 크기에 관계없이 첫번째 문자를 비교하여 결과 출력.

(오름차순/사전순의 비교)

아스키 값은 인코딩에 따라 다르고 문자열 비교는 사전의 우선 순위를 생각하면 된다. ( Aa...Ab...)

SQL> select last_name, salary from employees where ASCII(last_name) <= 67
  2  order by last_name;

LAST_NAME		      SALARY
------------------------- ----------
Abel			       11000
(...)

LAST_NAME		      SALARY
------------------------- ----------
Bloom			       10000
Bull				4100
Cabrio				3000
Cambrault		       11000
(...)
19 rows selected.

위의 WHERE절에서 <= 'C' 로 조회해도 된다.

 

 

BETWEEN키워드

예) C로 시작하는 이름의 사원

SQL> select last_name from employees where last_name between 'C' and 'D';

LAST_NAME
-------------------------
Cabrio
Cambrault
Cambrault
Chen
Chung
Colmenares

6 rows selected.

예) 고용일 04년도인 사원 검색

SQL> select last_name, hire_date
  2  from employees
  3  where hire_date between '01-JAN-04' AND '31-DEC-04';

LAST_NAME		  HIRE_DATE
------------------------- ---------
Weiss			  18-JUL-04
Mallin			  14-JUN-04
Russell 		  01-OCT-04

IN 키워드

SQL> select manager_id, last_name from employees where manager_id IN (100, 101, 201);

MANAGER_ID LAST_NAME
---------- -------------------------
       100 Kochhar
       100 De Haan
      (...)
MANAGER_ID LAST_NAME
---------- -------------------------
       (...)
       101 Greenberg
       101 Whalen
       (...)
       201 Fay

20 rows selected.

LIKE 키워드

패턴 연산자라고도 함

_ : 한자리의 임의문자

% : n자리의 임의문자 (0 포함)

 

예) 한자리 임의문자 뒤에 o가 들어가는 임의길이 문자열 조건으로 검색

SQL> select last_name from employees where last_name LIKE '_o%';

LAST_NAME
-------------------------
Colmenares
Doran
Fox
Johnson
(...)

12 rows selected.

예) 3번째 문자가 g인 임의길이 문자열 조건으로 검색

SQL> select last_name from employees where last_name LIKE '__g%';

LAST_NAME
-------------------------
Higgins
Rogers

예) 문자열 길이가 3이고 두번째 문자가 o인 문자열 조건으로 검색

SQL> select last_name from employees where last_name LIKE '_o_';

LAST_NAME
-------------------------
Fox

예) 10일날 입사한 사람 검색 (DATE : 일-월-년도)

SQL> select hire_date from employees where hire_date LIKE '15%';

HIRE_DATE
---------
15-NOV-06
15-MAR-06
15-OCT-07
15-DEC-05

예) 04년도 입사한 사람 검색

SQL> select last_name, hire_date
  2  from employees
  3  where hire_date LIKE '%04';

LAST_NAME		  HIRE_DATE
------------------------- ---------
Weiss			  18-JUL-04
Mallin			  14-JUN-04
Russell 		  01-OCT-04
(...)

10 rows selected.

 

예) 급여 두번째 자리가 7이면서 4자리의 급여를 갖는 사원 검색

데이터 타입과 상관없이 ' ' 로 검색가능 (이에 대한 내용은 함수파트에서 다룸)

SQL> select salary from employees where salary LIKE '_700';

    SALARY
----------
      7700
      2700
      2700

 

IS 키워드

예) 매니저 아이디에 값이 없는 컬럼을 조회 (사장=king)

SQL> select last_name, manager_id from employees where manager_id IS NULL;

LAST_NAME		  MANAGER_ID
------------------------- ----------
King

SQL> select last_name, manager_id from employees where manager_id = NULL;

no rows selected

위 결과를 보면 = 연산자로는 올바른 쿼리 결과를 볼 수 없음을 알 수 있다.

 

예) 커미션 안 받는 사원, salary 기준 내림차순 정렬

SQL> select last_name, salary, commission_pct
  2  from employees
  3  where commission_pct IS NULL
  4  order by salary desc;

 

AND, OR 키워드

SQL> select employee_id, last_name, job_id, salary
  2  from employees
  3  where salary >= 10000 AND job_id like '%MAN%';

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	114 Raphaely		      PU_MAN	      11000
	145 Russell		      SA_MAN	      14000
	146 Partners		      SA_MAN	      13500
	147 Errazuriz		      SA_MAN	      12000
	148 Cambrault		      SA_MAN	      11000
	149 Zlotkey		      SA_MAN	      10500
	201 Hartstein		      MK_MAN	      13000

7 rows selected.

SQL> select employee_id, last_name, job_id, salary
  2  from employees
  3  where salary >= 10000 OR job_id like '%MAN%';

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	100 King		      AD_PRES	      24000
	101 Kochhar		      AD_VP	      17000
	102 De Haan		      AD_VP	      17000
	108 Greenberg		      FI_MGR	      12008
	114 Raphaely		      PU_MAN	      11000
SQL> select employee_id, last_name, job_id, salary
  2  from employees
  3  where job_id LIKE '%MAN%' OR job_id LIKE '%REP%' AND salary >= 10000;

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	114 Raphaely		      PU_MAN	      11000
	120 Weiss		      ST_MAN	       8000
	121 Fripp		      ST_MAN	       8200
	122 Kaufling		      ST_MAN	       7900
	123 Vollman		      ST_MAN	       6500
	124 Mourgos		      ST_MAN	       5800
	145 Russell		      SA_MAN	      14000
	146 Partners		      SA_MAN	      13500
	147 Errazuriz		      SA_MAN	      12000
	148 Cambrault		      SA_MAN	      11000
	149 Zlotkey		      SA_MAN	      10500

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	150 Tucker		      SA_REP	      10000
	156 King		      SA_REP	      10000
	162 Vishney		      SA_REP	      10500
	168 Ozer		      SA_REP	      11500
	169 Bloom		      SA_REP	      10000
	174 Abel		      SA_REP	      11000
	201 Hartstein		      MK_MAN	      13000
	204 Baer		      PR_REP	      10000

19 rows selected.
SQL> select employee_id, last_name, job_id, salary
  2  from employees
  3  where job_id LIKE '%MAN%' OR job_id LIKE '%REP%' AND salary >= 10000;

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	114 Raphaely		      PU_MAN	      11000
	120 Weiss		      ST_MAN	       8000
	121 Fripp		      ST_MAN	       8200
	122 Kaufling		      ST_MAN	       7900
	123 Vollman		      ST_MAN	       6500
	124 Mourgos		      ST_MAN	       5800
	145 Russell		      SA_MAN	      14000
	146 Partners		      SA_MAN	      13500
	147 Errazuriz		      SA_MAN	      12000
	148 Cambrault		      SA_MAN	      11000
	149 Zlotkey		      SA_MAN	      10500

EMPLOYEE_ID LAST_NAME		      JOB_ID	     SALARY
----------- ------------------------- ---------- ----------
	150 Tucker		      SA_REP	      10000
	156 King		      SA_REP	      10000
	162 Vishney		      SA_REP	      10500
	168 Ozer		      SA_REP	      11500
	169 Bloom		      SA_REP	      10000
	174 Abel		      SA_REP	      11000
	201 Hartstein		      MK_MAN	      13000
	204 Baer		      PR_REP	      10000

19 rows selected.

연산자 우선 순위는 아래와 같다. 따라서 위에서 원하는 결과를 조회하기 위해선 괄호 ( ) 를 통해 우선순위를 변경가능

AND > OR

 

NOT 키워드

SQL> select last_name, job_id, salary, commission_pct from employees
  2  where commission_pct IS NOT NULL;

LAST_NAME		  JOB_ID	 SALARY COMMISSION_PCT
------------------------- ---------- ---------- --------------
Russell 		  SA_MAN	  14000 	    .4
Partners		  SA_MAN	  13500 	    .3
(...)

 

ORDER BY

기본 asc(오름차순)이고 내림차순은 desc

예) by 절 뒤에 컬럼명이 아닌 컬럼 인덱스로 지정하는 경우

 

SQL> select last_name, job_id, department_id, hire_date
  2  from employees
  3  order by 3;

LAST_NAME		  JOB_ID     DEPARTMENT_ID HIRE_DATE
------------------------- ---------- ------------- ---------
Whalen			  AD_ASST		10 17-SEP-03
Hartstein		  MK_MAN		20 17-FEB-04
Fay			  MK_REP		20 17-AUG-05
Raphaely		  PU_MAN		30 07-DEC-02
(...)

위는 3번째 컬럼인 DEPARTMENT_ID를 기준으로 오름차순 정렬 조회된 결과

 

예 ) order by절에 두 개의 컬럼을 지정하는 경우

SQL> select last_name, department_id, salary
  2  from employees
  3  order by department_id, salary desc;

LAST_NAME		  DEPARTMENT_ID     SALARY
------------------------- ------------- ----------
Whalen				     10       4400
Hartstein			     20      13000
Fay				     20       6000
Raphaely			     30      11000
Khoo				     30       3100
Baida				     30       2900
Tobias				     30       2800
Himuro				     30       2600
Colmenares			     30       2500
Mavris				     40       6500
Fripp				     50       8200
(...)

부서id로 1차 정렬, 급여로 2차 정렬(내림차순) 정렬된 결과

'DB' 카테고리의 다른 글

[오라클 DB] 함수-숫자  (0) 2021.03.10
[오라클 DB] 함수-문자)  (0) 2021.02.26
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
[오라클 DB] DQL  (0) 2021.02.03
MongoDB 기본  (0) 2021.01.30
728x90

livesql.oracle.com/

 

Oracle Live SQL

704,213 scripts, 3,601 likes, 1,025 public scripts, 8,521 new scripts created in the last 7 days.

livesql.oracle.com

가입이 필요하다. 가입 시 메일이 늦게 오는 경우도 있으니 여유있게 기다려주자

 

로그인 후 화면 좌측 상단 메뉴 항목 선택

 

 

  • code library

 

 






'DB' 카테고리의 다른 글

[오라클 DB] 함수-문자)  (0) 2021.02.26
[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] DQL  (0) 2021.02.03
MongoDB 기본  (0) 2021.01.30
[오라클 DB] 유저관리, DCL  (0) 2021.01.12
728x90

DQL(데이터 질의어)

  • 데이터베이스에 데이터를 조회할 때 사용하는 문법

키워드

  • SQL 문법에서 기능이 미리 할당되어 있는 예약어

 

SELECT 조회할 테이블의 컬럼 리스트 작성

FROM 조회할 테이블을 명시

 

키워드 + 요소 -> 절

SELECT + 컬럼리스트 -> SELECT절

FROM + 테이블명 -> FROM절

 

절 + 절 -> 문법

SELECT절 + FROM절 + 옵션절 -> SELECT구문

 

문법 기호

*(Asterisk) SELECT절에 단독으로 사용 시 : 모든 컬럼 출력

 

 

SELECT 구문

- 표현식(expression)

SQL> select last_name, salary, 12*salary+100
  2  from employees;

LAST_NAME                     SALARY 12*SALARY+100
------------------------- ---------- -------------
King                           24000        288100
Kochhar                        17000        204100
De Haan                        17000        204100

위의 구문 중 12*salary+100이 표현식 

서브쿼리 구문으로 테이블 조회

select last_name AS name, -- AS키워드 사용하여 last_name을 name으로 명명하여 조회
commission_pct comm -- AS키워드 사용하지 않고 한칸 띄우고 적어도 위와 동일
from employees;

 

표현식(expression)

컬럼의 값과 숫자를 사칙연산을 사용하여 결과를 연산하는 문법

 

테이블과 연관없는 표현식 조회도 가능

SQL> select department_id, 1+2
  2  from departments;

DEPARTMENT_ID        1+2
------------- ----------
           10          3
           20          3

 

공백,대소문자 구분해 AS 키워드 사용하고 싶을 시 큰 따옴표(" ")로 묶어서 사용

SQL> select last_name as "Name", salary*12 "Annual Salary"
  2  from employees;

Name                      Annual Salary
------------------------- -------------
King                             288000
Kochhar                          204000

NULL값

  • 테이블의 데이터를 입력 시 컬럼에 값을 입력하지 않으면 들어가게되는 값
  • 테이블의 설정에 따라 다른 대체값이 들어갈 수도 있음.
  • 표현식에 사용된 경우 NULL값이 포함된 컬럼의 경우 NULL값이 나온 행에서는 표현식의 내용과는 상관없이 연산결과가 NULL값으로 출력된다.

 

  • 아래의 예문도 commission_pct 컬럼의 값이 NULL값인 경우 표현식 전체의 값이 NULL로 출력
SQL> SELECT last_name, commission_pct, salary*12 + salary*12*commission_pct
  2  FROM employees;

NULL값이 포함되어 있어 조회결과가 NULL

LAST_NAME                 COMMISSION_PCT SALARY*12+SALARY*12*COMMISSION_PCT
------------------------- -------------- ----------------------------------
King
Kochhar
De Haan
Hunold

 

문자열 결합 (  | | )

 

리터럴 문자는 작은 따옴표로 감싼다 ( '  ' )

SQL> select last_name || '___' || job_id as "employees"
  2* from employees

employees
--------------------------------------
Abel___SA_REP
Ande___SA_REP
Atkinson___ST_CLERK

 

DISTINCT 키워드

중복된 값을 제거 후 조회하며 NULL값도 하나의 값이기 때문에 조회 시 나옴

SQL> select distinct department_id
  2  from employees;

DEPARTMENT_ID
-------------
          100
           30

           90

 

'DB' 카테고리의 다른 글

[오라클 DB] DQL 심화학습  (0) 2021.02.19
[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
MongoDB 기본  (0) 2021.01.30
[오라클 DB] 유저관리, DCL  (0) 2021.01.12
[오라클 DB] DB접속 및 DCL  (0) 2021.01.05
728x90

개요

Humongous (거대한)

몽고DB는 2007년 발표한 NoSQL 모델로 문서 기반 DB중 가장 많이 쓰임 (글작성기준)

NoSQL DB 타입

데이터 모델 설계 방식에 따라 아래 모델로 나뉨

Document / Key-value / Column / Graph

 

 

MongoDB 특징

1. 문서지향 데이터베이스 (내장문서와 배열사용, 복잡한 계층관계를 하나로 표현)

2. 문서 필드값 미리 정의안함 (고정된 스키마 없으므로 필드추가 제거 쉬움)

3.  데이터 분산을 쉽게 함 (문서 자동재분배, 사용자 요청을 적합서버에 라우팅하므로 여러서버에 쉽게 분산가능)

 

관계형 DB와의 비교

관계형 Mongo
테이블 콜렉션
문서
컬럼 필드

MongoDB의 문서

문서의 개념

Document : MongoDB 데이터 기본 단위, 정렬된 필드와 연결된 값의 집합

문서의 특성

동일한 필드명이 필요하지 않으며 동일한 필드명이라도 자료형이 동일하지 않아도 됨

문서의 예

JSON과 유사

{
	name : "dong-su",
    age : 17
}

MongoDB의 콜렉션

콜렉션의 개념

Collection : 문서들의 모음

콜렉션의 특성

동적 스키마를 가짐 (하나의 콜렉션 내 문서들이 모든 다른 구조를 가질 수 있다)

이름으로 식별 가능

콜렉션의 예시

{ 
	name : "dong-su",
    age : 17 
}
{ 
	type : ["user", "admin"]
}

콜렉션 이름 생성 규칙

1. _ 또는 문자로 시작

2. $ 또는 \0 (NULL) 을 포함할 수 없음

3. 빈 문자열 ("")은 사용불가

4. system. 으로 시작 불가 (내부적 예약어)

 

MongoDB의 데이터베이스

데이터베이스 개념 (MongoDB에서의)

Database : 하나 이상의 Collection 포함

데이터베이스 특성

각각의 DB가 자체 권한 가짐, 분리된 파일로 저장

이름으로 식별

데이터베이스 이름 생성 규칙

1. 빈문자 사용불가

2. 특정 문자열 포함불가

윈도우 :   /₩, " $ * < > : | ? 
리눅스 :  /₩, " $

 

설치 실행 및 테스트는

https://www.mongodb.com/try/download/community

에서 설치파일을 받아 full로 설치

 

고급시스템 설정에서 시스템변수 path 에 C:\Program Files\MongoDB\Server\4.4\bin 등록 (버전마다 경로다를수있음)

 

cmd에서 mongo 입력하면 실행가능

 

또는 MongoDB Compass를 이용해 connect하여 gui환경에서 손쉽게 관리가능

'DB' 카테고리의 다른 글

[오라클 DB] 온라인에서 Oracle SQL 테스트하기  (0) 2021.02.19
[오라클 DB] DQL  (0) 2021.02.03
[오라클 DB] 유저관리, DCL  (0) 2021.01.12
[오라클 DB] DB접속 및 DCL  (0) 2021.01.05
[오라클 DB] 설치 및 접속  (0) 2017.07.08
728x90

1. User 생성

- create user 권한 소유자가 DB에 User 생성가능

SQL> conn sys/oracle as sysdba	--- 관리자 계정 로그인
SQL> create user demo	-- demo이름의 user계정생성
	identified by demo; -- pw는 demo로 설정
SQL> conn demo/demo		--- id/pw가 demo/demo인 계정으로 접속

2. 권한 유형

- System권한 : DB조작권한 (소유자 DBA)

- Object 권한 : 오브젝트 조작권한 (소유자 Object 소유자)

* 테이블, 인덱스, 뷰, 시노님, 시퀀스를 객체 (또는 오브젝트) 라고 한다.

 

3. System 권한

- DB 조작권한으로 System 권한종류는 약 100여개

CREATE USER : 데이터 베이스 유저 생성 권한
CREATE SESSION : 데이터베이스 접속 권한
CREATE TABLE : 테이블 생성 권한
CREATE VIEW : view 생성 권한
CREATE SEQUENCE : sequence 생성 권한
SYSDBA : 데이터베이스 관리 최고 권한

(...등등)

- SYSDBA가 모든 System권한 소유, SYSOPER는 관리권한 소유

 

DCL(Data Control Language)

데이터의 보안, 무결성, 회복, 병행 제어 등을 정의하는데 사용되는 언어

 

GRANT : 권한 부여를 위한 명령어

 

REVOKE : 권한 취소를 위한 명령어

 

 

사용자 등급 지정

1
GRANT 사용자등급 TO 사용자id리스트[IDENTIFIED BY 암호];
cs

 

사용자 등급 해제

1
REVOKE 사용자등급 FROM 사용자id리스트;
cs

 

테이블 및 속성에 대한 권한 부여 

1
GRANT 권한종류 ON 개체 TO 사용자 [WITH GRANT OPTION];
cs

* WITH GRANT OPTION : 부여받은 권한을 다른 사용자에게도 부여할 수 있는 권한을 부여

 

테이블 및 속성에 대한 권한 취소

1
REVOKE [GRANT OPTION FOR] 권한종류 ON 개체 FROM 사용자 [CASCADE];
cs

* GRANT OPTION FOR : 다른 사용자에게 권한을 부여할 수 있는 권한을 취소

* CASCADE : 권한 취소 시, 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연속적(CASCADE)으로 취소

 

* 자신에게 특정 권한이 없어지면 다른 사용자에게 그 권한을 부여할 수 없다.

REVOKE UPDATE ON 수강 FROM 김민희 CASCADE; 라고 명령을 내리면 '김민희' 사용자에게 UPDATE권한이 없어짐과 함께 다른 사용자에게 권한을 부여할 수 있는 권한, 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연속적으로 취소된다.

 

* 다음에 주의

REVOKE GRANT OPTION FOR INSERT ON 강좌 FROM 김철수; 라고 하면 '김철수' 사용자의 INSERT 권한은 유지하면서 다른 사용자에게 권한을 부여할 수 있는 권한만 취소하는 것이다.

 

REVOKE GRANT OPTION FOR UPDATE ON 강좌 FROM 김철수 CASCADE;

 '임꺽정'  유저에게 부여한 <강좌> 테이블의 권한 중 UPDATE 권한을 다름 사람에게 부여할 수 있는 권한과 이미 다른 사람에게 부여했던 권한도 함께 취소하며, 임꺽정 자신은 UPDATE 권한을 유지한다.

 

 

 

'DB' 카테고리의 다른 글

[오라클 DB] DQL  (0) 2021.02.03
MongoDB 기본  (0) 2021.01.30
[오라클 DB] DB접속 및 DCL  (0) 2021.01.05
[오라클 DB] 설치 및 접속  (0) 2017.07.08
데이터 베이스 기초  (0) 2017.06.14
728x90

0. DB 시작 및 로그인

  • 리스너 서비스 실행
  • 리스너 : DB의 원격접속 요청을 받는 서비스로 해당 서비스가 꺼져 있으면 원격 접속이 불가

$ lsnrctl start

 

 

  • DB 접속 도구 SQLPLUS 접속

$ sqlplus /nolog

  • 오라클 DB 시작/종료 권한을 가진 sys 계정으로 로그인

$ connect sys/oracle as sysdba 

 

 

  • DB 시작

$ startup

 

  • 학습용 계정(hr) 접속

$ connect hr/hr

 

 

 

DCL(Data Control Language)

데이터의 보안, 무결성, 회복, 병행 제어 등을 정의하는데 사용되는 언어

 

GRANT : 권한 부여를 위한 명령어

 

REVOKE : 권한 취소를 위한 명령어

 

 

사용자 등급 지정

1

GRANT 사용자등급 TO 사용자id리스트[IDENTIFIED BY 암호];

cs

 

사용자 등급 해제

1

REVOKE 사용자등급 FROM 사용자id리스트;

cs

 

테이블 및 속성에 대한 권한 부여 

1

GRANT 권한종류 ON 개체 TO 사용자 [WITH GRANT OPTION];

cs

* WITH GRANT OPTION : 부여받은 권한을 다른 사용자에게도 부여할 수 있는 권한을 부여

 

테이블 및 속성에 대한 권한 취소

1

REVOKE [GRANT OPTION FOR] 권한종류 ON 개체 FROM 사용자 [CASCADE];

cs

* GRANT OPTION FOR : 다른 사용자에게 권한을 부여할 수 있는 권한을 취소

* CASCADE : 권한 취소 시, 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연속적(CASCADE)으로 취소

 

* 자신에게 특정 권한이 없어지면 다른 사용자에게 그 권한을 부여할 수 없다.

REVOKE UPDATE ON 수강 FROM 김민희 CASCADE; 라고 명령을 내리면 '김민희' 사용자에게 UPDATE권한이 없어짐과 함께 다른 사용자에게 권한을 부여할 수 있는 권한, 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연속적으로 취소된다.

 

* 다음에 주의

REVOKE GRANT OPTION FOR INSERT ON 강좌 FROM 김철수; 라고 하면 '김철수' 사용자의 INSERT 권한은 유지하면서 다른 사용자에게 권한을 부여할 수 있는 권한만 취소하는 것이다.

 

REVOKE GRANT OPTION FOR UPDATE ON 강좌 FROM 김철수 CASCADE;

 '임꺽정'  유저에게 부여한 <강좌> 테이블의 권한 중 UPDATE 권한을 다름 사람에게 부여할 수 있는 권한과 이미 다른 사람에게 부여했던 권한도 함께 취소하며, 임꺽정 자신은 UPDATE 권한을 유지한다.

'DB' 카테고리의 다른 글

MongoDB 기본  (0) 2021.01.30
[오라클 DB] 유저관리, DCL  (0) 2021.01.12
[오라클 DB] 설치 및 접속  (0) 2017.07.08
데이터 베이스 기초  (0) 2017.06.14
SQL injection (SQL 삽입)  (0) 2017.06.01

+ Recent posts