[Oracle/SQL] JOIN, 서브쿼리, 뷰, 테이블

2023. 6. 14. 20:56DB/SQL

💬 기억하고 싶거나 공부한 내용을 기록중입니다 :)   개인적으로 기억하고 싶은 내용들을 적어두고 있습니다.

 

1️⃣ JOIN

 

1. EQUI JOIN

- (=) 이용하는 조인, 두 테이블에 공통 컬럼 값을 가지고 있는 경우 사용하는 조인이다.

SELECT COLUMNNAME(A), COLUMNNAME(B), COLUMNNAME(C), ,,,
FROM TABLENAME A, TABLENAME B
WHERE A.공통COLUMNNAME = B.공통COLUMNNAME;

2. INNER JOIN ON

- 내부 조인의 경우, 조인하는 테이블에 지정한 열의 데이터가 모두 있어야 한다

SELECT A.COLUMNNAME(A), B.COLUMNNAME(B), ,,,
FROM TABLENAME A INNER JOIN TABLENAME B
ON A.공통COLUMNNAME = B.공통COLUMNNAME;

3. NATURAL JOIN

SELECT A.COLUMNNAME(A), B.COLUMNNAME(B), COLUMNNAME(common)
FROM TABLENAME A NATURAL JOIN TABLENAME B;		-- WHERE절 사용 가능

4. JOIN USING

SELECT A.COLUMNNAME(A), B.COLUMNNAME(B), COLUMNNAME(common)
FROM TABLENAME A JOIN TABLENAME B
USING (COLUMNNAME(common)) ;

5. OUTER JOIN 

- 외부 조인, 조인하는 두 테이블의 경우, 하나의 테이블에만 데이터가 있어도 결과가 출력된다

1) (+)

-- (예시) A테이블의 결과가 다 나오도록 있도록 (+) 처리
SELECT A.COLUMNNAME(A), B.COLUMNNAME(B)
FROM TABLENAME A, TABLENAME B
WHERE A.COLUMNNAME(common)(+) = B.COLUMNNAME(common);

2) FULL/RIGHT/LEFT OUTER JOIN

SELECT A.COLUMNNAME(A), B.COLUMNNAME(B)
FROM TABLENAME A FULL/RIGHT/LEFT OUTER JOIN TABLENAME B
ON A.COLUMNNAME(common) = B.COLUMNNAME(common);

6. NON EQUI JOIN

- 두 테이블에서 사용되는 컬럼의 값들이 정확히 일치하지 않더라도, 출력할 수 있다는 특징이 있다.

SELECT A.COLUMNNAME(A), B.COLUMNNAME(B), B.COLUMNNAME(C)
FROM TABLENAME A, TABLENAME B
WHERE A.COLUMNNAME BETWEEN B.COLUMNNAME(B) AND B.COLUMNNAME(C);

7. SELF JOIN

SELECT A.NO, A.NAME, B.NO_JOB
FROM TABLE(A) 별칭(여기서는 'A'), TABLE(A) 별칭(여기서는 'B')
WHERE A.NO = B.NO_JOB;

 

2️⃣ 서브쿼리

 

- 정의 : SQL 문장 (예: UPDATE, SELECT) 안에서 보조로 사용되는 SELECT문

- 유형

1) 스칼라 서브쿼리:  메인쿼리문 중 SELECT문에서 사용되는 서브쿼리

2) 인라인 뷰 : FROM절에서 사용되는 서브쿼리

3) WHERE절

- 서브쿼리 예시

SELECT COLUMNAME(a), (SELECT COLUMNNAME(b) FROM TABLENAME WHERE COLUMNNAME(b) > 3500) -- 스칼라
FROM (SELECT SUBSTR(COLUMNAME(c),1,3) FROM TABLENAME WHERE COLUMNNAME(d) <=2500)      -- 인라인뷰
GROUP BY COLUMNAME(a);

3️⃣ 뷰

- 정의 : 가상 테이블, 다른 테이블이나 다른 뷰의 데이터를 볼 수 있게 하는 데이터베이스 객체를 의미한다. 

- 활용

-- 1. VIEW 생성 또는 수정
CREATE [OR REPLACE] VIEW VIEWNAME
AS
SELECT COLUMNNAME(a), COLUMNNAME(b), COLUMNNAME(c)
FROM TABLENAME;
where COLUMNAME(b) = (select COLUMNAME(b) FROM TABLENAME WHERE COLUMNNAME(c) <= 5000); 
            
