Search

JOIN

대분류
DB
소분류
MySQL
주요 레퍼런스
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC#inner_join
수준
기초
태그
INNER JOIN
FULL OUTER JOIN
LEFT/RIGHT OUTER JOIN
최종 편집 일시
2024/10/27 15:32
생성 일시
2024/07/18 03:06
13 more properties

SQL JOIN

데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현하는 역할
Relation Database에서 사용하는 주로 사용

INNER JOIN == JOIN, CROSS JOIN

조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
SELECT u.userid, name FROM usertbl u JOIN buytbl b ON u.userid=b.userid -- WHERE u.userid="111" -- join을 완료하고 그다음 조건을 따진다.
SQL
복사
-- 단순히 from 절에 콤마 쓰면 inner join 으로 치부된다. 위 조건과 동일 SELECT u.userid, name FROM usertbl u, buytbl b WHERE u.userid=b.userid and u.userid="111"
SQL
복사
USING : 만약 두 테이블의 컬럼명이 같을 경우 조인 조건을 길게 적지 않고 간단하게 적을 수 있도록 하는 역할
SELECT u.userid, name FROM usertbl AS u JOIN buytbl AS b USING (userid) WHERE u.userid="111" -- join을 완료하고 그다음 조건을 따진다.
SQL
복사

LEFT / RIGHT JOIN

두 테이블이 합쳐 질때 왼쪽/오른쪽을 기준으로 했느냐에 따라 기준 테이블의 것은 모두 출력
OUTER JOIN은 조인하는 테이블의 ON 절의 조건 중 한쪽의 데이터를 모두 가져옴
OUTER JOIN 방식
LEFT OUTER JOIN
SELECT TABLE1.NAME, TABLE2.NAME FROM TABLE1 LEFT JOIN TABLE2 -- A를 기준으로 왼쪽 조인 ON TABLE1.PID = TABLE2.ID
SQL
복사
RIGHT OUTER JOIN
SELECT TABLE1.NAME, TABLE2.NAME FROM TABLE1 RIGHT JOIN TABLE2 -- PROFESSOR를 기준으로 오른쪽 조인 ON TABLE1.PID = TABLE2.ID
SQL
복사
FULL OUTER JOIN이 존재.
LEFT OUTER JOIN을 대부분 사용, FULL OUTER JOIN은 성능상 거의 사용X
SELECT * FROM topic FULL OUTER JOIN autor ON topic.auther_id = authoer.id # == SELECT * FROM topic LEFT JOIN autor ON topic.auther_id = authoer.id UNION SELECT * FROM topic RIGHT JOIN autor ON topic.auther_id = authoer.id
SQL
복사
3중 조인
-- 3개의 테이블을 join하고 한국에대한 정보만 뷰로 생성해라 SELECT A.Name, A.CountryCode FROM city A LEFT JOIN country B ON A.countrycode = B.code -- 테이블 2개 조인 완료 LEFT JOIN countrylanguage C ON B.code = C.countrycode -- 테이블 3개 조인 완료 WHERE A.countrycode in ('KOR');
SQL
복사

UNION

여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용
이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 함.
기본 집합 쿼리에는 (DISTINCT) 중복제거가 자동 포함되어 있음.
SELECT 필드이름 FROM 테이블이름 UNION SELECT 필드이름 FROM 테이블이름
SQL
복사

UNION ALL

UNION은 DISTINCT 자동 포함이라 중복되는 레코드를 제거한다.
따라서 중복되는 레코드까지 모두 출력하고 싶다면, ALL 키워드를 사용하면 된다.
SELECT 필드이름 FROM 테이블이름 UNION ALL SELECT 필드이름 FROM 테이블이름
SQL
복사

EXCLUSIVE LEFT JOIN

어느 특정 테이블에 있는 레코드만 가져오는 것
EXCLUSIVE JOIN는 만약 테이블 두개를 JOIN한다면 둘중 한가지 테이블에만 있는 데이터를 가져온다.
다른 JOIN들과는 다르게 별도의 EXCLUSIVE JOIN함수가 있는 것은 아니고 기존의 LEFT JOIN과 Where절의 조건을 함께 사용하여 만드는 JOIN 문법
SELECT * FROM table1 A LEFT JOIN table2 B ON A.ID = B.ID WHERE B.ID IS NULL -- 조인한 B 테이블의 값이 null만 출력하라는 말은, 조인이 안된 A 레코드 나머지값만 출력하라는 말
SQL
복사

자체 조인(SELF JOIN)

테이블 자기자신을 조인 한 것
-- 예) 모든 사원에 대해 사원의 이름과 직속 상사의 이름을 검색 해라. -- EMPNAME 테이블에 어떤 사원의 MANAGER 번호가 같은 테이블 내에서 어떤 사원의 EMPNO와 같으면 그 사원이 직속 상관 SELECT E.EMPNAME AS 사원, M.EMPNAME AS 직속상관 FROM EMPLOYEE E, EMPLOYEE M -- inner join WHERE E.MANAGER = M.EMPNO;
SQL
복사

JOIN에서 중복된 레코드 제거

DISTINCT - 비추천

 레코드 수가 많은 경우 성능이 느리다
-- DISTINCT를 추가 SELECT DISTINCT person.id, person.name, job.job_name FROM person INNER JOIN job ON person.name = job.person_name;
SQL
복사

JOIN 전에 중복을 제거하기

앞서 말한 것처럼 SELECT DISTINCT는 간단하지만 성능이 느리다.
성능을 위해서는 JOIN 전에 중복을 제거하는 작업을 해주는 것이 좋다. (물론 더 좋은 것은 중복이 없도록 테이블 설계를 잘 하는 것이다)
서브쿼리의 inline view를 사용해 distinct 하고 조인
SELECT A.name, A.countryCode FROM city A LEFT JOIN ( SELECT DISTINCT name, Code FROM country ) AS B -- 조인할 테이블에 먼저 distinct로 중복을 제거한 select문을 서브쿼리로 불러와 임시테이블로 만든뒤 조인한다 ON A.countrycode = B.Code
SQL
복사
언뜻보면 복잡해보일 수 있고 성능이 더 느려보일 수 있는데, 일반적으로 레코드 수가 많은 경우 JOIN 전에 중복을 제거해서 1:1 JOIN으로 바꾸는 것이 훨씬 빠르다.