내부조인
DB내에서 조건이 동일한 컬럼에 대한 정보를 조회하는 방법
방법
1. inner join table 을 통해 조회
예시
use world;
select a.name, count(*)
from country a
inner join city b
on a.code=b.CountryCode
group by a.name with rollup
order by 1;
2. from과 where을 통해 조회
use world;
select a.name, count(*)
from country a, city b
where a.code=b.CountryCode
group by a.name with rollup
order by 1;
둘은 동일한 결과를 가져옴
country 테이블과 city 테이블에서 code와 CountryCode가 같은 것들을 가져온다.
위의 코드의 경우 on을 통해 조건을 준 것이고, 아래의 경우 where을 통해 준 것이다.
추가적인 조건을 다는 경우, 둘다 where문을 통해 조건을 줄 수 있다.
내부조인의 한계점
select a.continent, count(*)
from country a
group by a.continent;
select a.continent, count(*)
from country a
inner join city b
on a.code=b.countrycode
group by a.continent;
위와 아래의 코드는 거의 비슷한 코드로, 위는 대륙별로 컬럼의 갯수를 표현한 것이고, 아래는 대륙별 도시 수를 표현한 쿼리문이다.
아래의 코드에서 남극이 누락되는 이유는 남극에는 도시가 없기 때문이다.
이런 경우를 해결하기 위해 외부조인을 사용한다.
외부조인
외부조인은 내부조인과 동일하되, 조건에 해당하지 않는 칼럼도 가져온다. 테이블 두개이므로, 조건에 해당하지 않는 테이블 중 왼쪽과 오른쪽 중 어느 것을 가져 올 지정해야 하므로 left, right 로 구분한다.
LEFT 조인
select a.continent, count(*)
from country a
left outer join city b
on a.code=b.countrycode
group by a.continent;
여기서 도시수를 구하고 싶다면, 아래와 같이 SQL문을 작성하면 된다.
select a.continent, count(*) 전체건수, count(b.name) 도시건수
from country a
left outer join city b
on a.code=b.countrycode
group by a.continent;
RIGHT JOIN
LEFTJOIN과 동일하나 좌 우가 바뀐다.
select a.continent, count(*) 전체건수, count(b.name) 도시건수
from city b
right outer join country a
on a.code=b.countrycode
group by a.continent;
동일한 결과를 얻어온 모습
내부 조인의 경우에는 순서가 그렇게 중요하지 않지만, 외부조인의 경우 중요하다.
자연조인
조건절을 기술할 필요가 없는 조인
mysql에서 동일한 칼럼을 찾아서 조동으로 조인해줌
다만, 칼럼명과 그 데이터 타입이 같아야 한다.
그래서
select a.continent, count(*) 전체건수, count(b.name) 도시건수
from country a
natural join city b
group by a.continent;
이렇게 조인을 시도하면 빈칸이 리턴된다.
자연 조인의 예시.
city와 countrylanguage에는 동일하게 CountryCode라는 칼럼이 존재하는데, 그래서 자연조인이 가능하며, 결과값에 CountryCode가 한번 밖에 출력되지 않는다.
카티전 곱(크로스조인)
카티전 곱은 조인조건이 존재하지 않아서 1번 테이블과 2번테이블의 곱을 단순히 나열한 것이다.
A에 2개의 데이터, B에 3개의 데이터가 있다면 결과값은 6개가 나타나게 된다.
INNER JOIN에서 on이나 where절을 기술하지 않으면 카티전 곱이 수행된다.
UNION절
select 문과 select문 사이에 UNION을 기술하면, select의 결과 값이 합쳐져 한 번에 조회된다.
UNION [DISTINCT] : select의 결과 집합에서 중복된 데이터를 제거하고, 데이터를 조회한다.
UNION ALL : 중복을 포함한 모든 데이터를 조회한다.
다만, select의 컬럼 수가 동일해야 조회된다.