230330 TIL

2023. 3. 30. 22:44국비지원학원 oracle

1. 게시판 관리( SEQUENCE 시퀀스 생성/ ROW_NUMBER/ 관찰)

--ㅇSEQUENCE 시퀀스: 자동으로 순차적으로 증가하는 순번을 RETURN 해줌

EX) 게시판에 글을 쓸 때 이전 글 ID 값에 +1 을 하여 고유 ID를 부여한다고 할 때,

로직 짤 필요 없이 자동으로 RETURN 해줌

 

--TBL_AAA 테이블 생성, 수정 시도, 삭제

--ㅇ 테이블 생성
-- # 관찰
CREATE TABLE TBL_AAA
(NO      NUMBER
,NAME    VARCHAR2(40)
,GRADE   CHAR
);
-- ==>> Table TBL_AAA이(가) 생성되었습니다.

--ㅇ 데이터 삽입
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(1, '한아현', 'A');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(2, '최하경', 'B');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(3, '강별희', 'A');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(4, '주수인', 'C');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(5, '문상훈', 'A');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(6, '한아현', 'B');
INSERT INTO TBL_AAA(NO, NAME, GRADE) VALUES(7, '한아현', 'B');

--==>> 1 행 이(가) 삽입되었습니다. * 7

--ㅇ 커밋
COMMIT;
--==>> 커밋 완료.

SELECT *
FROM TBL_AAA;
/*
1	한아현	A
2	최하경	B
3	강별희	A
4	주수인	C
5	문상훈	A
6	한아현	B -----> 이 데이터를 고치고 싶다고 할 때
7	한아현	B
*/
--위 숫자 데이터는 시퀀스가 자동으로 부여해준 ID


--ㅇ 수정 시도

--ㅇ UPDATE 
--이름이 한아현인 친구들 성적 A로 바꾸고 싶음, 우리는 6번 아현이만 고치고싶어!
UPDATE TBL_AAA --1
SET GRADE = 'A' --3
WHERE NAME = '한아현'; --2

--6번 아현이 고치고싶어서 성적 B인 애들 검색.
UPDATE TBL_AAA --1
SET GRADE = 'A' --3
WHERE GRADE = 'B'; --2

--두 조건 만족하는 6번 아현이만 바꾸고 싶음 . 그것도 2명임!!--> 이 조건으로는 UPDATE 사용 불가능함
UPDATE TBL_AAA --1
SET GRADE = 'A' --3
WHERE NAME = '한아현' AND GRADE = 'B'; --2 --> 고유 ID NO의 필요성을 보여주기 위해 관찰함

--ㅇ 관찰 완료, 테이블 삭제
DELETE
FROM TBL_AAA;

 

 

-- SEQ_BOARD 시퀀스와 게시판 TBL_BOARD 테이블 생성 후 고유번호 관찰 + ROW_NUMBER 로 줄세우기

--ㅇ SEQUENCE 생성(시퀀스, 주문번호)
-- -> 사전적인 의미: 1.(일련의) 연속적인 사건들   2.(사건, 행동 등의) 순서


--ㅇ 시퀀스 생성
-- SEQUENCE 
CREATE SEQUENCE SEQ_BOARD -- 시퀀스 기본 생성 구문(MSSQL 의 IDENTITY 와 동일한 개념)
START WITH 1              -- 시작값
INCREMENT BY 1            -- 증가값
NOMAXVALUE                -- 최대값 (크기 지정/ NOMAXVALUE -> 제한없음)
NOCACHE;                  -- 우리는 캐시 사용안함
--==>> Sequence SEQ_BOARD이(가) 생성되었습니다.

--캐시 = 은행 번호표의 비유, 12345 인데 34가 안오면 바로 5번임 
--장점 : 미리 대기표 뽑아놔서 대기열 없음(빠름). 대신 34가 없어짐
--우리가 했던 것처럼 캐시 사용안하면 대기열은 있지만 34가 비진 않음...


--ㅇ 게시판 테이블 생성
CREATE TABLE TBL_BOARD          -- TBL_BOARD 이름의 테이블 생성 -> 게시판
( NO          NUMBER            --게시물 번호    X--(사용자가 입력X)
, TITLE       VARCHAR2(50)      -- 게시물 제목   O--(사용자가 입력ㅇ)
, CONTENTS    VARCHAR2(2000)    -- 게시물 내용   O
, NAME        VARCHAR2(30)      -- 게시물 작성자 △
, PW          VARCHAR2(40)      -- 게시물 패스워드 △
, CREATED     DATE DEFAULT SYSDATE -- 게시물 작성일 X
);
--==>> Table TBL_BOARD이(가) 생성되었습니다.


