정보 마스킹 처리

 

- 실무에서 회원 이름을 마스킹 할 일이 생겼다. ( EX : 이름 → 이*, 이름이 → 이*이, 이름이다  이**다) 

 

SELECT
    IFNULL(
        CASE WHEN CHAR_LENGTH(name) > 2
             THEN CONCAT(SUBSTRING(name, 1, 1),LPAD('*', CHAR_LENGTH(name) - 2, '*'), SUBSTRING(NAME, CHAR_LENGTH(name), CHAR_LENGTH(name)))
             ELSE CONCAT(SUBSTRING(name, 1, 1),LPAD('*', CHAR_LENGTH(name) - 1, '*'))
        END, ''") AS mask_name
FROM 테이블명;

데이터의 길이가 가변적이기 때문에 CASE 문을 사용하여 변환.

CONCAT으로 문자열 합치기.

SUBSTRING으로 문자열 자르기.

LPAD를 사용하여 왼쪽으로 *으로 밀어주기!

 

위와 같은 방식으로 SUBSTRING의 시작위치와 종료위치를 변경하면 휴대폰 번호도 마스킹 가능하다!

 

동의어(SYNONYM) : 객체의 별명 부여

 

사용 이유

 이미 생성된 테이블 명이 너무 길어서 쓰기 어려울 경우 사용한다.

 

형식

 CREATE SYNONYM 시노니명
 FOR 참조할 테이블명;

 

예제

-- hr스키마

CREATE SYNONYM EMP
FOR EMPLOYEES;

 

 

 

SYNONYM 이용하여 데이터 입력

형식

 INSERT INTO 시노니명(컬럼명1, 컬럼명2, ....., 컬럼명n)
 VALUES(값1, 값2,....,값n);

 

참조

 참조한 테이블에서 컬럼의 제약조건에 맡게 값을 넣어 주어야 한다.

 

예제

INSERT INTO EMP(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID)
VALUES(EMPLOYEES_SEQ.nextval, '공손', 'mm@naver.com', SYSDATE, 'IT_PROG');

 

 

 

SYNONYM  삭제

형식

 DROP SYNONYM 시노님명;

 

예제

DROP SYNONYM EMP;

시퀀스(SEQUENCE) : 유일한 값을 생성해주는 오브젝트

참조

 초기화가 불가하다.

 사용예시) 회원번호, 게시판 글번호(고유번호)

 

 

 

SEQUENCE 생성

형식

 CREATE SEQUENCE 시퀀스명
 INCREMENT BY 증가값
 START WITH 10 시작값
 MAXVALUE 100 마지막값
 MINVALUE 최소값;

 

예시

CREATE SEQUENCE TEST_SEQ
INCREMENT BY 1 -- 1 씩 증가
START WITH 10 -- 10부터 시작
MAXVALUE 100 -- 마지막 번호 100
MINVALUE 1;

 

 

 

CURRVAL : 현재 SEQ 값 조회

형식
 SELECT 시퀀스명.CURRVAL FROM DUAL;

 

참고

 최소 1번은 증가 시켜줘야 출력이 된다.

 

예시

SELECT TEST_SEQ.CURRVAL FROM DUAL;

 

 

 

NEXTVAL : 증가시키기

형식
 SELECT 시퀀스명.NEXTVAL FROM DUAL;

 

예시

SELECT TEST_SEQ.NEXTVAL FROM DUAL;

 

 

 

INCREMENT BY : 시퀀스 설정 변경

형식
 ALTER SEQUENCE 시퀀스명
 INCREMENT BY 변경값;

 

예시

ALTER SEQUENCE TEST_SEQ
INCREMENT BY 3; -- 3씩 증가하도록 바꿔라

 

 

 

 

VIEW (가상 테이블)

실체가 없는 테이블, 다른 테이블에  접근하기 위한 테이블, 중간에 있는 테이블

 

