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으로 바꾸는 것이 훨씬 빠르다.