복수의 테이블을 사용해 데이터를 검색하는 방법
관계형 모델에서의 관계형은 수학 집합론의 관계형 이론에서 유래했다. 집합론이라고 거창하게 말하지만 실질적으로느 ㄴ데이터베이스의 데이터를 집합으로 간주해 다루기 쉽게 하자는 것에 지나지 않는다.
집합을 설명할 때는 벤 다이어그램을 이용하기도 한다.
하나의 원이 곧 하나의 집합이다. 원 안에는 몇가지 요소가 포함된다. 데이터베이스에서는 테이블의 행이 요소에 해당된다. 행은 여러개의 열로 구성되는 경우도 있으므로, 수치 상으로는 복수의 값이 존재한다. (집합적 측면: 하나의 행 -> 하나의 요소)
SELECT 명령 실행 시 데이터베이스에 질의하며 그 결과 몇 개의 행이 반환 -> 이 결과 전체를 하나의 집합
집합을 서로 더한 것
두 개의 집합을 모두 합한 부분이 합집합의 결과이다. 두 개 집합에서 겹쳐지는 부분은 한 개만 나타난다.
U
는 합집합의 기호이다. SQL에서는 SELECT 명령의 실행 결과를 하나의 집합으로 다룰 수 있다. 합집합 계산을 할 경우에 UNION 키워드를 사용한다. A UNION B
-> A와 B의 합집합
SELECT * FROM sample71_a UNION SELECT * FROM sample71_B;
두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미콜론(;
)은 맨 나중에 붙인다. 한 번의 쿼리 실행으로 두 개의 SELECT 명령이 내부적으로 실행된다. 이때 각 SELECT 명령의 실행 결과를 합집합으로 계산하여 최종 결과를 반환한다.
UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다
합집합 시 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다. 열 이름은 서로 다르지만 열 개수와 자료형이 서로 같은 경우 일치한다고 말할 수 있다. 그에 반해 완전히 열 구성이 다른 테이블은 UNION으로 묶을 수 없다. 다만 열을 따로 지정하여 각 SEELCT 명령에서 집합의 요소가 될 데이터를 서로 맞춰주면 UNION으로 실행할 수 있는 쿼리가 된다.
SELECT 명령들을 UNION으로 묶을 때 나열 순서는 합집합의 결과에 영향을 주진 않는다. 결괏값의 나열 순서는 달라질 수 있다. (ORDER BY를 지정하지 않은 SELECT 명령은 결과가 내부처리의 상황에 따라 바뀌기 때문)
UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬할 수는 없다. 마지막 SELECT 명령에만 지정하도록 한다.
합집합의 결과를 정렬하므로, 가장 마지막의 SELECT 명령에 ORDER BY를 지정해야 한다는 의미이다.
SELECT 명령에서 두 집합의 열 이름이 서로 일치한다면 ORDER BY는 문제없이 실행된다. 그렇지 않다면 동일한 별명을 붙여 정렬해야 한다.
UNION으로 SELECT 명령을 연결하는 경우, 가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정할 수 있다. ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시킨다.
UNION은 합집합을 구하는 것이므로 두 개의 집합에서 겹치는 부분은 공통 요소가 된다. 경우에 따라 중복을 제거하지 않고 2개의 SELECT 명령의 결과를 그냥 합치고 싶은 경우 UNION ALL을 사용한다.
UNION의 경우 기본 동작이 DISTINCT이고 모든 결과를 얻고 싶은 경우 ALL을 추가적으로 지정한다. (중복값이 없는 경우 UNION ALL을 사용하는 편이 좋은 성능을 보여준다. )
SQL을 이용해 교집합, 차집합도 구할 수 있다. (MySQL에서 지원 X)