참고

 속도가 빠르다.

 한 개의 뷰로 여러 개의 테이블을 검색할 수 있다.

 제한 설정이 가능하다.(READONLY)

 

VIEW생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT *
 FROM 접근할 테이블명;

 

예제

-- hr스키마

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT *
FROM jobs;

 

 

 

원하는 컬럼만 넣어 VIEW생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT 컬럼명1, 컬럼명2...컬럼명n
 FROM 접근할 테이블명;

 

참조

 이때 컬럼명은 접근할 테이블의 컬럼명이다.

 또한, 테이블 간 JOIN을 하여 여러 데이터를 집어넣는 것도 가능하다.

 

예시

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT job_id, job_title, min_salary
FROM jobs;

 

 

 

VIEW로 접근하여 테이블에 데이터 집어넣기

형식

 INSERT INTO 뷰명(컬럼명1, 컬럼명2, ...컬럼명n)
 VALUES(값1,값2...값n);

 

참조

 실제로 VIEW에서 접근 테이블에 데이터를 집어넣는 건 매우 위험하다고 한다..

 거의 사용할 일이 없다.

 

예시

INSERT INTO UB_TEST_01(job_id, job_title, min_salary)
VALUES('DEVELOPER', '개발자', 10000);

 

 

 

ROLLBACK : 되돌리기

형식

 ROLLBACK;

 

참조

 INSERT 후 ROLLBACK을 하게 되면 데이터를 넣기 전으로 되돌릴 수 있다.

 COMMIT시 ROLLBACK불가!!

 

 

 

COMMIT : DB에 적용하기

형식

 COMMIT;

 

참조

 데이터를 집어넣으려면 필수!!

 

 

 

읽기전용 VIEW 생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT *
 FROM 접근할 테이블명

 WITH READ ONLY;

참조

 읽기 전용으로 VIEW생성 시 INSERT 할 수 없다.

 

예제

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT *
FROM jobs
WITH READ ONLY; -- 읽기전용 

 

 

 

VIEW 검색

형식

 SELECT * FROM 뷰명;

 

예제

SELECT * FROM TEST_VIEW;

 

 

 

VIEW 삭제

형식

 DROP VIEW 뷰명;

 

예제

DROP VIEW TEST_VIEW;

무결성(CONSTRAINT) : COLUMN을 지정하는 성질(설정)

 

 

종류

 Primary Key : 기본키. 중복을 허용하지 않는다. NULL을 허용하지 않는다. 예시) ID, 주민번호
 Unique Key  : 고유키. 중복을 허용하지 않는다. NULL을 허용한다.       예시) e-mail
 Foreign Key : 외래키. JOIN(테이블과 테이블의 연결)이 목적. NULL을 허용한다.
                          외래키로 지정된 컬럼은 연결된 테이블에서 PK나 UK로 설정되어 있어야 한다.
 CHECK           : 범위를 지정. 지정된 값 외에 사용할 수 없다. 중복을 허용한다. NULL을 허용한다.
 NOT NULL    : 중복을 허용한다. NULL을 허용하지 않는다. 

 

 

 

NOT NULL : 데이터 삽입 시 NULL을 허용하지 않는다.

 

형식

 CREATE TABLE 테이블명(
    컬럼명 데이터형식(크기) NOT NULL,
  );

 

참고

 행 삽입 시 NOT NULL 지정 컬럼에 데이터를 삽입하지 않으면 경우 에러가 발생한다.

예시

-- 테이블 생성

CREATE TABLE TB_TEST08(
    COL1 VARCHAR2(10) NOT NULL,
    COL2 VARCHAR2(20)
);


-- 데이터 삽입

INSERT INTO TB_TEST08(COL1, COL2)
VALUES ('AAA','111');


INSERT INTO TB_TEST08(COL1)
VALUES ('BBB');


INSERT INTO TB_TEST08(COL2)
VALUES ('222'); -- 오류발생 COL1 NOT NULL

 

 

 

