oracle

22일차 2023-04-06

choi Hoon 2023. 4. 6. 18:36

1. OUTER JOIN

OUTER JOIN은 INNER JOIN과는 달리 두 테이블에 조인 조건이 정확히 일치하지 않더라도
어느 한쪽 테이블에서 결과값을 모두 가져오는 JOIN문

 


OUTER JOIN문을 사용할때는 반드시 OUTER 전에 데이터를 어느 쪽 테이블에서 
가져올지 즉 왼쪽인지(LEFT) 오른쪽인지(RIGHT) 아니면 양쪽 테이블(FULL)인지 
반드시 기술. (NULL값을 가져올 수 있음)

자식을 기준으로 아웃터 조인하면 INNER조인과 같다.
그래서 보통 부모를 기준으로 아웃터 조인한다.
공통 컬럼도 부모 기준으로 SELECT 한다
관계형 데이타베이스에서는 Full outer조인은 의미 없다

 

-LEFT OUTER JOIN

JOIN문 왼쪽을 중심으로 왼쪽에 있는 테이블에서 데이터를 모두 가져온다.

 사용구문:
   
     SELECT 컬럼명…..
     From 테이블명1  LEFT OUTER JOIN 테이블명2 
     ON 조인 조건

-RIGHT OUTER JOIN

JOIN문 오른쪽을 중심으로 오른쪽에 있는 테이블에서 데이터를 모두 가져온다.


     SELECT 컬럼명…..
     From 테이블명1  RIGHT OUTER JOIN 테이블명2 
     ON 조인 조건

-FULL OUTER JOIN


관계형 데이타베이스에서는 Full outer조인은 의미 없다


JOIN문 양쪽에 있는 모든 테이블에서 데이터를 모두 가져온다.

     SELECT 컬럼명…..
     From 테이블명1  FULL OUTER JOIN 테이블명2 
     ON 조인 조건

 

2. 서브커리

 

-서브쿼리는 다른 하나의 SQL문장 안에 기술된 SELECT문장을 말한다.

  -서브쿼리는 괄호로 묶어야 한다.

  -서브쿼리만을 단독 실행 시 실행이 되어야 한다.

  -두 종류의 연산자가 서브쿼리에 사용된다.

   =,>,>=,<,<=,<>,!=(단일행 연산자)  혹은 IN, NOT IN(복수행 연산자)등
 
  -서브퀴리는 연산자의 오른쪽에 기술되어야 한다.
 
  -단일행 서브 쿼리에는 단일행 연산자를 다중행 서브쿼리에는 복수행 연산자를 사용한다

  -서브쿼리는 SELECT절, FROM절 WHERE절 등에 위치할 수 있다.

 

 

3. 탑커리

 

- 얻어진 질의 결과에서 위에서부터 순서대로 몇 개만 가져오는 경우에 사용함

- 데이타가 입력된 순서대로 혹은 
  서브퀴리에 의해 생성된 테이블에 레코드가 생성된 순서대로 
  내부적으로  번호가 순차적으로 부여되고 그 부여된 번호는 
  ROWNUM이라는 컬럼에 내부적으로 저장되어 있다.

 

행의 데이터를  rownum이라는 칼럼으로 위에서 몇 개를 선택하여 가져오는 것

 

-서브쿼리 이용

- 위에서부터 3개

Select  * From  (
  Select  *   From 테이블명 Order By PK컬럼명 Desc

Where rownum <= 3 ORDER BY PK컬럼명 Desc;

 

- 특정 구간에 있는 레코드 (Between A and B 이용)

SELECT * 
FROM 
           ( 
            Select a.*,rownum num -서브쿼리
                     FROM (
                        Select * from employees order by salary desc(서브쿼리 안의 서브쿼리)
                                    ) a
            )  
            WHERE num between 11 and 20

 

방법:

STEP1] 서브쿼리 안의 서브쿼리는 특정 컬럼(보통 PK컬럼)으로 ORDER BY DESC
              그리고 생성된 테이블 별칭을 부여

 

STEP2] 서브쿼리안의 SELECT절에서 STEP1의 별칭.*,ROUNUM 컬럼별칭
             을 기술한다