-- 2. VEIW 삭제
DROP VIEW VIEWNAME;

-- 3. VIEW 자체 조회
SELECT VIEWNAME FROM USER_VIEWS;

-- 4. 생성된 VIEW 내용 조회
SELECT * FROM VIEWNAME;

/*
5. VIEW 내용 입력 : 테이블도 뷰도 수정된다
6. VIEW 내용 수정 : 테이블 내용은 수정되지만, 
		뷰 생성시 조건이 다를 경우 수정된 내용이 출력되지 않는다. */

 

4️⃣ 테이블

 

1. 테이블 생성, 제거 등

-- 1-1. TABLENAME에서 COLUMNNAME(A), COLUMNNAME(B), COLUMNNAME(C)의 '구조'만 복사
CREATE TABLE TABLENAME
AS
SELECT COLUMNNAME(A), COLUMNNAME(B), COLUMNNAME(C)
FROM TABLENAME
WHERE 1=2;  -- 예를 들어

-- 1-2. TABLENAME에서 COLUMNNAME(A), COLUMNNAME(B), COLUMNNAME(C)의 '구조'와 '데이터'를 복사
CREATE TABLE TABLENAME
AS
SELECT COLUMNNAME(A), COLUMNNAME(B), COLUMNNAME(C)
FROM TABLENAME;

-- 2-1. 테이블 내용 제거(DELETE FROM 이용)
DELETE FROM TABLENAME;
ROLLBACK;   -- 가능성 있음

-- 2-2. 테이블 내용 제거(ROLLBACK 이용)
TRUNCATE TABLE TABLENAME;
ROLLBACK;   -- 가능성 없음!!

-- 3. 테이블 자체 제거
DROP TABLE TABLENAME;

-- 4. 테이블 수정 (제약조건을 예시로)
ALTER TABLE TABLENAME
    ADD CONSTRATINT 제약조건NAME NOT NULL;
ALTER TABLE TABLENAME
    MODIFY COLUMNNAME CONSTRATINT 제약조건NAME NOT NULL;
ALTER TABLE TABLENAME    
    DROP contraint 제약조건NAME;

2. 다중테이블 데이터 입력

INSERT ALL	-- 또는 FIRST
    WHEN CONDITION1 THEN
        INTO TABLENAME(COLUMNNAME) VALUES(VALUE..)
    WHEN CONDITION2 THEN
        INTO TABLENAME(COLUMNNAME) VALUES(VALUE..)
    ELSE
        INTO TABLENAME(COLUMNNAME) VALUES(VALUE..)
SUB-QUERY;

3. 제약조건

CREATE TABLE TABLENAME(
    T_NO		NUMBER(4)		CONSTRAINT TABLENAME_TNO_PK PRIMARY KEY,
    T_PHONE		NUMBER(15)		CONSTRAINT TABLENAME_TPHONE_UK UNIQUE KEY,
    T_NAME		VARCHAR2(30)		CONSTRAINT TABLENAME_TNAME_NN NOT NULL,
    T_FAM		NUMBER(1000)		CONSTRAINT TABLENAME_TFAM_CK CHECK(T_FAM>=0),
    T_DATE		DATE			DEFAULT SYSDATE
    A_NO		NUMBER(4)		CONSTRAINT TABLENAME_ANO_FK FOREIGN KEY
    ON DELETE CASCADE		

    /* on delete cascade (구글 참조)
       when any entry is deleted from the parent table 
       then all the dependent rows in the child table should also get deleted */
);
COMMENT ON COLUMN "UESRNAME"."TABLENAME"."T_NO" IS 'Primary key of TABLENAME TABLE.';

- primary key : 유일하고 null이 아닌 값이 들어간다. 테이블을 대표하는 특징이 있다.

- unique key : 유일한 값이며, 중복될 수 없는 특징을 가지고 있다.

- not null : null 값이 입력되지 않도록 하기 위해 사용된다.

- check : 입력할 수 있는 범위를 제한하는 특징이 있다.

- foreign key : 다른 테이블과 연결시켜준다(reference).

 

'DB > SQL' 카테고리의 다른 글

[Oracle] Oracle 19C, ojdbc.jar  (0) 2023.09.28
[Oracle/SQL] Procedure과 Function  (1) 2023.06.19
[Oracle/SQL] SQL Developer  (0) 2023.06.08
[Oracle/SQL] DML(ArrayList 이용)  (0) 2023.06.07
[Oracle/SQL] DML, Sequence  (1) 2023.06.06