--###################################
--### 1. PK, FK, 데이터 삽입 및 조회 ###
--###################################
-- 1. Domain Constraint, 도메인 무결성 제약
CREATE TABLE KOPO_PRODUCT_COLUMN_TEST
(
CHARCOL VARCHAR2 (100),
NUMCOL NUMBER NOT NULL
);
-- 자료형에 위배되는 데이터는 데이터는 들어갈 수 없다.
INSERT INTO KOPO_PRODUCT_COLUMN_TEST
VALUES('TEST1','TEST2')
-- NULL을 허용하지 않는다 하여 NULL이 들어갈 수 없다.
INSERT INTO KOPO_PRODUCT_COLUMN_TEST
VALUES('TEST1',NULL)
-- 도메인 무결성 제약을 위배하지 않는 데이터는 정상적으로 들어간다.
INSERT INTO KOPO_PRODUCT_COLUMN_TEST
VALUES('TEST1',10)
SELECT * FROM KOPO_PRODUCT_COLUMN_TEST
-- 추가로 넣어도 또 들어간다.
INSERT INTO KOPO_PRODUCT_COLUMN_TEST
VALUES('TEST1',10)
DROP TABLE KOPO_PRODUCT_COLUMN_TEST
-- 2. PK(Primary Key Constraint, 개체 무결성 제약), FK(Foreign Key Constrain, 참조 무결성 제약)
-- 모든 테이블 조회
SELECT * FROM TABS
-- 부모 테이블 생성 및 조회 (행사 정보 테이블)
CREATE TABLE KOPO_EVENT_INFO_FOREIGN
(
EVENTID VARCHAR2(20),
EVENTPERIOD VARCHAR2(20),
PROMOTION_RATIO NUMBER,
CONSTRAINT PK_KOPO_EVENT_INFO_FOREIGN PRIMARY KEY (EVENTID) -- 제약조건 설정 / 형식상 써주는거 / PK (지정할 컬럼)
);
SELECT * FROM KOPO_EVENT_INFO_FOREIGN
DESC KOPO_EVENT_INFO_FOREIGN
-- 자식 테이블 생성 및 조회 (실적 정보 테이블)
CREATE TABLE KOPO_PRODUCT_VOLUME_FOREIGN
(
REGIONID VARCHAR2(20),
PRODUCTGROUP VARCHAR2(20),
YEARWEEK VARCHAR2(8),
VOLUME NUMBER NOT NULL,
EVENTID VARCHAR2(20),
CONSTRAINT PK_KOPO_PRODUCT_VOLUME_FOREIGN PRIMARY KEY (REGIONID, PRODUCTGROUP, YEARWEEK),
CONSTRAINT FK_KOPO_PRODUCT_VOLUME_FOREIGN FOREIGN KEY (EVENTID) REFERENCES KOPO_EVENT_INFO_FOREIGN (EVENTID) -- 제약조건 설정 / 형식상 써주는거 / FK (지정할 컬럼) ref '부모테이블'(의 컬럼명)
);
SELECT * FROM KOPO_PRODUCT_VOLUME_FOREIGN
DESC KOPO_PRODUCT_VOLUME_FOREIGN
-- 자식 테이블에서 참조키 설정하기 (테이블 생성 후 FK 설정하기)(부모 테이블을 강제 삭제하기 위해 CASCADE 옵션을 주면 자식 테이블의 FK가 삭제된다.)
ALTER TABLE KOPO_PRODUCT_VOLUME_FOREIGN
ADD CONSTRAINTS FK_KOPO_PRODUCT_VOLUME_FOREIGN FOREIGN KEY (EVENTID)
REFERENCES KOPO_EVENT_INFO_FOREIGN (EVENTID)
--ON DELETE CASCADE -- 부모 테이블에서 에러 없이 삭제가 가능해진다. (자식 테이블의 해당 row를 전부 삭제)
--ON DELETE SET NULL -- 부모 테이블에서 에러 없이 삭제가 가능해진다. (자식 테이블의 해당 FK를 NULL처리하고 row 자체를 삭제하진 않는다.)
-- 자식 테이블에서 참조키 드랍하기
ALTER TABLE KOPO_PRODUCT_VOLUME_FOREIGN
DROP CONSTRAINT FK_KOPO_PRODUCT_VOLUME_FOREIGN;
-- 부모 테이블에 데이터 입력
INSERT INTO KOPO_EVENT_INFO_FOREIGN
VALUES ('A01','20',0.1)
-- 자식 테이블에 데이터 입력 (부모 테이블에 'A01'이 이미 만들어져 있음)
INSERT INTO KOPO_PRODUCT_VOLUME_FOREIGN
VALUES ('SEOUL','REF','202010',20,'A01')
-- 자식 테이블에 데이터 입력 (부모 테이블에 'A02'가 아직 없음)
INSERT INTO KOPO_PRODUCT_VOLUME_FOREIGN
VALUES ('SEOUL','REF','202010',20,'A02')
-- 부모 테이블에서 데이터 삭제 (자식 테이블이 부모 테이블의 'A01'을 FK로 참조중)
DELETE FROM KOPO_EVENT_INFO_FOREIGN
WHERE EVENTID = 'A01'
-- 부모 테이블을 삭제 (자식 테이블이 부모 테이블의 'A01'을 FK로 참조중)
DROP TABLE KOPO_EVENT_INFO_FOREIGN
-- 부모 테이블을 강제 삭제 (자식 테이블이 부모 테이블의 'A01'을 FK로 참조중)
DROP TABLE KOPO_EVENT_INFO_FOREIGN CASCADE CONSTRAINT -- 테이블 삭제를 위해 CONSTRAINT 제약 조건(PK, FK)을 삭제시키는 옵션을 준다.
DROP TABLE KOPO_EVENT_INFO_FOREIGN DELETE SET NULL CONSTRAINT
-- ON DELETE SET NULL 실습 후 해당 row 데이터 삭제
DELETE FROM KOPO_PRODUCT_VOLUME_FOREIGN
WHERE REGIONID = 'SEOUL'
--#####################################################
--### 2. 특정 컬럼 및 특정 조건 데이터 조회, 테이블 UNION ###
--#####################################################
-- 1. Relation Algebra(관계 대수)
-- 모든 테이블 조회하기
SELECT * FROM TABS
-- 해당 테이블데이터의 모든 데이터 조회하기
SELECT * FROM KOPO_PRODUCT_VOLUME
SELECT
REGIONID, -- 지역정보
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME
-- 특정 컬럼만 조회하기.
SELECT
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME
SELECT YEARWEEK
FROM KOPO_PRODUCT_VOLUME
-- 컬럼명 변경하기 (VOLUME -> VOLUME2)
ALTER TABLE KOPO_PRODUCT_VOLUME
RENAME COLUMN VOLUME TO VOLUME2
-- 컬럼명 다시 되돌리기 (VOLUME2 -> VOLUME)
ALTER TABLE KOPO_PRODUCT_VOLUME
RENAME COLUMN VOLUME2 TO VOLUME
-- 1.1 데이터 조회 (Selection) : 특정 row 조회하기
-- KOPO_PRODUCT_VOLUME 테이블에서 물량이 800,000 이상인 데이터만 조회하세요.
SELECT
REGIONID, -- 지역정보
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME
WHERE VOLUME >= 800000
-- KOPO_PRODUCT_VOLUME 테이블에서 201601주차 이상이면서, ST0001인 상품 데이터를 조회하세요.
SELECT
REGIONID, -- 지역정보
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME
WHERE YEARWEEK >= '201601' AND PRODUCTGROUP = 'ST0001'
-- 1.2 데이터 조회 (Projection) : 특정 column 조회하기
-- KOPO_PRODUCT_VOLUME 테이블에서 모든 상품을 조회하세요.
SELECT
PRODUCTGROUP -- 상품정보
FROM KOPO_PRODUCT_VOLUME
-- 1.3 집합 연산자 (Union) : 2개의 릴레이션을 합치기
-- A02 테이블을 하나 생성하고 데이터를 불러온다.
CREATE TABLE KOPO_PRODUCT_VOLUME_A02
(
REGIONID VARCHAR2(20), -- 지역정보
PRODUCTGROUP VARCHAR2(20), -- 상품정보
YEARWEEK VARCHAR2(6), -- 주차정보
VOLUME NUMBER, -- 판매량
CONSTRAINT PK_KOPO_PRODUCT_VOLUME_A02 PRIMARY KEY(REGIONID, PRODUCTGROUP, YEARWEEK)
);
SELECT * FROM KOPO_PRODUCT_VOLUME_A02
DESC KOPO_PRODUCT_VOLUME_A02
-- A01 지점과 A02 지점의 실적을 합치기. (데이터 Union 하기) (속성 수와 컬럼 정보가 같아야한다.)
SELECT
REGIONID, -- 지역정보
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME
UNION ALL -- 중복 제거 안 함
--UNION -- 중복 제거 및 정렬
SELECT
REGIONID, -- 지역정보
PRODUCTGROUP, -- 상품정보
YEARWEEK, -- 주차정보
VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME_A02
--######################################################
--### 3. Expression 수식 사용하기, DISTINCT(중복값 제거) ###
--######################################################
-- 1. Expression 수식 사용하기 (수식 AS 컬럼명)(별칭 달기)
-- '실적정보'라는 문자열 수식을 'MEASURE_NAME'이라는 컬럼에 담는다.
SELECT '실적정보' AS MEASURE_NAME, A.*
FROM KOPO_PRODUCT_VOLUME A
-- 위와 동일.
SELECT
'실적정보' AS MEASUER_NAME,
A.REGIONID, -- 지역정보
A.PRODUCTGROUP, -- 상품정보
A.YEARWEEK, -- 주차정보
A.VOLUME -- 판매량
FROM KOPO_PRODUCT_VOLUME A
-- '상수 문자열'이 아닌 컬럼 정보를 이용할 수도 있다.
SELECT
A.REGIONID || '_' || A.PRODUCTGROUP AS PLANID, -- REGIONID + '_' + PRODUCTGROUP 을 'PLANID'라는 컬럼에 담는다.
A.REGIONID -- 지역코드
FROM KOPO_PRODUCT_VOLUME A
-- 2. Expression 수식 사용하기 (수식을 통해 계산)(계산)
SELECT
A.YEARWEEK + A.VOLUME AS TEST, -- (YEARWEEK + VOLUME) 을 'TEST라는 컬럼에 담는다다.
A.*
FROM KOPO_PRODUCT_VOLUME A
-- Expression 을 사용해 조회한 데이터를 저장까지 하고 싶은 경우
CREATE TABLE STABLE AS
SELECT
YEARWEEK+VOLUME AS TEST,
A.*
FROM KOPO_PRODUCT_VOLUME A
-- 위에서 생성한 STABLE 조회
SELECT * FROM STABLE
-- 원본 테이블의 무결성 제약 조건을 살펴본다.(PK)
DESC KOPO_PRODUCT_VOLUME
-- 이렇게 저장한 데이터는 값은 저장되지만 '권한' 설정까지 복제하지는 못 한다.
DESC STABLE
-- 위에서 생성한 STABLE 삭제
DROP TABLE STABLE
SELECT * FROM TABS
-- 2. DISTINCT 중복값 제거
SELECT * FROM KOPO_CHANNEL_RESULT
-- ACCOUNTNAME에 어떤 것들이 있나 확인할 수 있다.
SELECT
DISTINCT ACCOUNTNAME
FROM KOPO_CHANNEL_RESULT
-- 상품군(PRODUCTGROUP)에 대한 DISTINCT 구현 후 컬럼 이름을 PRODUCT로 변경하세요.
SELECT
DISTINCT PRODUCTGROUP AS PRODUCT
FROM KOPO_CHANNEL_RESULT
--#######################################################################
--### 4. DB 링크 사용하기, IN, NOT IN, BETWEEN, 메타 문자 % 활용해 조회하기 ###
--#######################################################################
-- 1.1 DB 링크 생성 (접속 엔진)
CREATE DATABASE LINK GRAM
CONNECT TO kopo -- ID
IDENTIFIED BY kopo -- PW
USING '
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.219.127)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)'
CREATE DATABASE LINK GRAM
CONNECT TO kopo -- ID
IDENTIFIED BY kopo -- PW
USING 'MYGRAM'
-- 1.2 DB 링크 전체 조회 (엔진 생성이 잘 되었나 확인)
SELECT * FROM ALL_DB_LINKS
-- 1.3 DB 링크 삭제하기. (실습 후 1.2로 삭제된 것을 확인하고 위 1.1로 가서 다시 생성한다.)
DROP DATABASE LINK GRAM
-- 2.1 내 XE에서 'KOPO_CHANNEL_RESULT_NEW'라는 테이블을 조회하라 -> 없어서 안 나옴.
SELECT * FROM KOPO_CHANNEL_RESULT_NEW
-- 2.2 엔진을 이용해 'KOPO_CHANNEL_RESULT_NEW'라는 테이블을 조회하라 -> 엔진을 이용해 학교 서버에 있는 DB를 조회.
SELECT * FROM KOPO_CHANNEL_RESULT_NEW@GRAM
-- 3.1 엔진을 이용해 내 XE에 데이터베이스를 복사해오자.
-- 내 XE에 'KOPO_CHANNEL_RESULT_NEW'라는 테이블을 만들어라. -> AS는 엑셀의 수식 기능 = 이랑 같다고 보면 된다.
CREATE TABLE KOPO_CHANNEL_RESULT_NEW AS
SELECT * FROM KOPO_CHANNEL_RESULT_NEW@GRAM
-- 3.2 이제 내 XE에서 'KOPO_CHANNEL_RESULT_NEW' 테이블을 조회할 수 있다.
SELECT * FROM KOPO_CHANNEL_RESULT_NEW
-- 3.3 생성된 테이블 목록도 확인해보자.
SELECT * FROM TABS
-- 실습 1) GRAM 엔진을 이용해 학교 서버에서 'KOPO_REGION_MST' 테이블을 복사해온 다음 조회하세요.
CREATE TABLE KOPO_REGION_MST AS
SELECT * FROM KOPO_REGION_MST@GRAM
SELECT * FROM KOPO_REGION_MST
-- 실습 2) MYGRAM 서버에서 'KOPO_PRODUCT_VOLUME' 테이블을 복사해오고, ST0002 상품의 연주차가 201514, 201516 인 제품만 조회하세요.
-- 1. 조회하기
SELECT * FROM KOPO_PRODUCT_VOLUME@GRAM
-- 2. DB 복사해오기
CREATE TABLE KOPO_PRODUCT_VOLUME AS
SELECT * FROM KOPO_PRODUCT_VOLUME@GRAM
-- 3.1 자료형 확인하기
DESC KOPO_PRODUCT_VOLUME
-- 3.2 데이터 조회하기 (AND OR 이용)
SELECT * FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002'
AND (YEARWEEK = '201514' OR YEARWEEK = '201516')
-- 3.2 데이터 조회하기 (IN 이용) YEARWEEK가 '201514','201516'인 것만 조회하기
SELECT * FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002'
AND YEARWEEK IN ('201514','201516')
-- 3.3 YEARWEEK가 '201514','201516'이 아닌 것만 조회하기
SELECT * FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002'
AND YEARWEEK NOT IN ('201514','201516')
-- 3.4 YEARWEEK가 '201514 ~ 201516'인 것을 조회하기 / 201514, 201515, 201516이 조회된다.
SELECT * FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002'
AND YEARWEEK BETWEEN '201514' AND'201516'
-- 실습 3) MYGRAM 서버에서 'KOPO_CHANNEL_RESULT'테이블을 복사해오고, 상품명이 'UN55~~'로 시작하는 제품만 조회하세요.
-- 1. DB 복사해오기
CREATE TABLE KOPO_CHANNEL_RESULT AS
SELECT * FROM KOPO_CHANNEL_RESULT@GRAM
-- 2. 자료형 확인하기
DESC KOPO_CHANNEL_RESULT
-- 3. ITEM이 'UN55~~'로 시작하는 상품 조회하기
SELECT * FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND ITEM LIKE 'UN55%'
SELECT * FROM TABS
WHERE 1=1
AND TABLE_NAME LIKE '%KOPO%'
SELECT * FROM TABS
WHERE 1=1
AND TABLE_NAME LIKE 'KOPO%'
SELECT * FROM TABS
WHERE 1=1
AND TABLE_NAME LIKE '%KOPO'
SELECT * FROM TABS
WHERE 1=1
AND TABLE_NAME LIKE 'KOPO'
--########################################
--### 5. 산술연산자, 결측값, 변수 입력 받기 ###
--########################################
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
SELECT DISTINCT SALESNAME
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND SALESNAME LIKE '%CO'
SELECT DISTINCT AP1ID
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND AP1ID IN ('401737','407373','402383')
CREATE TABLE AP1IDLIST
(
AP1ID VARCHAR2(100),
AP2NAME VARCHAR2(100)
)
INSERT INTO AP1IDLIST VALUES ('401737','폴리텍강서')
INSERT INTO AP1IDLIST VALUES ('401373','폴리텍정수')
INSERT INTO AP1IDLIST VALUES ('402383','폴리텍융기원')
SELECT * FROM AP1IDLIST
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND YEARWEEK BETWEEN 201728 AND 201732
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND YEARWEEK IN (201728, 201732)
-- 산술연산자
SELECT QTY * 1.5 AS QTY2, QTY
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND YEARWEEK BETWEEN 201728 AND 201732
-- 반올림
SELECT ROUND(QTY * 1.23, 2) AS QTY2, QTY
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND YEARWEEK BETWEEN 201728 AND 201732
-- 실습 1) MYGRAM 서버의 KOPO_PROMOTION 테이블에서 조회를 통해 PMAP에 10% 할인된 가격을 ROUND 처리하여 'PMAP10'이라는 컬럼을 생성하세요.
-- 1. MYGRAM에서 DB 불러와 저장하기
CREATE TABLE KOPO_PROMOTION AS
SELECT * FROM KOPO_PROMOTION@GRAM
-- 2. 읽어온 DB 조회하기
SELECT *
FROM KOPO_PROMOTION
-- 3. EXPRESSION 수식 사용해서 조회하기
SELECT
A.REGIONID,
A.ITEM,
A.TARGETWEEK,
A.PLANWEEK,
A.MAP_PRICE,
A.IR,
A.PMAP,
A.PRODUCT,
ROUND(A.PMAP * 0.9, 0) AS PMAP10
-- ROUND(A.PMAP - (A.PMAP * 0.1), 0) AS PMAP10
FROM KOPO_PROMOTION A
WHERE 1=1
-- 실습 2) KOPO_PROMOTION 테이블에서 PMAP/MAP_PRICE 비율을 구해서 PERCENT 컬럼을 생성하세요.
SELECT
A.REGIONID,
A.ITEM,
A.TARGETWEEK,
A.PLANWEEK,
A.MAP_PRICE,
A.IR,
A.PMAP,
A.PRODUCT,
ROUND(A.PMAP / A.MAP_PRICE, 3) AS PERCENT
FROM KOPO_PROMOTION A
WHERE 1=1
-- 실습 3) KOPO_PRODUCT_VOLUME 테이블에서 연산자를 활용하여 'ST0001'의 201544 ~ 201548 주차 실적만 조회하세요.
SELECT * FROM KOPO_PRODUCT_VOLUME
SELECT
A.REGIONID,
A.PRODUCTGROUP,
A.YEARWEEK,
A.VOLUME
FROM KOPO_PRODUCT_VOLUME A
WHERE 1=1
AND PRODUCTGROUP = 'ST0001'
AND YEARWEEK BETWEEN '201544' AND '201548'
-- 결측값 조회하기
CREATE TABLE KOPO_PROMOTION_HK AS
SELECT * FROM KOPO_PROMOTION_HK@GRAM
SELECT *
FROM KOPO_PROMOTION_HK
WHERE 1=1
AND MAP_PRICE IS NULL
--AND MAP_PRICE IS NOT NULL -- 비어있지 않은 값을 조회
-- 변수를 입력 받아 조회하기 (입력 받을 변수의 값이 문자면 아래와 마찬가지로 ' ' 로 입력해준다.)
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND PRODUCTGROUP = &PROD
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
AND PRODUCTGROUP = 'MOBILE'
--##############################################################
--### 6. 함수편! 정렬, UNION, CONCAT, FORMATTING(포맷팅) 등... ###
--##############################################################
-- 정렬하기 (정렬은 PK로 정렬하는게 좋다. 중복이 되지 않으니까)
SELECT *
FROM KOPO_CHANNEL_RESULT
WHERE 1=1
ORDER BY SALESID, SALESNAME, PRODUCTGROUP
-- 1. 정렬하기. (ASC : 오름차순(기본값), DESC : 내림차순)
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
ORDER BY REGIONID, PRODUCTGROUP, YEARWEEK ASC;
--2. 내림차순 정렬하기
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
ORDER BY REGIONID, PRODUCTGROUP, YEARWEEK DESC;
--3. 테이블 합치기.
SELECT * FROM KOPO_PRODUCT_VOLUME
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0001'
UNION
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002';
--Ctrl + E 누르면 소모된 비용(컴퓨터 자원 소모)를 보여준다.
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0001'
UNION ALL
SELECT *
FROM KOPO_PRODUCT_VOLUME
WHERE 1=1
AND PRODUCTGROUP = 'ST0002';
--UNION : PLAN(Cost) 78,265 3초 소요 Cardinality 697,996
--UNION ALL : PLAN(Cost) 7,065 즉시 실행 Cardinality 1,243,778
-- KOPO_CHANNEL_RESULT의 RECORD COUNT 결과가 697,996이다.
-- UNION ALL은 중복 제거를 하지 않으니 빠르고 그대로 자기 자신을 붙여 Cardinality가 2배가 되었고,
-- UNION은 중복 제거를 하여 자원 소모 비용이 높고 시간이 걸린다. 이 경우 Cardinality는 당연히 자기 자신 1배수 그대로 나왔다.
SELECT *
FROM KOPO_CHANNEL_RESULT
UNION
SELECT *
FROM KOPO_CHANNEL_RESULT;
--4. 대소문자 처리
SELECT A.*, A.LOWER(REGIONID) AS REGIONID_P
FROM KOPO_CHANNEL_SEASONALITY_NEW.A;
--5. 합치기(CONCAT, ||)
--CONCAT은 한 번에 2개만 된다.
SELECT CONCAT(REGIONID, PRODUCT) AS KEY_IDX
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--3개 이상 CONCAT하기.
SELECT CONCAT(CONCAT(REGIONID, PRODUCT),YEARWEEK) AS KEY_IDX
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--OR 조건으로도 동일하게 만들 수 있다.
SELECT REGIONID||PRODUCT||YEARWEEK AS KEY_IDX
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--OR 조건을 사용하면 구분도 가능하다.
SELECT REGIONID||'_'||PRODUCT||'_'||YEARWEEK AS KEY_IDX
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--6. 인덱스로 문자열 추출하기
SELECT PRODUCT,
SUBSTR(PRODUCT,1,3) AS PRODUCT
FROM KOPO_CHANNEL_SEASONALITY_NEW;
SELECT PRODUCT,
SUBSTR(PRODUCT,-3,2) AS PRODUCT
FROM KOPO_CHANNEL_SEASONALITY_NEW;
SELECT PRODUCT,
LPAD(2,2,'0') AS PRODUCT
FROM KOPO_CHANNEL_SEASONALITY_NEW;
SELECT *
FROM DUAL; -- 오라클에만 있는 더미 테이블
-- 자릿수 맞추기 (FORMATTING 생각하면 된다. 기존 문자열보다 큰 값을 넣고 빈 자리를 채워넣는 함수)
SELECT LPAD(2,2,'0')
FROM DUAL;
SELECT PRODUCT,
LPAD(PRODUCT, 10,'*')
FROM KOPO_CHANNEL_SEASONALITY_NEW;
SELECT PRODUCT,
RPAD(PRODUCT,12,'QT')
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--컬럼 값 제거하기
SELECT PRODUCT,
LTRIM(PRODUCT, 'PRO'),
RTRIM(PRODUCT, '56')
FROM KOPO_CHANNEL_SEASONALITY_NEW;
-- 공백 제거 (TRIM)
SELECT ' ABC ' AS TEST FROM DUAL;
SELECT TRIM(' ABC ') AS TEST FROM DUAL;
-- LENGTH
SELECT LENGTH(' ABC ') AS TEST FROM DUAL;
SELECT LENGTH(TRIM(' ABC ')) AS TEST FROM DUAL;
--컬럼 값 변경하기
SELECT
REGIONID,
REPLACE(REGIONID,'A','REGION_')
FROM KOPO_CHANNEL_SEASONALITY_NEW;
--실습 1. KOPO_CUSTOMERDATA의 고객 코드는 10자리이다.
--만약 10자리가 아니면 왼쪽에 0으로 채운다.
--이후 고객코드의 뒷 4자리는 암호화를 위해 * 처리를 해야한다.
SELECT * FROM KOPO_CUSTOMERDATA;
-- 앞에 0으로 10자릿수 맞추기.
SELECT
LPAD(A.CUSTOMERCODE, 10, '0') AS NEW_CUSTOEMRCODE,
A.*
FROM KOPO_CUSTOMERDATA A;
--고객코드의 뒷 4자리는 암호화를 위해 * 처리 하기.
SELECT
REPLACE(LPAD(A.CUSTOMERCODE, 10, '0'), SUBSTR(A.CUSTOMERCODE, -4, 4), '****') AS NEW_CUSTOEMRCODE,
A.*
FROM KOPO_CUSTOMERDATA A;
--실습 2. NUMBER_EXARMPLE 테이블에서 FIRST/SECOND NUMBER를 활용하여 아래와 같은 결과를 출력하세요.(4.SQL실습 1 P.24)
SELECT * FROM NUMBER_EXAMPLE;
SELECT
FIRST_NUMBER,
SECOND_NUMBER,
(FIRST_NUMBER / SECOND_NUMBER) AS AVG,
ROUND(FIRST_NUMBER / SECOND_NUMBER) AS ROUND_EX,
CEIL(FIRST_NUMBER / SECOND_NUMBER) AS CEIL_EX,
FLOOR(FIRST_NUMBER / SECOND_NUMBER) AS FLOOR_EX,
MOD(FIRST_NUMBER, SECOND_NUMBER) AS MOD_EX,
POWER(FIRST_NUMBER, SECOND_NUMBER) AS POW_EX
FROM NUMBER_EXAMPLE;
4. SQL 실습 1 보고 정리할 것
'개발자 > Database & SQL' 카테고리의 다른 글
Oracle (오라클) SQL - 서브쿼리, with as (기말고사) (0) | 2020.08.25 |
---|---|
MariaDB/MySQL Query (0) | 2020.06.30 |
Oracle (오라클) 산술연산자, 결측값, 변수 입력 받기 (0) | 2020.06.29 |
Oracle (오라클) ORA-12154: TNS:could not resolve the connect identifier specified (0) | 2020.06.28 |
Database 기말고사 (0) | 2020.06.22 |