--ㅇ 게시판에 데이터 입력 -> 게시판에 게시물을 작성하는 상황
INSERT INTO TBL_BOARD VALUES
(게시물번호, 게시물제목, 게시물내용, 작성자, 패스워드, 작성일);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '좋은아침입니다','화이팅합시다', '김기민', 'java006$', DEFAULT); --시퀀스가 발행해주는 VALUE 를 게시물번호로
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '건강관리','다들 건강 챙깁시다', '권희정', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '오늘은','점심 뭐 먹지...', '문상훈', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '술은','평일에 마시지 말아야지', '김재혁', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '오늘은','좀 많이 웃어야지', '김지혜', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '여러분','오타조심하세요', '윤희주', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '미세먼지','오늘은 좀 화창하네', '양연수', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '지하철','난 정말 지하철이 싫어요', '최하경', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '질문있습니다','생각나면 다시 질문할게요', '강별희', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '여기서는','칠판이 잘 안보여요', '한아현', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.


--ㅇ 확인
SELECT *
FROM TBL_BOARD;
/*
    1	좋은아침입니다	화이팅합시다	            김기민	java006$    23/03/30
    2	건강관리	        다들 건강 챙깁시다	    권희정	java006$    	23/03/30
    3	오늘은	        점심 뭐 먹지...	        문상훈	java006$	    23/03/30
    4	술은	평일에      마시지 말아야지	        김재혁	java006$	    23/03/30
    5	오늘은	        좀 많이 웃어야지	        김지혜	java006$	    23/03/30
    6	여러분	        오타조심하세요	        윤희주	java006$	    23/03/30
    7	미세먼지	    오늘은 좀 화창하네	    양연수	java006$	    23/03/30
    8	지하철	        난 정말 지하철이 싫어요	최하경	java006$	    23/03/30
    9	질문있습니다	    생각나면 다시 질문할게요	강별희	java006$	    23/03/30
    10	여기서는	    칠판이 잘 안보여요	    한아현	java006$	    23/03/30
*/

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.

--ㅇ 커밋
COMMIT;
--==>> 커밋 완료.


--게시판에 게시물 작성과 삭제를 반복하며 글 번호 NO 가 어떻게 변하는지 관찰
--ㅇ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO=4;
--==>> 1 행 이(가) 삭제되었습니다.

--ㅇ 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '저는요','글자가 작은게 좋아요', '박건우', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

--ㅇ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO=8;
--==>> 1 행 이(가) 삭제되었습니다.

--ㅇ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO=2;
--==>> 1 행 이(가) 삭제되었습니다.

--ㅇ 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '이제는','속이 아주 편해졌어요', '이기배', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

--ㅇ 커밋
COMMIT;
--==>>커밋 완료.

--ㅇ 확인
SELECT *
FROM TBL_BOARD;
/*
1	좋은아침입니다	화이팅합시다	            김기민	java006$    	2023-03-30
3	오늘은	        점심 뭐 먹지...	        문상훈	java006$    	2023-03-30
5	오늘은	        좀 많이 웃어야지	        김지혜	java006$    	2023-03-30
6	여러분	        오타조심하세요	        윤희주	java006$	    2023-03-30
7	미세먼지	    오늘은 좀 화창하네	    양연수	java006$	    2023-03-30
9	질문있습니다	    생각나면 다시 질문할게요	강별희	java006$	    2023-03-30
10	여기서는	    칠판이 잘 안보여요	    한아현	java006$    2023-03-30
11	저는요	        글자가 작은게 좋아요	    박건우	java006$	    2023-03-30
12	이제는	        속이 아주 편해졌어요	    이기배	java006$	    2023-03-30
*/


--# 위 사례처럼 게시판의 게시물 번호를
--  SEQUENCE 나 IDENTITIY 를 사용하게 되면
--  게시물을 삭제했을 경우, 삭제한 게시물의 자리에
--  다음 번호를 가진 게시물이 등록되는 상황이 발생하게 된다
--  이는, 보안 측면에서나...미관상 바람직하지 않은 상황일 수 있기 때문에
--  ROW_NUMBER() 의 사용을 고려할 수 잇다.
--  관리의 목적으로 사용할 때에는 SEQUENCE 나 IDENTITY 를 사용하지만
--  단순히 게시물을 보기 편하도록 목록화하여 사용자에게 리스트 형식으로 보여줄 때는
--  사용하지 않는게 좋다

