(데이터베이스) 외부조인

복습: 2016/06/13, 2016/06/14

*외부조인은 조인되는 테이블 중 하나의 모든 행을 다른 테이블에서 일치하는 정보와 함께 반환합니다.

*내부조인에서 두 테이블의 행들을 비교하지만, 두 테이블 사이의 순서는 중요하지 않습니다.

*왼쪽 외부조인은 왼쪽 테이블의 모든 행을 가져다 오른쪽 테이블의 행과 비교합니다.
왼쪽테이블과 오른쪽 테이블이 일대다 관계에 있을 때 유용합니다.


*왼쪽 외부 조인에서는 FROM뒤에 그리고 조인전에 나오는 테이블이 왼쪽 테이블이고 조인 뒤에 나오는 테이블이 오른쪽 테이블입니다.



<왼쪽 외부조인>

소녀(girls)들이 어느 장난감(toys)을 가지고 있는지를 알아보는데 왼쪽 외부 조인을 사용할 수 있다.

SELECT g.girl,t.toy
FROM girl g
LEFT OUTER JOIN toys t
ON g.toy_id=t.toy_id;

-->외부조인은 다른 테이블과 일치하는 것이 있는가에 상관없이 행을 반환한다는 차이가 있다.
왼쪽 외부조인의 결과가 NULL값이면 오른쪽 테이블에 왼쪽 테이블에 상응하는 값이 없다는 의미이다.

<오른쪽 외부조인>

오른쪽외부조인도 오른쪽 테이브을 왼쪽 테이블과 비교한다는 점을 제외하면 왼쪽 외부조인과 같습니다.


<자신을 참조하는 참조키>

-->자신을 참조하는 참조키는 같은 테이블에서 또다른 목적으로 사용하는 기본키이다.



<셀프조인> 

->정규화된 데이터베이스에서는 같은 테이블을 두 개 사용할 일은 절대 없다.
대신, 두 테이블을 시뮬레이션 하기 위해 셀프조인을 사용할 수 있다.
--> 셀프조인을 통해 하나의 테이블로 같은 정보를 가진 테이블이 두 개 있는 것처럼 쿼리를 보낼 수 있다.

SELECT c1.name,c2.name AS boss
FROM clown_info c1
INNER JOIN clown_info c2
ON c1.boss_id=c2.id;




***여러 테이블에서 정보를 얻는 방법.**

1. 유니온
--> 두 개 이상의 테이블 묶는 방법은 유니온이있다.

유니온은 SELECT의 열리스트를 바탕으로 두 개 이상 쿼리의 결과를 하나의 테이블로 합친다.

SELECT title FROM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings;


만약 ORDER BY를 이용해 정렬을 하고자 한다면 다음과 같이 하면 안된다.

SELECT title FROM job_current ORDER BY title
UNION
SELECT title FROM job_desired ORDER BY title
UNION
SELECT title FROM job_listings ORDER BY title;


**유니온은 문장의 끝에 한 개의 ORDER BY만을 받아 들일 수 있다. 이유는 유니온이 여러 SELECT 문의 결과를 합친 후 결과를 만들어 내기 때문이다.


<유니온의 규칙>


  • 각 SELECT 문의 열 수는 같아야 한다. 첫번째 문장에서는 두 열을 선택하고 두번째에서는 하나의 열을 선택 할 수 없다.
  • 각 SELECT 문에 표현식과 집계 함수도 같아야 한다.
  • SELECT 문의 순서는 중요하지 않습니다. 순서는 결과에 영향을 미치지 않는다.
  • 유니온의 결과에서 중복값은 하나로 나오는 것이 디폴트이다.
  • 열의 데이터 타입은 같거나 서로 변환 가능한 값이어야 한다.
  • 특별한 이유가 있어 중복을 보고 싶으면 UNION ALL을 사용할 수 있다. 그렇게하면 중복된 값도 모두 표시된다.


예) 

SELECT title FROM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings;

-->title이라는 열의 수가 같다.




**데이터 타입이 서로 변환가능해야 한다는 말은 반환되는 데이터 타입이 호환가능한 타입으로 변환될 것이라는 의미이며, 변환될 수 없으면 쿼리는 실패한다.
INTEGER 타입과 VARCHAR타입에 대해 유니온을 사용한다고 가정하자. VARCHAR은 정수가 될 수 없기 때문에, 결과 열은 INTEGER을 VARCHAR로 변환 할 것이다.

<유니온으로 테이블 만들기>

CREATE TABLE my_union AS
SELECT title FROM job_current UNION
SELECT title FROM job_desired UNION
SELECT title FROM job_listings;


<INTERSECT 와 EXCEPT>

INTERSECT는 첫번째 쿼리와 두번쨰 쿼리 모두에있는 열들을 반환한다.
예)
SELECT title FROM job_current
INTERSECT
SELECT title FROM job_desired;


EXCEPT 는 첫번째 쿼리에는 있지만 두번째 쿼리에는 없는 열들을 반환한다.

SELECT title FROM job_current
EXCEPT
SELECT title FROM job_desired;



**셀프조인을 서브쿼리로

--->셀프조인
예) SELECT c1.name,c2.name AS boss
     FROM clown_info c1
     INNER JOIN clown_info c2
     ON c1.boss_id=c2.id;


-->서브쿼리로 바꾸기
예) SELECT c1.name,
(SELECT name FROM clown_info
 WHERE c1.boss_id=id) AS boss
FROM clown_info c1;





댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기