관계형 데이터 모델은 수학의 집합론
을 따른다.
합집합의 기능하면 단 사용 조건이 있다.
UNION DISTINCT라는 문법은 사용 불가
합집합은 나열 순서에 여향을 주지않고, SELECT 순서에 맞게 결과값들이 달라진다.
ORDER BY를 지정할 때 마지막 SELECT 명령
에만 저장한다.
SELECT a FROM samlple71_a
UNION
SELECT b FROM sample71_b ORDER BY b;
합집합의 개념인데, 단순히 중복제거를 하지 않는 기능
을 가짐.
UNION ALL 성능이 더 좋다.
그 이유는 중복처리 작업을 해주지 않기 때문이다.
MySQL에서는 적용이 안되고, Orcale에서는 적용 가능한 예약어가 존재한다.
[Oracle]
아래와 같이 행렬에서 곱하는 것와 같다.
그러면 곱집합을 활용해서 SQL에서는 교차결합이라고 하는데
아래와 같이 구현된다.
출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어] p.287
FROM 구에서 복수의 테이블을 지정하면 교차결합한다.
또한 결합은 열(가로)방향
으로 확대된다.
교차결합을 할 경우 데이터의 양이 커지게 때문에, 내부결합을 자주 사용
순서는,
위 내부결합은 구식방법으로 주로 INNER JOIN을 많이 사용한다.
[문법(별명 없는 경우)]
SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건
[문법(별명 있는 경우)]
SELECT * FROM 테이블명1 [별명1] INNER JOIN 테이블명2 [별명2] ON 결합조건
예시
SELECT S.상품명, M.메이커명
FROM 상품2 S INNER JOIN 메이커 M
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';
두 개의 테이블의 외부키와 기본키의 관계에 대해 일대다, 다대일, 일대일 등 관계를 아는 것이 중요
외부결합은 어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지
변경하는 결합 방법
예제로 상품 테이블과 재고수 테이블이 있는데 변경사항으로
INNER JOIN 쿼리문을 실행되면 어떻게 될까?
SELECT S.상품명, M.메이커명
FROM 상품2 S INNER JOIN 메이커 M
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';
결과
상품4의 결과값은 나오지 않음.
재고수 테이블에는 상품코드 9 행에 대한 데이터가 없기 때문이다.
그럼 외부결합은 아까 설명한거 와 같이 설명했는데, 어느 한쪽을 상품 테이블
에 만 존재하는 데이터행을 다룰려고 한다.
외부결합은
어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지
변경하는 결합 방법
[LEFT JOIN]
SELECT S.상품명, M.메이커명
FROM 상품2 S LEFT JOIN 메이커 M
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';
상품4에 대한 결과값은 나오지만 아직 재고수 테이블에는 해당 데이터가 없기 때문에 NULL 출력.
RIGHT JOIN 도 사용 가능한다. LEFT JOIN과의 차이는 단순히 방향의 차이다.
[RIGHT JOIN]
SELECT S.상품명, M.메이커명
FROM 메이커 M RIGHT JOIN 상품2 S
ON S.메이커코드 = M.메이커코드
WHERE S.상품분류 ='식품료';
해당 쿼리를 사용해도 LEFT JOIN과 같은 결과가 나온다.
출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어]