2022년 3월 7일 월요일

오라클 기본 5 - 뷰편

 - 뷰(view)란?

1. 보여주고 싶은 데이터만 보여줌으로 보안에 도움이 됨


2. 복잡한 쿼리를 단순화 시킬 수 있다.

CREATE OR REPLACE VIEW v_userbuyTBL --뷰 테이블 명

AS

  SELECT U.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"

  FROM userTBL U

    INNER JOIN buyTBL B

       ON U.userID = B.userID ;

--위의 쿼리문을 아래와 같이 단순화 가능

SELECT * FROM v_userbuyTBL WHERE userName = '김범수'; 


3. 뷰 활용

DROP VIEW v_userbuyTBL; --뷰 삭제

UPDATE v_userTBL SET addr = '부산' WHERE userID='JKW'; --뷰 수정

INSERT INTO v_userTBL(userID, userName, addr) VALUES('KBM','김병만','충북'); --뷰 입력


4. 뷰 옵션
CREATE MATERIALIZED VIEW 뷰이름
    --뷰 생성 후 동시에 데이터 채워짐 | 나중에 채워짐
    BUILD { IMMEDIATE | DEFERRED

    --커밋 발생 때마다 내용 변경 | 직접 DBMS_MVIEW 패키지를 싱행하여 변경   
    REFRESH { ON COMMIT | ON DEMAND

--원본 테이블에서 변경된 데이터만 뷰에 업데이트, 원본 데이터가 변경되면 전체를 업데이트, 원본이 변경되어도 업데이트 안함
    { FAST | FORCE COMPLETE  | NEVER }
AS
    SELECT SUM(sales) FROM buyTBL;


 

오라클 기본 4 - 테이블편

 1. 기본키 설정

CREATE TABLE userTBL 

( userID  CHAR(8) NOT NULL PRIMARY KEY, --userTBL의 기본키

  userName  NVARCHAR2(10) NOT NULL,

  birthYear NUMBER(4) NOT NULL

);

CREATE TABLE buyTBL 

(  idNum NUMBER(8)  NOT NULL  PRIMARY KEY, --buyTBL 의 기본키

   userID  CHAR(8)  NOT NULL, 

   prodName NCHAR(6)  NOT NULL

);


2. 외래키 설정

CREATE TABLE buyTBL 

(  idNum NUMBER(8)  NOT NULL  PRIMARY KEY,

   userID  CHAR(8)  NOT NULL, 

   , FOREIGN KEY(userID) REFERENCES userTBL(userID) --buyTBL 의 외래키 지정

);

또는

ALTER TABLE buyTBL

ADD CONSTRAINT FK_userTBL_buyTBL --외래키 이름 지정

FOREIGN KEY (userID) --현재  테이블 외래키

REFERENCES userTBL (userID) -- 연결할 기본 테이블 기본키

ON DELETE CASCADE ; --기본 테이블 삭제시 현재 테이블도 삭제


3. UNIQUE 제약 조건 -중복되지 않은 유일한 값이지만 NULL 허용

CREATE TABLE userTBL 

(  userID  CHAR(8) NOT NULL ,

  userName  NVARCHAR2(10) NOT NULL,

  birthYear NUMBER(4) NOT NULL,  

  , CONSTRAINT AK_email UNIQUE (email) --이메일은 유일해야 하지만 null일 수도 있다

);

또는

ALTER TABLE USERTBL

    ADD CONSTRAINT AK_EMAIL UNIQUE (EMAIL);


4. CHECK 제약 조건 - 입력되는 데이터 점검 기능

ALTER TABLE userTbl

ADD CONSTRAINT CK_height

CHECK   (height >= 0) ; -- 키는 0이상이어야 함.

ALTER TABLE userTbl

ADD CONSTRAINT CK_mobile1

CHECK  (mobile1 IN ('010','011','016','017','018','019')); -- 휴대폰 국번 체크


5. DEFAULT 정의 -  값 입력이 없으면 기본으로 입력되는 기본 값  

CREATE TABLE userTBL 

( userID  CHAR(8) NOT NULL PRIMARY KEY ,

  userName  NVARCHAR2(10) NOT NULL ,

  birthYear NUMBER(4) DEFAULT -1 NOT NULL --기본 -1 입력

  addr NCHAR(2) DEFAULT '서울' NOT NULL , --기본 서울 입력

  mobile1 CHAR(3) NULL,

  mobile2 CHAR(8) NULL,

  height NUMBER(3) DEFAULT 170 NULL, --기본 170 입력

  mDate    DATE  NULL 

);

또는

ALTER TABLE userTBL

MODIFY birthYear DEFAULT -1; --기본 -1 입력

ALTER TABLE userTBL

MODIFY addr DEFAULT '서울'; --기본 서울 입력

ALTER TABLE userTBL

MODIFY height DEFAULT 170;  --기본 170 입력


2022년 3월 1일 화요일

오라클 기본편 3

1. ROLLUP() - 총합 또는 중간 합계가 필요할 때 사용

//이름과 id별로 합계와 총합을 조회

SELECT id, name SUM(a * b) AS "비용" FROM buyTBL

GROUP  BY ROLLUP  (name, id)


2.  GROUPING_ID() - 함수의 결과가 0이면 데이터, 1이면 합계를 위해 추가된 열

SELECT id, name SUM(a * b) AS "비용", GROUPING_ID(name) AS "추가행 여부" 

FROM buyTBL

GROUP  BY ROLLUP  (name, id)


3. WITH절 비재귀적 CTE 구조

WITH abc(id, total)

AS

( SELECT id, SUM(a * b) FROM buyTBL GROUP BY userID )

SELECT * FROM abc ORDER BY total DESC;


4. WITH절 재귀적 CTE 구조

WITH empCTE(empName, mgrName, dept, empLevel)

AS

(

    (SELECT  emp, manager, department, 0 FROM  empTBL WHERE manager = "없음")

    UNION ALL

    (SELECT empTbl.emp,  emmpTbl.manager, empTbl.department, empCTE.empLevenl + 1

      FROM empTbl INNER  JOIN empCTE ON  empTbl.manager = empCTE.empName)

)

SELECT * FROM empCTE ORDER BY dept, empLevel;

오라클 기본편 2

 1. 중복제거 

//주소가 겹치는 사람은 1개씩만 출력

SELECT DISTINCT addr FROM userTBL;


2. ROWNUM 

//결과값의 5개만 출력

SELECT * FROM 

    (SELECT id, data FROM emp ORDER BY date ASC) WHERE ROWNUM <= 5;


3. SAMPLE(퍼센트)

//전체 결과 값 중 5%의 갯수만큼 출력

SELECT id, data FROM emp WHERE SAMPLE(5);


4. 테이블 복사

CREATE TEBLE 새로운 테이블명 AS (SELECT 복사할 열 FROM 기존 테이블명)


5.  GROUP BY 절 - 그룹으로 묶어주는 역할

SELECT userID, amount FROM buyTBL ORDER BY userID; //userID로 그룹화


6. 집계함수

SUM() 합계

AVG() 평균

MAX() 최대값

COUNT()  행의 갯수

COUNT(DISTINCT) 행의 갯수(중복은 1개만 인정)

STDEV() 표준편차

VARIANCE() 분산

CAST() 데이터 변환 함수


7. HAVING 절 - 집계 함수시 조건절

//총 구매액이 1000원 이상인 값만 출력

SELECT userID AS "사용자", SUM(a * b) AS "총 구매액" FROM buyTBL

GROUP BY userID

HAVING   SUM(a * b) > 1000

오라클 기본편 1

이것이 오라클이다. 공부 요약

설치 버전 : Oracle XE 11g R2 버전
툴 : SQL  Developer 
자료실 : https://cafe.naver.com/thisismysql/610

-SQL 기초-

1. 조회
기본 형식 - SELECT 열이름 FROM 테이블이름 WHERE 조건 

관계 연산자 -  1970년 이후 출생, 키가 182 이상의 아이디와 이름 조회
SELECT userID, userName FROM userTBL WHERE birthYear >= 1970 AND height >= 182;

AND 연산자 - 키가 180~183인 사람 조회
SELECT userName, height FROM userTBL WHERE height BETWEEN 180 AND 183;

OR 연산자 - 경남 이거나 전남인 사람 정보 조회
SELECT userName, addr FROM userTBL WHERE addr='경남' OR addr='전남';

IN 연산자 - 경남, 전남을 포함한 정보 조회
SELECT userName, addr FROM userTBL WHERE addr IN('경남', '전남');

LIKE 연산자 - 문자열 검색을 위한 연산자
SELECT userName, height FROM userTBL WHERE userName LIKE '김%'  //김씨 
SELECT userName, height FROM userTBL WHERE userName LIKE '_종신' //이름이 종신
SELECT userName, height FROM userTBL WHERE userName LIKE '_용%' //두번째가 용

2. 서브 쿼리
쿼리문 안에 쿼리문이 있는 형식
SELECT userName, height FROM userTBL WHERE height > 177 이라면

//김경호 키가 177이상이라는 가정
SELECT userName, height FROM userTBL WHERE height > 
    (SELECT height FROM userTBL WHERE userName = '김경호') 

ANY 연산자 - 서브 쿼리문의 여러 결과 중 한 가지만 만족한 결과면 출력

//경남 출신이면서 키가 170보다 크거나 같은 사람이 출력
SELECT userName, height FROM userTBL WHERE height >= 
     ANY (SELECT height FROM userTBL WHERE addr= '경남') 

ALL 연산자 - 서브 쿼리문의 여러개 결과를 모두 만족한 결과만 출력

//경남 출신이면서 키가 170보다 크거나 같은 사람만 출력
SELECT userName, height FROM userTBL WHERE height >= 
     ALL (SELECT height FROM userTBL WHERE addr= '경남') 

3.  원하는 순서대로 정렬하여 출력
 //날짜 오름차순 정렬
SELECT userName, height FROM userTBL ORDER BY mDate;

//날짜 내림차순 정렬
SELECT userName, height FROM userTBL ORDER BY mDate DESC; 

//키가 큰 순서대로 정렬, 키가 같으면 이름순으로 정열 
SELECT userName , height FROM userTBL ORDER BY height DESC, userName ASC; 

2021년 9월 8일 수요일

초효율 공부법을 읽고

 IT 업계는 항상 공부를 해야만 한다.

하지만 언제나 시간이 부족하다.

그래서 이 책을 구입하고 효율적인 공부법을 배웠다.

내가 보기 위해 요약 정리 한다.

-공부법-

1. 능동 학습 - 전체를 빠르게 읽고, 섞어서 자세히 공부(영어, 수학에 적합)

2. 상기 - 공부 후 스스로 퀴즈를 만들기

3. 분산 학습 - 3가지를 조금씩 나눠서 반복 (영어 -> 수학 -> IT)

4. 청크화 - 의미 있는 것을 묶어서 학습(마인드 맵)

5. 자문 자답 - 주제에 따라 질문 하는 방법을 바꾼다.

6. 티칭 - 공부한 것을 남에게 설명해보기

7. 토론 - 토론한다는 느낌으로 상상하며 공부하기

8. 오감 자극으로 공부(혼잣말, 퀴즈, 타이핑, 쓰기, 그리기, 제스처, 공부 중에도 운동)

9. 부정적 의식 지우기

10. 오버러닝 - 이미 알고 있는 것을 빠르게 반복 학습하고 새로운 지식 습득

-공부 전 준비-

1. 목표 - 자기 초월 목표 세우기(세계 평화 같은 거창한 목표)

2. 준비 - 공부 전 아는 것을 적어보기

3. 호기심 자극, 보상계 자극

4. 배경 음악은 공부를 방해 한다. 

5. 자연은 집중력을 향상 시킨다.

6. 동기부여가 되는 곳에서 공부한다.

-공부 후-

1. 뇌의 집중 모드, 완화 모드를 잘 사용한다.

2. 낮잠을 적극 활용(10~20분), 불가능 하면 눈 감고 뇌의 휴식 시간 활용

3. 공부를 어중간한 곳에서 멈추고 취침 한다.(수면 중에 뇌가 정보 처리)

4. 운동으로 뇌의 기능을 높여라 (공부 전, 후 10분 이상)

5. 생체 리듬에 맞춰 뇌가 피곤을 느끼면 철저하게 쉰다.


2021년 8월 3일 화요일

신경 쓰지 않는 연습을 읽고 있으면서 생각나서 끄적임

 요즘 날씨도 덥고 공부도 잘 안되어서 그동안 미루었던 독서나 하고 있다

지금 일고 있는 책은 "신경 쓰지 않는 연습"

현대는 정보의 홍수 시대다. 정보가 많은 만큼 기본으로(?) 알아야 하는 것도 많고

조금만 뒤쳐져도 사람들에게 무시(?) 당하는 이상한 시대다

나는 어렸을 때는 너무 무신경해서 연예인이고 뉴스고 아는게 하나도 없었다.

그래서 어린 시절에 다들 해봤던 것들도 나는 안해봐서 대화가 잘 안되긴 한다.

그래서 무리해서 요즘은 잘 아는 사람이 되려고 노력 했더니 선천적(?)으로 이런걸 잘 안했던 사람이라 요즘 좀 피로함을 느낀다.

나는 원래 혼자 별보고, 혼자 생각하고, 연구하는 걸  좋아하는 타입이다.

어렸을 때는 혼자 각종 실험도구(?)로 이것저것 실험을 하고, 독서를 하던 아이였다.

근데 그것을 억지로 바꾸려고 하니 요즘 약간 현타가 왔다.

사람들은 왜 타인을 무시를 할까? 다들 자기 먹고 살기 힘들어서 타인은 이용하고 버리는 도구로만 여기는 것인가?

나는 권선징악을 믿는 사람이다. 실제로도 악한 인간들이 x되는 걸 수 없이 봐왔다.

그 순간 웃는 사람보다 마지막까지 웃는 사람이 진정한 위너인데.

점점 성경 말씀대로 이루어지는 것 같아 무섭기도 하다

마태복음 24장 3~14절에는 다음과 같은 구절이 있다.

3- 예수께서 감람 산 위에 앉으셨을 때에 제자들이 조용히 와서 이르되 우리에게 이르소서 어느 때에 이런 일이 있겠사오며 또 주의 임하심과 세상 끝에는 무슨 징조가 있사오리이까
4- 예수께서 대답하여 이르시되 너희가 사람의 미혹을 받지 않도록 주의하라
5- 많은 사람이 내 이름으로 와서 이르되 나는 그리스도라 하여 많은 사람을 미혹하리라

6- 난리와 난리 소문을 듣겠으나 너희는 삼가 두려워하지 말라 이런 일이 있어야 하되 아직 끝은 아니니라
7- 민족이 민족을, 나라가 나라를 대적하여 일어나겠구 곳곳에 기근과 지진이 있으리니
8- 이 모든 것은 재난의 시작이니라

9- 그 때에 사람들이 너희를 환난에 넘겨 주겠으며 너희를 죽이리니 너희가 내 이름 때문에 모든 민족에게 미움을 받으리라
10- 그 때에 많은 사람이 실족하게 되어 서로 잡아 주고 서로 미워하겠으며
11- 거짓 선지자가 많이 일어나 많은 사람을 미혹하겠으며

12- 불법이 성하므로 많은 사람의 사랑이 식어지리라
13- 그러나 끝까지 견디는 자는 구원을 얻으리라
14- 이 천국 복음이 모든 민족에게 증언되기 위하여 온 세상에 전파되리니 그제야 끝이 오리라

현재를 너무 표현 한 것 같아 놀라울 뿐이다.