SQL 첫걸음 7장
31. 집합 연산
SQL과 집합
데이터베이스에서는 테이블이 집합, 테이블의 행이 요소에 해당함
SELECT
명령으로 반환되는 결과 전체를 하나의 집합이라고 생각할 수 있음
UNION으로 합집합 구하기
합집합을 계산할 경우에는 UNION
키워드를 사용함
SELECT * FROM 테이블1
UNION
SELECT * FROM 테이블2;
위와 같은 형식으로 사용하며, 각 SELECT
의 실행결과로 나타나는 집합을 합집합으로 계산하여 최종적인 결과를 반환함
- 이 때
SELECT
명령의 열의 내용은 서로 일치해야 합집합 연산을 실행할 수 있음 - 단, 전체 데이터를 반환하는
*
를 쓰지 않고 열을 따로 지정하여 집합의 요소가 될 데이터를 서로 맞춰줄 경우UNION
연산을 실행할 수 있음 - 나열 순서는 결과에 영향을 주지 않으나, 결과값의 나열 순서는 달라질 수 있음
UNION
사용시 각 SELECT
명령에 ORDER BY
를 지정할 수는 없으며, 마지막 SELECT
에만 지정할 수 있음
합집합의 결과를 정렬해야하기 때문에 ORDER BY
구에 지정하는 열은 별명을 붙여 이름을 일치시켜야 함
중복을 제거하고싶지 않을 때에는 UNION ALL
을 사용함
UNION
은 중복 검사 절차가 필요한 만큼 UNION ALL
이 성능적으로 유리한 경우가 있음
교집합과 차집합
교집합은 INTERSECT
, 차집합은 EXCEPT
(Oracle은 MINUS)를 사용
MySQL에서는 지원하지 않음
32. 테이블 결합
곱집합과 교차결합
곱집합은 두 개의 집합을 곱하는 연산 방법으로 적집합 또는 카티전곱(Caresian product)라고도 불림
SELECT
명령의 FROM
구에 두 개의 테이블을 지정하면 두 테이블을 곱집합으로 계산하는 교차결합을 실행함
SELECT * FROM 테이블1, 테이블2;
의 형식으로 사용UNION
을 사용한 합집합은 세로 방향으로 더해지고, 곱집합은 가로 방향으로 더해짐
내부결합
테이블 수가 늘어날수록 교차결합의 결과가 복잡해지기 때문에 대신 내부결합이 자주 사용됨
관계형 데이터베이스에서는 테이블의 데이터가 유일한 값을 가지도록, 즉 기본키를 가지도록 하는 것이 권장됨
기본키는 하나의 데이터행을 대표할 수 있는 속성을 가짐
다른 테이블의 데이터를 참조해야하는 경우, 참조할 테이블의 기본키와 동일한 이름과 자료형으로 열을 만들어서 행을 연결하는 경우가 많음
먼저 곱집합으로 테이블을 결합하고, 결합된 집합에서 WHERE
구로 조건을 지정하여 원하는 조합을 검색하는 것을 내부결합(Inner Join)이라고 부름
INNER JOIN으로 내부결합하기
- FROM 구에 테이블을 복수 지정해 가로 방향으로 테이블을 결합할 수 있음
- 교차결합을 하면 곱집합으로 계산됨
- WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색할 수 있음
내부결합을 위와 같은 구식 방식으로도 구할 수 있지만, 최근에는 INNER JOIN
키워드를 사용한 결합방법이 일반적으로 통용됨
SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건
의 형식으로 사용
내부결합을 활용한 데이터 관리
상품 테이블 : 상품코드 / 상품명 / 메이커명 / 가격 /상품분류
위와 같은 열들을 가진 상품 테이블이 테이블이 있을 때, 메이커코드와 메이커명을 가지는 메이커 테이블을 작성해 데이터를 관리할 수 있음 코드와 이름을 가지는 테이블로 분할해 관리하면 저장공간을 절약할 수 있음
메이커 테이블 : 메이커코드 / 메이커명
SELECT S.상품명, M.메이커명
FROM 상품 S INNER JOIN 메이커 M
ON S.메이커코드 = M. 메이커코드;
상품 테이블에서 메이커명을 메이커코드로 변경한 후, 상품명과 메이커명을 같이 출력하기 위해 내부결합을 사용함
매번 테이블명을 지정하는 번거로움을 피하기 위해 별명을 붙일 수 있음
상품 테이블에서의 기본키 제약은 상품코드에만 걸려있기 때문에 메이커코드에 중복하는 행이 있어도 제약에 위반되지 않음
그러나 메이커 테이블에서는 메이커코드에 기본키가 지정되어있어 중복을 허용하지 않음
따라서 상품 테이블의 메이커코드는 외부키라고 부르며, 즉 다른 테이블의 기본키를 참조하는 열이 외부키가 됨
테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합할 수 있으며, 이를 자기결합(Self Join)이라고 함
자기결합에서는 결합의 좌우가 같은 테이블이되므로 이를 구별하기 위해 반드시 별명을 붙여야 함
외부결합
어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지를 변경할 수 있는 방법을 외부결합이라고 함
상품 테이블 : 상품코드 / 상품명 / 메이커명 / 가격 / 상품분류
재고수 테이블 : 상품코드 / 재고수
위와 같은 테이블들에서, 재고수 테이블에는 존재하지 않는 상품코드를 상품 테이블에 추가할 시 곱집합을 구해도 추가한 상품코드는 내부결합 결과에서 제외됨
이럴 경우 결합할 테이블 중 어느쪽을 기준으로할지 결정할 수 있는 외부결합을 사용
SELECT 상품.상품명, 재고수.재고수
FROM 상품 LEFT JOIN 재고수
ON 상품.상품코드 = 재고수.상품코드
WHERE 상품.상품분류 = '식료품';
위와 같이 LEFT JOIN
또는 RIGHT JOIN
명령어를 사용하며, 데이터가 추가되지 않은 테이블의 값은 NULL
로 표시됨
MySQL은 비교적 최근에 나온 데이터베이스로 구식 방법 이용시 내부결합은 가능하나 외부결합은 할 수 없음
Oracle, SQL Server 등에서는 가능하나 서로 다른 방법을 사용하는 방언에 속함
따라서 현재는 표준화된 방법인 내부결합 키워드 INNER JOIN
과 외부결합 키워드 LEFT JOIN
, RIGHT JOIN
의 사용이 권장됨
33. 관계형 모델
SQL은 관계형 모델에 의해 구축된 데이터베이스를 조작하는 체계적인 명령의 집합
다만 관계형 모델에서 사용하는 언어와 SQL의 언어는 일치하지 않음
관계형 모델
관계형 모델(Relational Model)의 기본적인 요소는 릴레이션(Relation)임
관계형 모델의 릴레이션은 SQL에서 말하는 테이블에 해당됨
- 릴레이션에는 몇가지 속성(attribute)가 있고, 이는 SQL의 열에 해당함
- SQL에서의 행은 관계형 모델에서 튜플(tuple)이라고 불림
- 릴레이션은 튜플의 집합
- 관계대수 : 릴레이션에 대한 연산이 집합에 대한 연산에 대응됨
- 하나 이상의 릴레이션을 바탕으로 연산
- 연산한 결과, 반환되는 것 또한 릴레이션
- 연산을 중첩 구조로 실행해도 상관없음
관계형 모델과 SQL
합집합(union)은 릴레이션끼리의 덧셈을 뜻하며, SQL에서는 UNION
에 해당함
차집합(difference)은 릴레이션끼리의 뺄셈을 뜻하며, SQL에서는 EXCEPT
에 해당함
교집합(intersection)은 릴레이션끼리의 공통부분을 뜻하며, SQL에서는 INTERSECT
에 해당함
곱집합(cartesian product)은 릴레이션끼리의 대전표를 조합하는 연산을 뜻하며, SQL에서는 FROM
구에 복수의 테이블을 지정한 경우에 해당함
- 이 때
CROSS JOIN
으로 교차결합시 곱집합을 구할 수 있음 SELECT * FROM 테이블1 CROSS JOIN 테이블2
의 형식으로 사용함
선택(selection)은 튜플의 추출을 뜻하고 제한이라고 불리기도 하며, SQL에서 WHERE
구에 조건을 지정해 데이털를 검색하는 경우에 해당함
투영(projection)은 속성의 추출을 뜻하며, SQL에서 SELECT
구의 결과로 반환할 열을 지정하는 경우에 해당함
결합(join)은 릴레이션끼리 교차결합해 계산된 곱집합에서 결합조건을 만족하는 튜플을 추출하는 연산으로, SQL에서의 내부결합에 해당함