CASCADE CONSTRAINTS : 무결성 제약조건까지 모두 삭제

형식 

 DROP TABLE 테이블명
 CASCADE CONSTRAINTS;

 

참조

 예시처럼 똑같이 진행 시 이미 테이블이 생성되어 있어서 에러가 발생할 것입니다.

 테이블 생성 시마다 아래 예시를 실행해주어야 에러가 발생하지 않습니다.

 

예시

DROP TABLE TB_TEST08
CASCADE CONSTRAINTS;

 

 

 

Primary Key(기본키) : 중복금지 + NOT NULL

형식

 1. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) PRIMARY KEY
     );

 

 2. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) CONSTRAINT Key ID PRIMARY KEY
    );

 

 3. CREATE TABLE 테이블명(
       컬럼명1 데이터형식(크기),
       컬럼명2 데이터형식(크기)
       CONSTRAINT Key ID PRIMARY KEY(컬럼명1, 컬럼명2)
     );

 

참고

 1 형식으로 만들 수 있지만, Key ID 지정하지 않았을 경우 지정한 PRIMARY KEY만 삭제를 하지 못하게 된다.

 지정한 PRIMARY KEY 삭제 시 Key ID 필요!

 3 형식으로 생성 시 2개 이상의 컬럼을 PRIMARY KEY로 지정할 수 있다.

 행 삽입 시 PRIMARY KEY로 지정 컬럼에 데이터를 삽입하지 않으면 경우 에러가 발생한다.

 행 삽입 시 PRIMARY KEY로 지정 컬럼에 데이터를 중복 삽입할 경우 에러가 발생한다.

 

예시

CREATE TABLE TB_TEST08(
--  PK_COL VARCHAR2(10) PRIMARY KEY -- 가능하지만
    PK_COL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, --  PK_TEST_01 : Primary Key ID 지정
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


INSERT INTO TB_TEST08(PK_COL, COL1, COL2)
VALUES('AAA','aaa','111');

INSERT INTO TB_TEST08(PK_COL)
-- VALUES('AAA'); -- 중복 허용X , 에러발생. 
VALUES('BBB');

-- INSERT INTO TB_TEST08(PK_COL, COL1, COL2)
-- VALUES('','aaa','111'); -- '' = NULL , 에러발생



-- 에러 only one primary key
/*
CREATE TABLE TB_TEST08(
    PK_COL1 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,
    PK_COL2 VARCHAR2(10) CONSTRAINT PK_TEST_02 PRIMARY KEY,
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);
*/


-- 프라이머리키 2개 이상 생성 방법
CREATE TABLE TB_TEST08(
    PK_COL VARCHAR2(10),
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(PK_COL, COL1)
);

 

 

 

무결성이 없는 테이블 생성 후 무결성 변경하는 방법

형식

 1. ALTER TABLE 테이블명

    ADD PRIMARY KEY (컬럼명1, 컬럼명2..);

 2. ALTER TABLE 테이블명
    ADD CONSTRAINT Key ID명
    PRIMARY KEY(컬럼명);

 

참조

 진행 전 무결성이 없는 테이블이 생성되어 있어야 합니다.

 

예시

-- 무결성 없는 테이블 생성

CREATE TABLE TB_TEST08(
    PK_COL1 VARCHAR2(10),
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


-- 테이블 만든 후 나중에 무결성 변경가능
-- 1형식 

ALTER TABLE TB_TEST08 
ADD PRIMARY KEY (PK_COL);


-- 2형식
ALTER TABLE TB_TEST08
ADD CONSTRAINT PK_TEST_01
PRIMARY KEY(PK_COL1);

 

 

 

무결성 삭제 방법

형식

 1. ALTER TABLE 테이블명

    DROP PRIMARY KEY;

 2. ALTER TABLE 테이블명
    DROP CONSTRAINT Key ID명 ;

 

참조

 1 형식으로 키 추가를 했다면 1 형식으로만 삭제해야 한다.

 1 형식은 지정한 Key ID값을 삭제할 수 없고, 전체 키값이 삭제된다.
 2 형식으로 키 추가했을 경우 2가지 경우 다 삭제 가능하다

 

예시

-- 1형식

ALTER TABLE TB_TEST08 DROP PRIMARY KEY;


-- 2형식

ALTER TABLE TB_TEST08
DROP CONSTRAINT PK_TEST_01;

 

 

 

Unique(고유키) : 중복된 값은 입력 불가. NULL은 허용

형식

1. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) UNIQUE
     );

 

 2. CREATE TABLE 테이블명(
        컬럼명 데이터 형식(크기) CONSTRAINT Key ID UNIQUE
     );

 

