서브쿼리는 '쿼리 안의 쿼리' 라는 뜻이다
서브쿼리는 사전에 추출된 내용에서 재검색을 하거나, 검색한 내용으로 가상 컬럼을 만들어 추가할 수 있다.
즉, 서브쿼리를 사용하는 이유는 가져온 데이터를 재 정제 하기 위함이라 볼 수 있다.
서브쿼리만 사용한다면 쿼리가 굉장히 복잡해지므로 JOIN 을 사용한다.
JOIN 은 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.
각 테이블에는 공통되는 컬럼이 적어도 하나 이상은 존재해야 한다.
일반적으로 기본키(PK)와 외래키(FK) 를 이용한다.
cross join 은 카테시안 곱을 수행한 뒤 그 조합을 반환 한다.
SELECT [칼럼명,...] FROM [테이블1] CROSS JOIN [테이블2];
이때 CROSS JOIN 은 생략이 가능하다.
cross join 은 두 테이블의 모든 조합을 반환하기 때문에 의미있는 데이터를 추출하기 어렵다.
카테시안 곱은 발생가능한 모든 경우의 수의 행이 출력되는 것을 의미한다.
등가조인을 사용하면 등호(=) 의 양 옆에 공통적인 부분만 보여준다.
이때 별칭(ALIAS) 을 사용한다.
별칭(ALIAS) :
컬럼, 테이블, 서브 쿼리, where절 등에 내가 원하는 이름(별칭)을 붙여주는 것. 주로 AS 를 사용하고 생략이 가능하다.
WHERE 절이 SELECT 보다 먼저 처리되기 때문에 칼럼 별칭은 WHERE 절에서는 사용이 안된다.
( 단, GROUP BY나 ORDER BY 같은 절에는 사용 OK )
where 절을 조건으로 이용하면 이 조건이 join 에 대한 조건인지, 그냥 일반 조건인지 헷갈린다.
이때 사용하는 것이 INNER JOIN 이다.
SELECT [칼럼명,...] FROM [테이블1] INNER JOIN [테이블2] ON [조건];
-
INNER 은 생략 가능하다.
on 대신 using 을 조건으로 사용할 수 있다.
using 안에는 사용될 컬럼명을 넣을 수도 있으며, 서브쿼리도 넣을 수 있다.
동일한 값을 갖는 컬럼을 내부적으로 자연스럽게 JOIN 하므로 조건을 주지 않는다.
다만 동일한 컬럼(기준)은 단축명을 주지 않는다.
Equi join 에서 할 수 없는 것들을 한다.
기존의 양 옆 공통 부분과 기준이 되는 쪽의 데이터까지 추가로 보여준다.
SELECT [칼럼명,...] FROM [tableA] [LEFT|RIGHT|FULL] OUTER JOIN [tableB] ON [조건절]
-
OUTER 은 생략이 가능하다.
( JOIN 을 기준으로 )
LEFT OUTER JOIN : 왼쪽을 기준으로 더 있는 값을 보여준다.
RIGHT OUTER JOIN : 오른쪽을 기준으로 더 있는 값을 보여준다.
FULL OUTER JOIN : 양쪽 서로에게 없는 값들을 보여준다.
( mariaDB는 지원 X -> UNION 을 사용하여 대체 )
Equi join 과 같으나 대상 테이블이 스스로라는 점이 차이점이다.
자기조인은 두 데이터간의 카다시안 곱을 수행한다.
set 은 집합을 의미한다.
UNION , UNION ALL , INTERSCET 가 존재한다.
[쿼리1] [ UNION | UNION ALL | INTERSECT ] [쿼리2]
중복을 제거한 합집합
중복 제거시 속도가 저하되어 사용을 권장하지 않는다.
동일한 컬럼이 하나는 있어야 한다.
union 을 활용하면 FULL OUTER JOIN 효과를 낼 수 있다.
( RIGHT / LEFT OUTER JOIN 을 UNION 으로 합침 )
union 은 중복 제거시 속도가 느려 사용을 권장하지 않는다.
이때 활용하는 것이 union all 로 우선 데이터를 확보해논 뒤 select distinct 로 중복을 제거하는 것이 좀 더 빠르다.