STEP3] 밖의 WHERE절에서 ROWNUM을 별칭한 이름으로 between a and b 한다.

 

 

3. 테이블 생성

 

3-1). 생성 방법

CREATE TABLE  테이블명(
          컬럼명1  자료형1 [NOT NULL],   
          컬럼명2  자료형2 [NOT NULL],
                       ------------------
          컬럼명N 자료형N
   [,PRIMARY KEY (컬럼명)]
   )

 

3-2). 테이블 이름 및 컬럼 명명규칙

-문자로 시작한다
-30자 이내로 지정한다
-동일한 이름을 사용할 수 없다 또한 예약어도 사용할 수 없다
-대소문자를 구별하지 않는다

 

3-3). 테이블 생성 시 제약 조건

기본 키(Primary Key) : 
-참조무결성을 유지하기 위한 제약조건이다

=> 참조무결성이란 pk값 (10,20,30)이 있는데 fk로 40을 참조하려 하면 오라클이 참조하지 못한다고 오류가 뜬다)

 

-하나의 데이블에는 하나의 PK만 존재한다.(고유)

=>한 레코드에 대해 두 개의 값이 존재하면 레코드 간 관계를 설정하기 복잡해짐. 이럴 땐 복합키 생성이 더 좋음

 

-PK로 설정되면 그 칼럼은 값이 중복되거나 NULL을 허용하지 않는다.

=> 중복 방지(not duplicate)와 값이 존재 (not null)를 말함.



- PK생성 시 인덱스가 자동으로 생성된다.(이건 일단 이렇게 기억 나중에 공부)

 

-pk를 한 개 

 

-2개 칼럼으로 묶어 pk 한 개

=> 코드 끝에 PK_CLUSTER_TBL(COL2,COL3) VALUES('DATA3',SYSDATE);

이렇게 COL2와 COL3를 AND 조건으로 묶어서 두 개 값이 다 같아야 아래 코드(SELECT)를 할 수 있다.

(INSERT도 마찬가지 다르면 들어갈 수 있음. 하지만 같으면 데이터 삽입 불가능)

create table nopk(
 col1 NUMBER,
 col2 NVARCHAR2(10)

);
desc nopk
insert into nopk values(1,'data1');
insert into nopk values(1,'data2');
insert into nopk(col2) values('data3');
select * from nopk;

create table pk_noname_tbl(
    col1 NUMBER primary key,
    col2 NVARCHAR2(10)
);

insert into pk_noname_tbl values(1,'data1');
insert into pk_noname_tbl values(1,'data2');
insert into pk_noname_tbl(col2) values('data3');
select * from pk_noname_tbl;



create table pk_name_tbl(
    col1 NUMBER CONSTRAINT pk_pk_ctname_tbl primary key,
    col2 NVARCHAR2(10)
);

insert into pk_name_tbl values(1,'data1');
insert into pk_name_tbl values(1,'data2');
insert into pk_name_tbl(col2) values('data3');
select * from pk_name_tbl;



create table PK_CLUSTER_TBL(
    COL1 NUMBER ,
    COL2 VARCHAR2(10),
    COL3 DATE,
    CONSTRAINT PK_PK_CLUSTER_TBL PRIMARY KEY(COL1,COL2)
);
INSERT INTO PK_CLUSTER_TBL VALUES(1,'DATA1',SYSDATE);
INSERT INTO PK_CLUSTER_TBL VALUES(1,'DATA2',SYSDATE);
INSERT INTO PK_CLUSTER_TBL VALUES(2,'DATA1',SYSDATE);
SELECT * FROM pk_cluster_tbl WHERE COL1=1 AND COL2='DATA1';
INSERT INTO PK_CLUSTER_TBL VALUES(2,'DATA1',SYSDATE);
INSERT INTO PK_CLUSTER_TBL(COL2,COL3) VALUES('DATA3',SYSDATE);
INSERT INTO PK_CLUSTER_TBL(COL1,COL3) VALUES('100',SYSDATE);
select * from PK_CLUSTER_TBL;