DB는 다른 여러 프로그램이 존재하지만 Oracle에서 만든 DB와 MySQL 두가지를 대표적으로 사용한다.


DB에서 사용하는 쿼리문은 거의 비슷한데 몇몇 코드들은 약간씩 차이가 있거나 쓰지 않거나 한다.


예를 들어, 오라클 DB는 Boolean형식이 없는것 처럼..


이번에 게시하는 Join도 마찬가지로 약간 차이가 있으니


이곳에서 본 내용을 MySQL에 바로 쓴다면 오류가 나올것이다.






Join은 두 개의 테이블을 같이 검색할 때 쓰는것이다.


서브 쿼리와의 차이점이라면, 서브쿼리는 한 테이블의 데이터를 가공하여 검색하고


조인은 두 테이블 그 자체를 검색한다.


종류로는 여러가지로


Cross Join(잘 안씀), Equi Join (등가 조인, 내부 조인, 가장 잘 씀)


Non-Equi Join (거의 사용하지 않음)


Self Join, Outer Join


등 그 외에도 몇개가 있다.


잘 사용하지 않고, 어? 이걸 왜쓰지?? 라는 느낌을 받아도 용도가 있긴 있어서 만들어진 기능이다.



-- Join 이란?
-- 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.

-- 두개의 테이블을 SELECT 문장 안에서 조인하려면 적어도 하나의 컬럼이
-- 그 두 테이블 사이에서 공유 되어야 한다.

-- 보통 둘 이상의 행들의 공통된 값 Primary Key 및 Foreign Key 값을
-- 사용하여 조인 한다.

-- Join 방법
-- 조인 방법 : Cross Join, Equi Join (등가 조인, 내부 조인)
-- Non-Equi Join (거의 사용하지 않음: 교재에는 수록)
-- Self Join, Outer Join


-- 0. CROSS JOIN
-- 카다시안 곱을 수행
-- 카다시안 곱은 2개의 테이블을 곱한 행을 반환, 카디시안 곱은 경우의 수를 추출할 때 사용
-- emp(10), dept(4) = 40, emp는 10개의 행, dept는 4개의 행
-- FROM [tableA] CROSS JOIN [tableB]
SELECT ename, deptname FROM emp e CROSS JOIN dept d;
-- 생략도 가능
SELECT e.ename, d.deptname FROM emp e, dept d;


-- 1. Equi JOIN
-- 가장 일반적으로 사용하는 JOIN
-- (=)를 사용 하므로 Equi(등가) 조인이라고 불린다.


-- 1-1) equi join
-- ename과 deptname을 묶어서 보여준다.
-- Cross Join에 생략할 거 하고 조건을 단 형태
SELECT e.ename, d.deptname FROM dept d, emp e WHERE e.deptno = d. deptno;

INSERT INTO dept VALUES(5, 'dev02', 'FLOLIDA');
-- 추가된 데이터는 deptno = 5가 해당되는 데이터가 없으므로 출력되지 않는다.
SELECT e.ename, d.deptname FROM dept d, emp e WHERE e.deptno = d. deptno;

-- 1-2) inner join
-- INNER JOIN이 붙는다.
-- WHERE절 대신 ON을 사용
SELECT e.ename, d.deptname FROM dept d INNER JOIN emp e ON e.deptno = d. deptno;
-- INNER 생략가능
SELECT e.ename, d.deptname FROM dept d JOIN emp e ON e.deptno = d. deptno;
-- equi 조인과 다른 점
-- ON 대신 USING을 사용 할 수 있다.
--공통되는 컬럼명이나 뷰, 서브쿼리 명시가 가능, 좀 더 조건 수행에 이용 할 수 있다.
SELECT e.ename, d.deptname FROM dept d JOIN emp e USING (deptno);

-- 1-3) NATURAL JOIN
-- 특정 조건이 아니라 자연스럽게 컬럼에 추가되어서 출력
SELECT deptno, e.ename, d.deptname FROM dept d NATURAL JOIN emp e;
-- deptno를 앞에 명시하여 일치하는것에 알아서 따라서 출력됨



-- 2. Self JOIN (자기 조인), 잘 안씀
-- 기본적으로는 등가조인과 같다.
-- 1개 테이블을 대상으로 한다.

SELECT a.ename AS name, b.ename AS manager_name FROM emp a, emp b;
-- 실행해 보면 결과가 100개 나온다.
-- 자기 조인을 하면 내부적으로 데이터간 카디션 곱이 일어난다.


-- 3. Outer JOIN (외부 조인)
-- 등가 조인은 두 테이블 모두 존재해야만 보여준다.
-- 둘 중 하나가 없는 값도 보기 위해서는 Outer JOIN을 사용해야 한다.

-- Equi JOIN = AND, Outer JOIN = OR
-- Outer JOIN은 (+)를 사용하는 방법이 있다.(Oracle 한정)
-- 공통적으로는 LEFT Outer JOIN, RIGHT Outer JOIN을 사용한다.

-- 테스트를 위한 삽입
INSERT INTO emp VALUES('kim', 'assistant', 6, to_date('14/06/02', 'YY/MM/DD'));

-- 내부, 위에서 삽입한 정보는 나오지 않음
SELECT e.ename, d.deptname FROM dept d INNER JOIN emp e ON e.deptno = d. deptno;

-- 외부, +가 붙은쪽에 없는 자료를 null로 해서 합친다음 출력(오라클에서만 사용 가능)
SELECT DISTINCT (e.deptno), d.deptname FROM dept d, emp e WHERE e.deptno(+) = d.deptno;
SELECT DISTINCT (e.deptno), d.deptname FROM dept d, emp e WHERE e.deptno = d.deptno(+);
-- 단점 : 쓰기는 편하지만 양쪽에 (+)를 붙일 수 없다.

-- 외부, 다른 프로그램의 경우(Left, Right Join)
-- 있는 쪽을 지목
-- FROM[table1] [LEFT|RIGHT] OUTER JOIN [table2]
-- LEFT OUTER JOIN : 왼쪽에 값이 더 있다.
-- RIGHT OUTER JOIN : 오른쪽에 값이 더 있다.
-- FULL OUTER JOIN : 양쪽에 각기 다른 값이 있다.
SELECT DISTINCT (e.deptno), d.deptname FROM dept d LEFT OUTER JOIN emp e ON e.deptno = d.deptno;
SELECT DISTINCT (e.deptno), d.deptname FROM dept d RIGHT OUTER JOIN emp e ON e.deptno = d.deptno;
SELECT DISTINCT (e.deptno), d.deptname FROM dept d FULL OUTER JOIN emp e ON e.deptno = d.deptno;




이번에 Oracle에서만 단독으로 사용하는 구문이 있다고 했는데 각각의 유사한 프로그램마다


자기만의 구문이 있다.


하지만 ANSI SQL은 거의 모든 sql문을 허용한다.



+ Recent posts