[SQL] Join ORACLE/SQL 2012. 3. 29. 17:09

조인은 둘 이상의 테이블간 연계하여 데이터를 검색한다.

보통 PK와 FK를 이용하는데 조인 조건을 정의 하지않거나 잘못된 경우, 첫 테이블이 다음 테이블의 모든 행과 조인 될 경우 카테션 곱(Cartesian Product)이 일어나 상호 테이블간의 모든 데이터가 반환 되는 현상이 일어난다.

조인의 종류는 다음과 같다.

1. Equi Join - 조건절에 = 에 의해 일어난다.

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.ID = B.ID;

 

2. Non-Equi Join - = 외의 조인 조건을 가진는 경우

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.VALUE BETWEEN B.VALUE AND B.NEXT_VALUE;

 

3. Self-Join - 자기 스스로 조인 일어나는 것으로 두개의 테이블을 조인 하는 것 처럼 보이는 경우

SELECT A.DATA, B.DATA

FROM t_table A, t_table B

WHERE A.ID = B.ID;

 

4. Outer Join - LEFT, RIGHT, FULL OUTER JOIN이 있으며 두개의 테이블의 컬럼들에서 공통되는 값이 없을 경우 종종 이용한다. (+) 를 이용하여 사용하는데 값이 없는 측에 붙여 사용한다.

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.ID(+) = B.ID;

위와 같이 작성을 했으나 한쪽에 데이터가 맞지 않은 경우가 있다 가령 NULL 값이 들어간 경우이다.

결과가

A.DATA     B.DATA

-------     -------

1              1

               2

나와야 하는 경우 1에 대한 행만 나왔다면 다른 조건을 걸어 (+) 시켜 줘야한다.

 

4.1 LEFT OUTER JOIN - 오른쪽에 조인시킬 컬럼 값이 없을 경우

SELECT A.DATA, B.DATA

FROM t_table A LEFT OUTER JOIN t_table_sec B

WHERE A.ID = B.ID;

 

4.2 RIGHT OUTER JOIN - 쪽에 조인시킬 컬럼 값이 없을 경우

SELECT A.DATA, B.DATA

FROM t_table A RIGHT OUTER JOIN t_table_sec B

WHERE A.ID = B.ID;

 

4.3 FULL OUTER JOIN - 양측에 OUTER JOIN을 거는 경우

SELECT A.DATA, B.DATA

FROM t_table A LEFT FULL JOIN t_table_sec B

WHERE A.ID = B.ID;

 

5. INNER JOIN - 일반 조인에서 콤마 대신 INNER JOIN을 넣고 WHERE 대신 ON 넣는 방법

SELECT A.DATA, B.DATA

FROM t_table A INNER JOIN t_table_sec B

ON A.ID = B.ID;

 

6. NATURAL JOIN - Equi Join과 동일한 형태로 동일한 이름을 지니는 컬럼은 모두 조인이 된다. 또한 Alias는 사용하지 못하며 동일한 컬럼이 두개 이상일 경우 JOIN~USING을 이용하여 제어가 가능하다.

SELECT DATA, NAME FROM t_table NATURAL JOIN t_table_sec

 

7. JOIN~USING - NATURAL JOIN에 나타나는 문제를 제어하기 위한 것으로 해당하는 컬럼을 선택해서 조인이 가능하다. 또한 USING절 안에 포함되는 컬럼에 Alias를 지정하면 오류가 난다.

SELECT A.DATA, B.NAME, ID FROM t_table A JOIN t_table_sec B USING (ID)

 

8. ON - 조인 조건을 지정하며 논리 연산과 서브쿼리 지정이 가능하다.

SELECT A.DATA, B.NAME

FROM t_table A JOIN t_table_sec B ON (A.DATA = B.DATA)

                       JOIN t_table_third C ON (C.ID = A.ID)

테이블은 데이터베이스 상에 가장 기본적인 데이터 저장 단위이다.

이들은 컬럼과 레코드로 구성이 되며 두개 이상의 엔티티간의 관계 또한 표기가 가능하다.

테이블 생성하는 방법은 다음과 같다.

CREATE TABLE t_table

(

ID NUMBER CONSTRAINT table_id PRIMARY KEY,

NAME VARCHAR(100)

);

위에 보면 CONSTRAINT를 이용하여 PRIMARY KEY로 제약 조건을 걸어 놓은 것을 볼 수 있다.

또한 로그인한 계정으로 만든 테이블 내역들을 보려면 USER_TABLES 를 조회하면 확인 할 수가 있다.

위에서 제약 조건이란 무결성 원칙을 위한 규칙 정용이라 생각을 하면 되며 이들은 데이터 사전에 모두 저장이된다.

다음은 그 예들이다.

1. NOT NULL

CREATE TABLE t_table

(

ID NUMBER CONSTRAINT table_id NOT NULL,

NAME VARCHAR(100)

);

 

2. CHECK - 해당 컬럼 값 범위 제한

ALTER TABLE t_table

ADD CONTRAINT table_ck CHECK (NO>=1 AND NO<=100); --추가

DROP CONTRAINT table_ck; --삭제

 

3. DEFAULT 지정

CREATE TABLE t_table

(

ID NUMBER CONSTRAINT table_id NOT NULL,

DATE DEFAULT SYSDATE

);

 

4. UNIQUE - 유일한 데이터, 자동 인덱스 생성

ALTER TABLE t_table

ADD CONSTRAINT uk_ID UNIQUE(ID); -- 추가

DROP CONTRAINT uk_ID; -- 삭제

 

5. PRIMARY KEY - 유일한 기본키, UNIQUE와 NOT NULL의 특성을 함께 가짐. 참조 무결성을 위해 이용함. 자동 인덱스 생성

CREATE TABLE t_table

(

ID NUMBER CONSTRAINT table_id NOT NULL,

NAME VARCHAR(100)

);

 

ARTER TABLE t_table ADD CONTRAINT pk_name PRIMARY KEY(NAME);

 

6. FOREIGN KEY - 기본키들을 참조하는 컬럼이나 컬럼들의 집합을 말하며 반드시 참조하는 PK와 데이터형이 일치해야한다.

ARTER TABLE t_table ADD CONTRAINT fk_ID

FOREIGN KEY(ID) REFERENCES t_table_sec(ID);

[SQL] SQL의 종류 ORACLE/SQL 2012. 3. 29. 15:58

정보처리기사나 각종 서적에 보면 DDL, DML, DCL이라는 것을 볼 수가 있다.

여기에선 그 정의를 알아본다. 총 3가지로 나뉠 수가 있다.

DDL(Data Definition Language) - 데이터베이스 객체인 테이블이나 뷰, 인덱스, 시퀀스 등의 구조를 정의 하며 CREATE, DROP, ALTER를 이용한다.

 

DML(Data Manipulation Language) - 데이터의 삽입, 삭제, 업데이트 등을 처리

 

DCL(Data Control Language) - 데이터베이스 사용자 권한 제어한다. GRANT로 권한을 부여하고, REVOKE로 취소한다.