[MySQL] JOIN(feat. INNER, LEFT, RIGHT, OUTER)

2020. 11. 18. 21:19MySQL

#테스트 데이터

# a5 데이터베이스 삭제/생성/선택

DROP DATABASE IF EXISTS `a5`;
CREATE DATABASE `a5`;
USE `a5`;
SHOW DATABASES;


#people테이블 생성

CREATE TABLE `people`(
    `name` CHAR(100) NOT NULL,
    `phone` CHAR(100) NOT NULL,
    `pid` INT(10) NOT NULL 
);
DESC `people`;


INSERT INTO `people`
SET `name` = 'Mr b',
`phone` = '01225-708225',
`pid` = 1;

INSERT INTO `people`
SET `name` = 'Miss a',
`phone` = '01333-444444',
`pid` = 2;

INSERT INTO `people`
SET `name` = 'Mr c',
`phone` = '55555-546525',
`pid` = 3;

SELECT * FROM `people`;


#property테이블 생성

CREATE TABLE `property`(
    `pid` INT(10) NOT NULL,
    `spid` INT(10) NOT NULL,
    `selling` CHAR(100) NOT NULL
);
DESC `property`;

INSERT INTO `property`
SET `spid` = 1,
`selling` = 'old',
`pid` = 1;

INSERT INTO `property`
SET `spid` = 2,
`selling` = 'will',
`pid` = 3;

INSERT INTO `property`
SET `spid` = 3,
`selling` = 'tail',
`pid` = 3;

INSERT INTO `property`
SET `spid` = 4,
`selling` = 'flo',
`pid` = 3;
 
INSERT INTO `property`
SET `spid` = 5,
`selling` = 'dum',
`pid` = 4;
 
SELECT * FROM `property`;

#INNER JOIN

 -INNER 조인은 MySQL에서는 간략히 JOIN으로 나타낸다. 일반적으로 사용하는 JOIN 이다.

 -핵심은 JOIN뒤에 ON인데, 두 테이블이 결합하는 조건을 나타낸다. 

 -(* ON 대신 WHERE를 쓸 수도 있다.)

SELECT people.name,
people.phone,
property.selling
FROM people
INNER JOIN property
ON people.pid = property.pid;

#LEFT JOIN

 -왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치시킨다.

 -왼쪽 테이블의 한개의 레코드에 여러개의 오른쪽 테이블 레코드가 일치할 경우,

 -해당 왼쪽 레코드를 여러번 표시하게 된다.

 -왼쪽은 무조건 표시하고, 매치되는 레코드가 오른쪽에 없으면 NULL을 표시한다.

SELECT people.name,
people.phone,
property.selling
FROM people
LEFT JOIN property
ON people.pid = property.pid;

#RIGHT JOIN

 -오른쪽 테이블을 중심으로 왼쪽 테이블을 매치시킨다.

 -LEFT JOIN에서 방향을 오른쪽으로만 바꾼것이므로, 역시 해당 레코드가 여러번 표시되거나, NULL이 표시된다.

SELECT people.name,
people.phone,
property.selling
FROM people
RIGHT JOIN property
ON people.pid = property.pid;

#OUTER JOIN

 -조건에 부합하지 않는 행까지도 포함시켜 결합하는 것

 -기본적으로 LEFT, RIGHT 또는 FULL OUTER JOIN 이다.

 -FULL JOIN은 사용할 일이 없으며, ODBC에 따라 지원하지 않는 경우도 있다.