MySQL에서는 각 테이블을 집합, 그리고 그 안의 데이터 하나하나를 집합의 원소로 간주할 수 있다.
따라서 집합 연산을 통해 두 테이블 간의 연관관계를 이용하여 원하는 데이터를 추출하는 것이 가능하다.
SELECT * FROM a
UNION
SELECT * FROM b;
이때, 세미콜론은 b 뒤에만 붙여주어야 한다. 두 개의 명령을 UNION으로 합치는 것이기 때문에, 중간에 명령이 끝나면 합집합 연산이 제대로 수행되지 않는다.
정렬을 하기 위해 ORDER BY 구를 사용할 때는 두 번째 명렁에만 붙여준다. 이 때, 기준으로 정렬하고자 하는 열의 이름이 서로 다른 경우는 as를 사용하여 이름을 통일시킨 후 사용하면 된다.
교집합과 차집합은 MySQL에서는 지원되지 않는다.
집합 연산은 세로 방향으로 데이터가 늘어나거나 줄어들지만, 테이블 결합은 가로 방향으로 데이터가 늘어난다.
이는 곱집합 연산을 생각하면 되는데, 만약 테이블 x와 y가 존재한다면 x의 요소에 y의 요소를 붙여서 새로운 집합을 생성하는 것이다.
SELECT * FROM A, B;
이렇게 작성하면 A와 B의 곱집합, 즉 교차결합을 한 결과가 출력된다.
이 때의 결과는 UNION은 자료가 세로로 길어지지만, 교차결합은 자료가 가로로 길어진다는 점에서 차이가 있다.
내부결합을 하는 방법에는 두 가지가 있다. 하나는 교차집합을 한 뒤 WHERE을 사용하여 원하는 조합을 검색하는 방법이고, 다른 하나는 INNER JOIN 키워드를 사용하여 결합하는 것이다. 전자의 방법은 구식으로 취급되고, 최근은 INNER JOIN을 이용한 결합을 보통 사용한다.
SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드
AND 상품.상품분류 = '식료품';
이 코드는 구식 방법으로 상품과 재고수 테이블에서 둘의 상품코드가 같고, 상품분류가 식료품인 데이터를 상품명과 재고수 열만 출력하는 명령어이다.
같은 명령어를 INNER JOIN을 사용하여 출력하면 다음과 같다.
SELECT 상품.상품명, 재고수.재고수
FROM 상품 INNER JOIN 재고수
ON 상품.상품코드 = 재고수.상품코드
WHERE 상품.상품분류 = '식료품';
FROM에서 두 개의 테이블을 바로 넣어서 교차결합을 하는 것이 아니라, 두 테이블 사이에 INNER JOIN 명령어를 넣어준다. 그리고 결합조건을 뒤에 ON을 사용하여 지정한다.
외부결합
외부결합 또한 교차결합으로 결합 조건을 지정하여 검색한다는 점은 같지만, 여기서는 어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지를 변경 가능하다는 점이 다르다.
만약 왼쪽에만 존재하는 데이터행을 사용하고 싶다면, LEFT JOIN 명령어를 사용하면 된다. 이 때, 오른쪽 테이블에는 존재하지 않는 데이터는 NULL로 표시되게 된다. 반대로 오른쪽에 있는 데이터를 기준으로 하기 위해서는 RIGHT JOIN 명령어를 사용한다.
MySQL과 같은 관계형 데이터베이스는 관계형 모델을 기반으로 작성되었다. 따라서 관계형 모델에 대해 살펴보는 것이 관계형 데이터베이스를 더 깊게 이해하는 데 도움을 준다. 단, 둘에서 사용하는 용어는 일치하지 않는다.
릴레이션에서의 연산을 SQL의 연산과 일대일 대응시킬 수 있다. 합집합은 UNION, 차집합은 EXCEPT, 교집합은 INTERSECT, 곱집합은 CROSS JOIN, 선택은 WHERE, 투영은 SELECT, 결합은 내부결합에 해당된다.
데이터베이스를 설계한다는 것은 데이터베이스의 스키마 내에 테이블, 인덱스, 뷰 등의 데이터베이스 객체를 정의하는 것을 말한다.
데이터베이스를 설계할 때에는 다음과 같은 것들을 정의해야 한다.
ER 다이어그램이란 엔티티 간의 관계를 나타내는 도식이다. UML의 클래스 다이어그램을 생각하면 이해하기 편하다. 실제로 표현하는 방식도 클래스 다이어그램과 유사하다.
정규화는 테이블을 올바른 형태로 변경하고 분할하는 것을 의미한다. 정규화에는 여러가지 단계가 존재하는데, 이 책에는 세 번째 단계까지 설명하고 있다.
관계형 데이터베이스의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다. 따라서 제1정규형에서는 먼저 반복되는 데이터를 세로 방향으로 늘리게 된다. 그 이후, 테이블에 중복되는 값이 존재하므로, 테이블을 분해하는 과정도 이루어진다.
따라서 제1정규형의 과정은 크게 테이블 분할과 기본키 지정으로 이루어져 있다고 말할 수 있다.
이후 정규화에서는 중복되는 부분을 찾아내어 테이블로 분할해 나가는데, 이 때 기본키에 의해 특정되는 열과 그렇지 않은 열로 나누는 과정을 제2정규형이라고 한다. 어려운 말로는, 함수종속성을 찾아내서 테이블을 분할하는 것을 제2정규화라고 한다.
기본키 이외의 부분에서 중복이 없는지를 조사한 후, 테이블을 분할하는 것을 제3정규형이라고 한다.
이와 같이 정규화를 하는 이유는 '하나의 데이터는 한 곳에 있어야 한다'는 규칙을 지키기 위함이다.
데이터가 한 곳에 저장되어 있다면, 수정이 필요할 때에 그 부분만 수정하면 되므로 편리하다.
트랜잭션은, 깃을 사용할 때 커밋이 수정하는 족족 올라가는 것이 아니라 먼저 stage에 올려둔 다음에 한꺼번에 모아서 커밋하는... 그런 과정을 생각하면 된다.
트랜잭션을 사용해 테이블을 수정하면 만약 데이터 수정 중 에러가 발생했을 시 롤백하여 모든 수정을 초기화 할 수 있어 편리하다.
MySQL에서 트랜젝션을 시작하기 위해서는 다음과 같은 명령을 사용하면 된다.
START TRANSACTION
이 명령을 사용하면 자동커밋이 꺼지고 이후 COMMIT이나 ROLLBACK 명령을 사용해야만 그 수정한 내용이 적용되거나 사라진다.