티스토리 뷰

728x90
반응형

 포스팅은 데이터베이스 다중테이블 연산과 JOIN에 대해 알아보겠습니다.


앞선 포스팅에서 데이터베이스의 관계에 대해 알아보았습니다. 본 포스팅에서는 각각의 테이블간의 연관관계를 기준으로 다중테이블 연산 방법을 살펴보고 JOIN 연산을 활용하는 방법에 대해 알아보도록 하겠습니다.


먼저 데이터베이스 다중테이블 연산 방법입니다.

먼저 CREATE / SELECT & INSERT (거의)동시에 사용하는 방법입니다.

INSERT INTO profession (profession)

 SELECT profession FROM my_contacts

    GROUP BY profession

    ORDER BY profession;

SELECT 한 결과가 (profession)에 업데이트가 됩니다.


다음으로 SELECT & CREATE 동시에 사용하는 방법입니다.

CREATE TABLE profession AS

 SELECT profession FROM my_contacts

    GROUP BY profession

 ORDER BY profession;

SELECT 한 결과가 TABLE 열로 추가됩니다.


다음으로 CREATE / SELECT & INSERT 동시에 사용하는 방법입니다.

CREATE TABLE profession

(

 id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,

    profession VARCHAR(20)

) AS

SELECT profession FROM my_contacts

GROUP BY profession

ORDER BY profession;


다음으로 AS (alias)에 대해 알아보겠습니다.

AS는 새로 만드는 테이블을 SELECT 한 결과로 채우는 역할을 합니다.

별명 : 열의 이름을 AS로 지정할 수 있습니다.

연결 이름 : 테이블을 AS로 별명 지정할 수 있습니다.

AS를 생략해도 무방합니다.

그럼 이제 JOIN에 대해 살펴보겠습니다.

먼저 INNER JOIN (내부조인) 입니다.

[test 환경]

CREATE DATABASE JOIN_TEST;

USE JOIN_TEST;


CREATE TABLE toys

(

 toy_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    toy  VARCHAR(30) NOT NULL

);


INSERT INTO toys

(toy)

VALUES

('balsa glider'),('toy soldiers'),('harmonica'),('<wbr />baseball cards');


CREATE TABLE boys

(

 boy_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    boy  VARCHAR(30) NOT NULL

);


INSERT INTO boys

(boy)

VALUES

('Davey'),('Bobby'),('Beaver')<wbr />,('Richie');


SELECT * FROM boys;


SELECT * FROM toys;


SELECT t.toy, b.boy

FROM toys AS t

CROSS JOIN boys AS b;


크로스 조인은 한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환합니다.

콤마 조인은 CROSS JOIN 대신 ,로 대체한 조인입니다. (동작 방식 동일)

INNER JOIN (내부조인)은 쿼리의 조건에 따라 일부 열과 열이 제거 된 크로스 조인입니다.

SELECT t.toy, b.boy

FROM toys AS t

 INNER JOIN

    boys AS b

    ON(WHERE) t.toy_id = b.boy_id;


동등조인은 같은지를 테스트하는 내부 조인입니다.

SELECT t.toy, b.boy

FROM toys AS t

 INNER JOIN

 boys AS b

    ON t.toy_id = b.toy_id;


비동등조인은 같지 않은지를 테스트하는 내부 조인입니다.

SELECT t.toy, b.boy

FROM toys AS t

 INNER JOIN

 boys AS b

    ON t.toy_id <> b.toy_id

    ORDER BY b.boy;


자연조인은 일치하는 열 이름을 사용하는 내부 조인입니다.

SELECT t.toy, b.boy

FROM toys AS t

 NATURAL JOIN

    boys AS b;


# 참조

외부 조인은 테이블을 조인하는 순서가 매우 중요하다. 


다음으로 OUTER JOIN (외부조인) 입니다.

OUTER JOIN (외부조인)은 왼쪽과 오른쪽이 있습니다.

SELECT <컬럼 목록>

FROM <첫 번째 테이블 (LEFT TABLE)>

<LEFT | RIGHT | FULL > OUTER <wbr />JOIN <두 번째 테이블 (RIGHT TABLE)>

ON <조인될 조건>

WHERE 검색조건


먼저 LEFT OUTER JOIN 입니다.

왼쪽 외부 조인(LEFT OUTER JOIN) 왼쪽 테이블의 모든 행과 오른쪽 테이블의 행을 비교합니다.

SELECT t.toy, b.boy

FROM toys t

LEFT OUTER JOIN boys b

ON b.toy_id = t.toy_id;

외부 조인은 결과와 없더라도 NULL값을 출력합니다. 외부 조인이 여러개 일치할 경우 충복 값이 나옵니다.


다음으로 RIGHT OUTER JOIN 입니다.

LEFT OUTER JOIN과 동일하나 FROM ~ RIGHT OUTER JOIN 사이에 위치한 TABLE이 오른쪽이 됩니다.


마지막으로 FULL OUTER JOIN 입니다.

양 테이블 모두를 머지합니다.


그밖의 JOIN에 대해 알아보겠습니다.

먼저 SELF JOIN입니다.

셀프 조인으로 하나의 테이블로 같은 정보를 가진 테이블이 두개 있는 것처럼 쿼리를 보낼 수 있습니다.

다음으로 UNION(유니온)입니다. 두 개 이상의 테이블을 묶는 방법입니다.

각 SELECT 문의 열 수는 같아야 합니다. (열의 내용이 같은 타입 유형이어야 하나로 머지의 의미가 있다.)

각 SELECT 문에 표현식과 집계 함수도 같아야 합니다.

SELECT 문의 순서에 영향을 주지 않습니다.

중복을 보고 싶은 경우 UNION ALL을 사용합니다.

SELECT toy_id FROM toys

UNION

SELECT toy_id FROM boys

UNION

SELECT toy_id FROM girls;

SELECT toy_id FROM toys

UNION ALL

SELECT toy_id FROM boys

UNION ALL

SELECT toy_id FROM girls;

모든 SELECT 문이 완료 된 이후에 정렬되며, ORDER BY는 마지막에 한번만 가능합니다.


마지막으로 JOIN과 비슷한 INTERSECT & EXCEPT (AND & OR)입니다.

INTERSECT의 경우 첫번째 두번째 쿼리 모두에 있는 열을 반환합니다.

EXCEPT의 경우 첫번째 쿼리에만 있는 열을 반환합니다.


지금까지 다중테이블 연산 및 다양한 JOIN에 대해 알아보았습니다.

다음시간에는 서브쿼리에 대해 알아보겠습니다.

고맙습니다.

728x90
반응형