--ㅇ ROW_NUMBER() 사용, 게시물 작성, 삭제하며 고유번호 관찰
SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
       , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD
ORDER BY 4 DESC;
--==>>
/*
9	이제는	        이기배	2023-03-30
8	저는요	        박건우	2023-03-30
7	여기서는	    한아현	2023-03-30
6	질문있습니다	    강별희	2023-03-30
5	미세먼지	    양연수	2023-03-30
4	여러분	        윤희주	2023-03-30
3	오늘은	        김지혜	2023-03-30
2	오늘은	        문상훈	2023-03-30
1	좋은아침입니다	김기민	2023-03-30
*/

--ㅇ 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '오늘은','숨기지 않았어요', '최이서', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
       , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD
ORDER BY 4 DESC;
/*
10	오늘은	        최이서	2023-03-30
9	이제는	        이기배	2023-03-30
8	저는요	        박건우	2023-03-30
7	여기서는	    한아현	2023-03-30
6	질문있습니다	    강별희	2023-03-30
5	미세먼지	    양연수	2023-03-30
4	여러분	        윤희주	2023-03-30
3	오늘은	        김지혜	2023-03-30
2	오늘은	        문상훈	2023-03-30
1	좋은아침입니다	김기민	2023-03-30
*/

--ㅇ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO=7;

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
       , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD
ORDER BY 4 DESC;
/*
9	오늘은	        최이서	2023-03-30
8	이제는	        이기배	2023-03-30
7	저는요	        박건우	2023-03-30
6	여기서는	    한아현	2023-03-30
5	질문있습니다	    강별희	2023-03-30
4	여러분	        윤희주	2023-03-30
3	오늘은	        김지혜	2023-03-30
2	오늘은	        문상훈	2023-03-30
1	좋은아침입니다	김기민	2023-03-30
*/

--ㅇ 커밋
COMMIT;
--==>> 커밋 완료.

결론: SEQUENCE 를 생성하여 게시물에 자동으로 고유 값을 부여하고, 

         미관을 위해 조건에 따라 각 행에 번호를 붙여주는 ROW_NUMBER 를 사용한다.

 

 

2. JOIN 조인

-- ㅇ 조인이란?

-- 각각의 독립적인 테이블들에 흩어진 데이터들을 조합하여 통합적 테이블을 만들어냄

--메모리를 효율적으로 가져오기 위해 정규화(큰 테이블 작은 조각 테이블들로 쪼개기) 를 하는데
-- 이때 여러 테이블에 흩어진 데이터들을 조합해서 가져오는 기술

 

--ㅇ SQL 1992 CODE 버전의 JOIN ( EQUI JOIN/ NON-EQUI JOIN/ EQUI JOIN 수행 시 [+] 를 활용한 결합 방법)

--ㅇ 아래와 같은 테이블 EMP 와 DEPT 가 있다고 가정. 조회
SELECT *
FROM EMP;
/*
     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17        800                    20
      7499 ALLEN      SALESMAN        7698 1981-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22       1250        500         30
      7566 JONES      MANAGER         7839 1981-04-02       2975                    20
      7654 MARTIN     SALESMAN        7698 1981-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 1981-05-01       2850                    30
      7782 CLARK      MANAGER         7839 1981-06-09       2450                    10
      7788 SCOTT      ANALYST         7566 1987-07-13       3000                    20
      7839 KING       PRESIDENT            1981-11-17       5000                    10
      7844 TURNER     SALESMAN        7698 1981-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 1987-07-13       1100                    20
      7900 JAMES      CLERK           7698 1981-12-03        950                    30
      7902 FORD       ANALYST         7566 1981-12-03       3000                    20
      7934 MILLER     CLERK           7782 1982-01-23       1300                    10
*/


SELECT *
FROM DEPT;
/*

    DEPTNO DNAME          LOC          
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK     
        20 RESEARCH       DALLAS       
        30 SALES          CHICAGO      
        40 OPERATIONS     BOSTON       
*/


--ㅇ EQUI JOIN : 서로 정확히 일치하는 데이터들끼리 관계를 구성하여 연결시키는 결합

SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