참조

 기본키와 마찬가지로 1 형식으로 만들 수 있지만, Key ID 지정하지 않았을 경우 지정한 UNIQUE KEY만 삭제를 하지 못하게 된다.

지정한 UNIQUE 삭제 시 Key ID 필요!

 

예시

CREATE TABLE TB_TEST08(
--  UK_COL VARCHAR2  UNIQUE -- 가능
    UK_COL VARCHAR2(10) CONSTRAINT UK_TEST_01 UNIQUE,
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


INSERT INTO TB_TEST08(UK_COL, COL1, COL2)
VALUES('','aaa','111'); -- ''가능하다 (프라이머리키와 차이점)

INSERT INTO TB_TEST08(COL1, COL2)
VALUES('aaa','111'); -- ''가능하다 (프라이머리키와 차이점)

 

 

 

FOREIGN KEY(외래키) : 대상 테이블에서 pk, uk로 설정되어 있어야 한다.  NULL 값을 허용. 중복 허용

형식

 CREATE TABLE 테이블명(
     DEPARTMENT_ID VARCHAR2(10),
     CONSTRAINT Key ID FOREIGN KEY(컬럼명)
        REFERENCES 대상테이블명(대상테이블의 기본키(OR 고유키) 컬럼명)
  );

 

참조

 외래키 테이블 생성 전 대상테이블이 생성되어 있어야 한다.

 외래키에 데이터를 넣기 전 대상테이블의 기본키에 데이터가 들어가 있어야 한다.

 외래키의 크기는 대상테이블의 기본키(OR 고유키)보다 크기가 같거나 커야 한다.

 대상테이블의 기본키와 외래키의 컬럼명을 달라도 된다.

 외래키 데이터는 아무 값이나 넣으면 안 된다.(대상 테이블의 기본키의 데이터와 같아야 한다.)

 

예시

-- 대상 테이블 생성

CREATE TABLE TB_DEPT(
    DEPARTMENT_ID VARCHAR2(10),
    DEPARTMENT_NAME VARCHAR2(20),
    LOCATION_ID NUMBER,
    CONSTRAINT PK_DEPT_TEST PRIMARY KEY(DEPARTMENT_ID)  -- PRIMARY KEY이거나 Unique여야 한다.
); 


-- 데이터 추가

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('10', '기획부', '120');

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('20', '관리부', '150');

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('30', '개발부', '180');


-- 기준 테이블 생성

CREATE TABLE TB_EMP(
    EMPNO VARCHAR2(10),
    ENAME VARCHAR2(20),
    DEPARTMENT_ID VARCHAR2(10), -- 외래키의 크기는 대상테이블의 기본키(OR 고유키)보다 크기가 같거나 커야 한다.
    CONSTRAINT FK_EMP_TEST FOREIGN KEY(DEPARTMENT_ID)
        REFERENCES TB_DEPT(DEPARTMENT_ID) -- 기본키와 외래키의 컬럼명을 달라도 된다.
); -- 이제 JOIN이 가능해 진다.


-- 데이터 추가
INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('100', '일', '20'); -- DEPARTMENT_ID 아무값이나 넣으면 안된다.(대상 테이블의 기본키값과 같아야한다.)

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('101', '이', '10');

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('102', '삼', '30');

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('103', '사', ''); -- 외래키는 NULL값 허용한다.


-- INNER JOIN

SELECT e.empno, e.ename, d.department_id, d.department_name
FROM tb_emp e, tb_dept d
WHERE e.department_id = d.department_id;

 

 

 

CHECK : 범위 값을 설정하거나 지정된 값만 넣을 수 있다. NULL 허용, 중복 허용

형식

 CREATE TABLE TB_CHECK(
     컬럼명1 데이터형식(크기),
     컬럼명2 데이터형식(크기),
     CONSTRAINT Key ID ( 컬럼명1 IN('지정값1', '지정값2', '지정값3') ),
     CONSTRAINT Key ID ( 컬럼명2 > 범위1 AND COL2 <= 범위2)
  );

 

예시

-- 테이블 생성 

CREATE TABLE TB_CHECK(
    COL1 VARCHAR2(10),
    COL2 VARCHAR2(20),
    CONSTRAINT CHK_01 CHECK( COL1 IN('사과', '배', '바나나') ), -- 사과, 배, 바나나와 NULL
    CONSTRAINT CHK_02 CHECK( COL2 > 0 AND COL2 <= 100) -- 1~100 숫자와 NULL
);


-- 데이터 삽입

INSERT INTO tb_check(COL1,COL2)
VALUES('사과', 50);

INSERT INTO tb_check(COL1,COL2)
VALUES('귤', 50); -- 불가능 에러

INSERT INTO tb_check(COL1,COL2)
VALUES('', 50);

INSERT INTO tb_check(COL1,COL2)
VALUES('', 101); -- 불가능 에러

 

테이블 수정하기

 

 

테이블명 변경

형식

 ALTER TABLE 기존 테이블명
 RENAME
 TO 변경할 테이블명; 

 

예시

-- TB_TEST04의 이름을 TB_TEST99로 변경

ALTER TABLE TB_TEST04
RENAME
TO TB_TEST99;

 

 

 

단일 컬럼 추가

형식

 ALTER TABLE 테이블명
 ADD
 컬럼명 데이터형식;

 

예시

ALTER TABLE TB_TEST99
ADD
COL_NEW1 VARCHAR2(30);

 

 

 

다중 컬럼 추가

형식

 ALTER TABLE 테이블명
 ADD
 (컬럼명1 데이터형식, 컬럼명2 데이터형식);

 

예시

ALTER TABLE TB_TEST99
ADD
(COL_NEW2 NUMBER, COL_NEW3 DATE);

 

 

 

단일 컬럼 수정

형식

 ALTER TABLE 테이블명
 MODIFY 
 변경할 컬럼명 데이터형식;

 

예시

ALTER TABLE TB_TEST99
MODIFY 
COL_NEW1 VARCHAR2(40); -- 용량은 늘리는 경우가 많다.

 

 

 

다중 컬럼 수정

형식

 ALTER TABLE 테이블명
 MODIFY 
 (변경할 컬럼명1 데이터형식, 변경할 컬럼명2 데이터형식);

 

예시

ALTER TABLE TB_TEST99
MODIFY
(COL_NEW2 VARCHAR2(10), COL_NEW3 NUMBER);

 

 

 

단일 컬럼 삭제

형식

 ALTER TABLE 테이블명
 DROP
 COLUMN 삭제할 컬럼명;

 

예시

ALTER TABLE TB_TEST99
DROP
COLUMN COL_NEW1;

 

 

 

다중 컬럼 삭제

형식

 ALTER TABLE 테이블명
 DROP
 (삭제할 컬럼명1, 삭제할 컬럼명2);

 

예시

ALTER TABLE TB_TEST99
DROP
(COL_NEW2, COL_NEW3);

 

 

 

휴지통 비우기(복구불가)

형식

 PURGE RECYCLEBIN;

테이블 복제 

참고

 기본키와 외래키는 가져오지 않는다.

 오리지널 테이블에 영향을 주지 않는다.

 

 

 

컬럼 + 데이터 복제하기

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT * FROM 복제할 테이블명;

 

예시

-- hr 스키마

CREATE TABLE TB_TEST01
AS SELECT * FROM jobs;

 

 

 

컬럼(형태)만 복제하기

참고

 맞지않는 조건을 넣어주면 컬럼만 들어오게 된다.

 

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT * FROM 복제할 테이블명

 WHERE 1=2;

 

예시

CREATE TABLE TB_TEST02
AS SELECT * FROM jobs
WHERE 1=2; -- 맞지않는 조건

 

 

 

원하는 컬럼만 복제하기

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT 복제할 컬럼명1, 복제할 컬럼명2 FROM 복제할 테이블명

 

예시

CREATE TABLE TB_TEST03
AS SELECT job_id, job_title FROM jobs;

 

 

 

컬럼명 바꿔서 복제하기

형식

 CREATE TABLE 생성할 테이블명("바꿀 컬럼명1", "바꿀 컬럼명1")
 AS SELECT 복제할 컬럼명1, 복제할 컬럼명2 FROM 복제할 테이블명

 

예시

CREATE TABLE TB_TEST04("업무번호", "업무명")
AS SELECT job_id, job_title FROM jobs;

 

 

 

가장 많이 사용하는 예시

참고

 GROUP BY, 서브쿼리를 사용하지 않아도 그룹함수를 사용할 수 있게 된다.

-- 테이블 생성
CREATE TABLE TB_TEST05("부서번호", "총합계", "평균")
AS SELECT DEPARTMENT_ID, SUM(SALARY), AVG(SALARY) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

-- 생성 후 JOIN
SELECT E.FIRST_NAME, E.SALARY, T."부서번호", T."총합계", T."평균"
FROM EMPLOYEES E, TB_TEST05 T
WHERE E.DEPARTMENT_ID = 50 AND T."부서번호" = 50;

SQL(Structured Query Language)

정의 : 데이터 베이스를 관라하고 조작하는 질의언어
목적 : 유무형 데이터를 데이터베이스 내 규격화된 장소에 저장하고 분석과 통계 작업으로 가치있는 정보를 얻기 위함이다.

 

데이터

유무형의 형태를 구성하는 요소
하나이상의 데이터가 모여 의미 있는 형태를 만든다.


필드 (== 컬럼)

속성값을 부여한 데이터
형식 : 수치, 문자, 날짜, 메모등이 있으며, 형식에 따라 고정길이 및 초기 설정값을 갖는다.
속성값 예시

고정 문자열 7자리, 공백 허용 안함, 기본키 적용
CHAR(7)                        NOT NULL               1

 

 

레코드

연관된 필드의 모음
한개의 ROW값에 연관된 필드의 모음


테이블

연관된 레코드의 모음


데이터베이스(Database:DB)

업무나 시스템 단위로 연관된 테이블의 모음

데이터베이스 관리 시스템(DBMS)

복잡한 SQL명령어를 사용하지 않고 프로그램을 통해 데이터 베이스를 효과적으로 조작할 수 있게 한다.
여러 사용자가 데이터베이스 서버에 직접 접근하지 않고 DBMS의 관리 프로그램으로 간접 제어 가능
데이터 정의, 조작(삽입,삭제,변경 및 검색), 제어(일관성,무결성,보안)

데이터베이스 시스템 : DB+DBMS+응용프로그램



데이터 정의 언어(DDL)

CREATE : 테이블 생성
ALTER : 테이블 구조 변경
DROP : 테이블 삭제

데이터 조작 언어(DML)

SELECT : 테이블에 데이터 검색
INSERT : 테이블에 데이터 입력
UPDATE : 테이블에 데이터 수정
DELETE : 테이블에 데이터 삭제

데이터 제어 언어(DCL) 

GRANT : 계정에 권한 부여
REVOKE : 계정에 권한 

트랜잭션 제어 언어(TCL)

COMMIT : 데이터베이스 작업 중 수정한 내용을 반영
ROLLBACK : 수정한 내용을 취소하고 이전 상태로 돌아가기                

 

 

 

 

 

 

출처 : 하루10분 SQL    

OVER() : GROUP BY 하지않아도 그룹함수 사용가능

형식

 SELECT 컬럼명, 그룹함수OVER() FROM 테이블명;

 

참고

GROUP BY 를 보강하기 위해서 나온 함수
SELECT 절에서만 사용 가능
그룹함수를 사용하려면 GROUP BY를 사용해야 하지만, OVER()를 사용하면 GROUP BY를 하지 않아도 된다.
PARTITION BY(그룹핑) 한 데이터를 정렬해서 뽑는다.

예시

-- hr 스키마

SELECT department_id, COUNT(*)OVER()
FROM employees;

 

 

 

PARTITION BY : 특정 컬럼 기준으로 그룹을 만든다.  ★★★★★

형식

 SELECT 컬럼명, 그룹함수() OVER ( PARTITION BY 그룹컬럼명) FROM 테이블명;

 

참고

SELECT 절 안에 GROUP BY

 

예시

SELECT department_id, first_name, salary,
        -- department_id 묶어서 카운트로 씌워라
        COUNT(*)OVER(PARTITION BY department_id) 
FROM employees;

 

 

 

분석함수(순위함수)

특정 집합 내에서 결과 건수의 변화없이 해당 집합안에서 합계 및 카운트 등을 계산할 수 있는 함수이다.

 

 

RANK() :  중복 순번 후 순위만큼 이동한 순번 구하기

형식 

1. RANK()OVER(ORDER BY 정렬컬럼명) AS RANK 

2. RANK() OVER (PARTITION BY 그룹컬럼명 ORDER BY 정렬컬럼명) AS RANK

 

참고

1형식은 정렬컬럼명으로 정렬해 같은 값이면 중복순위를 부여하고 그 이후는 해당 순위만큼 이동한 순위를 구한다.

2형식은 그룹컬럼로 그룹을 만들고 정렬컬럼명으로 정렬해 같은 값이면 중복순위를 부여하고 그 이후는 해당 순위만큼 이동한 순위를 구한다.

 

예시 : 1 2 3 3 5 6

-- 1형식
SELECT employee_id, first_name, salary,department_id, 
       RANK()OVER(ORDER BY salary DESC) AS RANK
FROM employees;


-- 2형식
SELECT employee_id, first_name, salary,department_id, 
       RANK()OVER(PARTITION BY department_id ORDER BY salary DESC) AS RANK
FROM employees;

 

 

 

DENSE_RANK() : 중복 순번 후 순차 순번 구하기

형식

 1. DENSE_RANK()OVER(ORDER BY 정렬컬럼명) AS RANK

 2. DENSE_RANK() OVER (PARTITION BY 그룹컬럼명 ORDER BY 정렬컬럼명) AS RANK

 

참고

1형식은 정렬컬럼명으로 정렬해 같은 값이면 중복순위를 부여하고 그 이후는 순차적인 순위를 구한다.

2형식은 그룹컬럼로 그룹을 만들고 정렬컬럼명으로 정렬해 같은 값이면 중복순위를 부여하고 그 이후는 순차적인 순위를 구한다.

 

 

예시 : 1 2 3 3 4 5

-- 1형식
SELECT employee_id, first_name, salary,department_id, 
       DENSE_RANK()OVER(ORDER BY salary DESC) AS RANK
FROM employees;


-- 2형식
SELECT employee_id, first_name, salary,department_id, 
       DENSE_RANK()OVER(PARTITION BY department_id ORDER BY salary DESC) AS RANK
FROM employees;

 

 

 

ROW_NUMBER() : 중복없는 순번 구하기

형식

 1. ROW_NUMBER()OVER(ORDER BY 정렬컬럼명) AS RANK

 2. ROW_NUMBER() OVER (PARTITION BY 그룹컬럼명 ORDER BY 정렬컬럼명) AS RANK

 

참고

1형식은 정렬컬럼명으로 정렬해 중복 없는 순번을 구한다.

2형식은 그룹컬럼로 그룹을 만들고 정렬컬럼명으로 정렬해 중복 없는 순번을 구한다.

 

예시 : 1 2 3 4 5 6

-- 1형식
SELECT employee_id, first_name, salary,department_id, 
       ROW_NUMBER()OVER(ORDER BY salary DESC) AS RANK
FROM employees;


-- 2형식
SELECT employee_id, first_name, salary,department_id, 
       ROW_NUMBER()OVER(PARTITION BY department_id ORDER BY salary DESC) AS RANK
FROM employees;

 

 

 

ROWNUM :  조회한 행 번호 구하기  ★★★★★

형식

 SELECT ROWNUM, 컬럼명 FROM 테이블명; 

 

참고

게시판에서 글들을 한페이지에 글을 1~20번까지 불러올 때 사용한다.

테이블 전체 컬럼을 출력하고 싶을 땐 FROM 테이블명에 별명을 사용해주고 SELECT 절에 별명.*해주면 된다.

 

예시 : 1 2 3 4 5 6

-- ROWNUM의 1~10까지 출력하라

SELECT ROWNUM, employee_id, first_name
FROM employees
WHERE ROWNUM <= 10;               		-- ROWNUM이 10보다크고 20보다 작은경우를 구해보자.
-- WHERE ROWNUM > 10 AND ROWNUM <= 20;  -- 실행이 되지 않는다.


-- 급여의 순위를 구한다

-- 1. 정렬        많음 -> 적음
-- 2. 번호 지정    1 2 3 4
-- 3. 범위 지정    1~10 11~20

SELECT RNUM, employee_id, first_name, salary
FROM
    (SELECT ROWNUM AS RNUM, employee_id, first_name, salary
    FROM
        (SELECT employee_id, first_name, salary  -- 급여순위
        FROM employees
        ORDER BY salary DESC)
    )
WHERE RNUM >= 1 AND RNUM <= 10;    

 

CASE WHEN THEN

JAVA의 CASA ~ SWITCH문과 비슷하다.

OO일 경우 OO로 출력해라~

비교할 컬럼을 지정하고 그 컬럼 안의 ROW값을 설정하여  ROW값일 경우 출력문자를 출력하는 방법이다.

 

형식

  SELECT 컬럼명, 컬럼명,

     CASE 비교컬럼명

        WHEN 검색값 THEN 출력문자

        WHEN 검색값 THEN 출력문자

        ELSE defalut값의 출력문자

     END

  FROM 테이블명;

 

예시

-- hr 스키마

SELECT employee_id, first_name, phone_number,
    CASE SUBSTR(phone_number,1,3)   -- 지역번호
        WHEN '515' THEN '서울'
        WHEN '590' THEN '부산'
        WHEN '650' THEN '공주'
        ELSE '기타'
    END    
FROM employees;

 

 

 

DECODE

CASE WHEN THEN과 똑같은 조건문인데, 사용하기는 DECODE가 더 간편하다.

 

형색

  SELECT 컬럼명, 컬럼명,

     DECODE ( 비교컬럼명,

        검색값, 출력문자,

        검색값, 출력문자,

        defalut값의 출력문자 )

  FROM 테이블명;

 

예시

SELECT employee_id, first_name, phone_number,
    DECODE(SUBSTR(phone_number, 1, 3),
        '515', '서울',
        '590', '부산',
        '650', '공주',
        '기타')
FROM employees;

+ Recent posts