/*
7782	CLARK	MANAGER	7839	1981-06-09	2450		10	10	ACCOUNTING	NEW YORK
7839	KING	PRESIDENT		1981-11-17	5000		10	10	ACCOUNTING	NEW YORK
7934	MILLER	CLERK	7782	1982-01-23	1300		10	10	ACCOUNTING	NEW YORK
7566	JONES	MANAGER	7839	1981-04-02	2975		20	20	RESEARCH	DALLAS
7902	FORD	ANALYST	7566	1981-12-03	3000		20	20	RESEARCH	DALLAS
7876	ADAMS	CLERK	7788	1987-07-13	1100		20	20	RESEARCH	DALLAS
7369	SMITH	CLERK	7902	1980-12-17	800		20	20	RESEARCH	DALLAS
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20	20	RESEARCH	DALLAS
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30	30	SALES	CHICAGO
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30	30	SALES	CHICAGO
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30	30	SALES	CHICAGO
7900	JAMES	CLERK	7698	1981-12-03	950		30	30	SALES	CHICAGO
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30	30	SALES	CHICAGO
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30	30	SALES	CHICAGO
*/



--ㅇ NON-EQUI JOIN : 범위 안에 포함되는 적합한 데이터들끼리 연결시키는 결합
					--(범위 내를 찾는 것이기에 완전 일치 데이터는 찾기 어려움)

SELECT *
FROM SALGRADE;
SELECT *
FROM EMP;

SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; --최저 급여 --최고급여 사이면 출력
/*
7369	SMITH	CLERK	7902	1980-12-17	800		20	1	700	1200
7900	JAMES	CLERK	7698	1981-12-03	950		30	1	700	1200
7876	ADAMS	CLERK	7788	1987-07-13	1100		20	1	700	1200
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30	2	1201	1400
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30	2	1201	1400
7934	MILLER	CLERK	7782	1982-01-23	1300		10	2	1201	1400
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30	3	1401	2000
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30	3	1401	2000
7782	CLARK	MANAGER	7839	1981-06-09	2450		10	4	2001	3000
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30	4	2001	3000
7566	JONES	MANAGER	7839	1981-04-02	2975		20	4	2001	3000
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20	4	2001	3000
7902	FORD	ANALYST	7566	1981-12-03	3000		20	4	2001	3000
7839	KING	PRESIDENT		1981-11-17	5000		10	5	3001	9999
*/




--ㅇ EQUI JOIN 수행 시 [+] 를 활용한 결합 방법

-- [+] 를 사용하지 않은 CASE 관찰

SELECT *
FROM TBL_EMP E, TBL_DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--==>>
/*
7369	SMITH	CLERK	7902	1980-12-17	800		20	20	RESEARCH	DALLAS
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30	30	SALES	CHICAGO
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30	30	SALES	CHICAGO
7566	JONES	MANAGER	7839	1981-04-02	2975		20	20	RESEARCH	DALLAS
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30	30	SALES	CHICAGO
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30	30	SALES	CHICAGO
7782	CLARK	MANAGER	7839	1981-06-09	2450		10	10	ACCOUNTING	NEW YORK
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20	20	RESEARCH	DALLAS
7839	KING	PRESIDENT		1981-11-17	5000		10	10	ACCOUNTING	NEW YORK
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30	30	SALES	CHICAGO
7876	ADAMS	CLERK	7788	1987-07-13	1100		20	20	RESEARCH	DALLAS
7900	JAMES	CLERK	7698	1981-12-03	950		30	30	SALES	CHICAGO
7902	FORD	ANALYST	7566	1981-12-03	3000		20	20	RESEARCH	DALLAS
7934	MILLER	CLERK	7782	1982-01-23	1300		10	10	ACCOUNTING	NEW YORK
*/
--> 총 14건의 데이터가 결합되어 조회된 상황

SELECT *
FROM TBL_EMP;
-- 인턴사원 5명(부서번호 없음) 은 조회되지 않는다. 부서 번호가 없어 연결이 불가능
-- 즉, 이 경우 부서번호를 갖지 못한 사원들은(5인) 모두 누락~!!



--ㅇ EQUI JOIN 수행 시 [+] 를 활용한 결합 
SELECT *
FROM TBL_EMP E, TBL_DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);
      --------   -----------
    -- 주재료      +1 부재료 (비유)
    -- 주재료에 +a 로 주재료 데이터와 일치하는 부재료 조각을 연결한다
    -- 부재료(부서정보) NULL 이어도 주재료(사원정보)에 갖다붙임
    -- 일반 EQUI JOIN 과 달리 주재료 값이 NULL 이어도(연결될 데이터가 없어도) 누락없이 연결됨
--==>>
/*
7934	MILLER	CLERK	7782	1982-01-23	1300		10	10	ACCOUNTING	NEW YORK
7839	KING	PRESIDENT		1981-11-17	5000		10	10	ACCOUNTING	NEW YORK
7782	CLARK	MANAGER	7839	1981-06-09	2450		10	10	ACCOUNTING	NEW YORK
7902	FORD	ANALYST	7566	1981-12-03	3000		20	20	RESEARCH	DALLAS
7876	ADAMS	CLERK	7788	1987-07-13	1100		20	20	RESEARCH	DALLAS
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20	20	RESEARCH	DALLAS
7566	JONES	MANAGER	7839	1981-04-02	2975		20	20	RESEARCH	DALLAS
7369	SMITH	CLERK	7902	1980-12-17	800		20	20	RESEARCH	DALLAS
7900	JAMES	CLERK	7698	1981-12-03	950		30	30	SALES	CHICAGO
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30	30	SALES	CHICAGO
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30	30	SALES	CHICAGO
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30	30	SALES	CHICAGO
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30	30	SALES	CHICAGO
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30	30	SALES	CHICAGO
8005	윤희주	SALESMAN	7698	2023-03-28	1000					
8004	양연수	SALESMAN	7698	2023-03-28	2500					
8003	최하경	SALESMAN	7698	2023-03-28	2000					
8002	유서영	CLERK	7556	2023-03-28	1000	0				
8001	최이서	CLERK	7556	2023-03-28	1500	10				
*/
--> 총 19건의 데이터가 결합되어 조회된 상황
--  즉, 부서번호를 갖지못한(null) 사원 5인 모두 조회된 상황~!!


SELECT *
FROM TBL_EMP E, TBL_DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO;
--    ----------    --------
---      부재료       주재료
/*
7369	SMITH	CLERK	7902	1980-12-17	800		20	20	RESEARCH	DALLAS
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30	30	SALES	CHICAGO
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30	30	SALES	CHICAGO
7566	JONES	MANAGER	7839	1981-04-02	2975		20	20	RESEARCH	DALLAS
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30	30	SALES	CHICAGO
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30	30	SALES	CHICAGO
7782	CLARK	MANAGER	7839	1981-06-09	2450		10	10	ACCOUNTING	NEW YORK
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20	20	RESEARCH	DALLAS
7839	KING	PRESIDENT		1981-11-17	5000		10	10	ACCOUNTING	NEW YORK
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30	30	SALES	CHICAGO
7876	ADAMS	CLERK	7788	1987-07-13	1100		20	20	RESEARCH	DALLAS
7900	JAMES	CLERK	7698	1981-12-03	950		30	30	SALES	CHICAGO
7902	FORD	ANALYST	7566	1981-12-03	3000		20	20	RESEARCH	DALLAS
7934	MILLER	CLERK	7782	1982-01-23	1300		10	10	ACCOUNTING	NEW YORK
								40	OPERATIONS	BOSTON
*/
--> 총 15건 데이터가 결합돼 조회된 상황
-- 위 케이스와 반대로 부재료(사원정보) NULL 이어도 주재료(부서정보)에 갖다붙임
-- 즉, 부서에 소속된 사원이 아무도 없는 부서(1개, 40번) 도 모두 조회된 상황~!!


--# + 가 없는 쪽 테이블의 데이터를 모두 메모리에 우선 적재한 후
--  + 가 있는 쪽 테이블의 데이터를 하나하나 확인하여 결합시키는 형태로
--  JOIN 이 이루어진다

SELECT *
FROM TBL_EMP E, TBL_DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO(+); --(X)
-- 이런 쿼리는 존재하지 않음

 

 

--ㅇ SQL 1999 CODE  버전 : INNER JOIN/ OUTER JOIN(LEFT, RIGHT, FULL)

----  [JOIN ] 키워드 등장

---    결합 조건은 WHERE 대신 ON

--ㅇ INNER JOIN 
-- 두 테이블의 교집합
--

3. UNION/ UNION ALL

'국비지원학원 oracle' 카테고리의 다른 글

오라클 팀 프로젝트  (0) 2023.04.23
230328 TIL  (0) 2023.03.30
230329 TIL  (0) 2023.03.29
230323  (0) 2023.03.28
230322 테이블플레이스, 칼럼조회  (0) 2023.03.28