SQL 첫걸음 - 7, 8장

채원·2023년 10월 14일
0

7장 - 복수의 테이블 다루기

집합 연산

MySQL에서는 각 테이블을 집합, 그리고 그 안의 데이터 하나하나를 집합의 원소로 간주할 수 있다.
따라서 집합 연산을 통해 두 테이블 간의 연관관계를 이용하여 원하는 데이터를 추출하는 것이 가능하다.

  • UNION
    합집합을 구하기 위해서는 UNION 연산자를 사용한다.
    예를 들어서, a 테이블과 b 테이블에서 합집합을 구하기 위해서는 다음과 같이 작성한다.
SELECT * FROM a
UNION
SELECT * FROM b;

이때, 세미콜론은 b 뒤에만 붙여주어야 한다. 두 개의 명령을 UNION으로 합치는 것이기 때문에, 중간에 명령이 끝나면 합집합 연산이 제대로 수행되지 않는다.

정렬을 하기 위해 ORDER BY 구를 사용할 때는 두 번째 명렁에만 붙여준다. 이 때, 기준으로 정렬하고자 하는 열의 이름이 서로 다른 경우는 as를 사용하여 이름을 통일시킨 후 사용하면 된다.

  • UNION ALL
    UNION 연산의 결과는 DISTINCT를 적용시킨 것처럼 중복되는 결과는 제거된 채로 출력이 된다. 만약 중복되는 결과까지도 출력하고 싶다면, UNION ALL 연산자를 사용하면 된다.

교집합과 차집합은 MySQL에서는 지원되지 않는다.

테이블 결합

집합 연산은 세로 방향으로 데이터가 늘어나거나 줄어들지만, 테이블 결합은 가로 방향으로 데이터가 늘어난다.
이는 곱집합 연산을 생각하면 되는데, 만약 테이블 x와 y가 존재한다면 x의 요소에 y의 요소를 붙여서 새로운 집합을 생성하는 것이다.

  • 교차결합
    SELECT 구에서 테이블을 두 개 지정하면 자동으로 이 둘은 곱집합으로 계산된다.
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의 테이블을 말한다.
    각 릴레이션에는 속성이 존재하는데, 이는 SQL의 열과 같다. 그리고 튜플도 존재하는데, 이는 SQL의 행과 같다.
  • 관계대수
    릴레이션은 튜플의 집합이며, 릴레이션에 대한 연산이 집합에 대한 연산에 대응된다는 이론을 관계대수라고 한다.

릴레이션에서의 연산을 SQL의 연산과 일대일 대응시킬 수 있다. 합집합은 UNION, 차집합은 EXCEPT, 교집합은 INTERSECT, 곱집합은 CROSS JOIN, 선택은 WHERE, 투영은 SELECT, 결합은 내부결합에 해당된다.

8장 - 데이터베이스 설계

데이터베이스 설계

데이터베이스를 설계한다는 것은 데이터베이스의 스키마 내에 테이블, 인덱스, 뷰 등의 데이터베이스 객체를 정의하는 것을 말한다.
데이터베이스를 설계할 때에는 다음과 같은 것들을 정의해야 한다.

  • 논리명과 물리명
    열이나 테이블의 이름을 지어도 SQL 명령에는 제약이 존재하기 때문에 이름을 물리명과 논리명으로 나누는 경우가 존재한다. 논리명은 실제로 테이블을 부를 때 사용하는 이름이고, 물리명은 테이블을 작성할 때 사용하는 이름이다.
  • 자료형
    수치형 데이터를 저장하는 것이 필요할 때에는 수치형으로 지정하면 된다. 반대로 이름과 같이 알파벳이 들어가는 데이터를 저장할 때에는 문자열형을 사용하면 된다.
  • 고정길이와 가변길이
    만약 제조번호처럼 자리수가 고정되어 있는 데이터를 저장할 때에는 고정길이를 사용하면 된다. 반대로, 입력되는 문자열의 변동폭이 클 때에는 가변길이를 사용한다.
  • 기본키
    상품코드처럼 분명한 기본키가 존재한다면 좋지만, 만약 그런 열이 존재하지 않는다면 자동증가 열을 사용하여 기본키로 지정할 수 있다. MySQL에서는 AUTO_INCREMENT를 지정하는 것으로 자동증가 열을 설정할 수 있다.

ER 다이어그램

ER 다이어그램이란 엔티티 간의 관계를 나타내는 도식이다. UML의 클래스 다이어그램을 생각하면 이해하기 편하다. 실제로 표현하는 방식도 클래스 다이어그램과 유사하다.

정규화

정규화는 테이블을 올바른 형태로 변경하고 분할하는 것을 의미한다. 정규화에는 여러가지 단계가 존재하는데, 이 책에는 세 번째 단계까지 설명하고 있다.

제1정규형

관계형 데이터베이스의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다. 따라서 제1정규형에서는 먼저 반복되는 데이터를 세로 방향으로 늘리게 된다. 그 이후, 테이블에 중복되는 값이 존재하므로, 테이블을 분해하는 과정도 이루어진다.

따라서 제1정규형의 과정은 크게 테이블 분할과 기본키 지정으로 이루어져 있다고 말할 수 있다.

제2정규형

이후 정규화에서는 중복되는 부분을 찾아내어 테이블로 분할해 나가는데, 이 때 기본키에 의해 특정되는 열과 그렇지 않은 열로 나누는 과정을 제2정규형이라고 한다. 어려운 말로는, 함수종속성을 찾아내서 테이블을 분할하는 것을 제2정규화라고 한다.

제3정규형

기본키 이외의 부분에서 중복이 없는지를 조사한 후, 테이블을 분할하는 것을 제3정규형이라고 한다.


이와 같이 정규화를 하는 이유는 '하나의 데이터는 한 곳에 있어야 한다'는 규칙을 지키기 위함이다.
데이터가 한 곳에 저장되어 있다면, 수정이 필요할 때에 그 부분만 수정하면 되므로 편리하다.

트랜잭션

트랜잭션은, 깃을 사용할 때 커밋이 수정하는 족족 올라가는 것이 아니라 먼저 stage에 올려둔 다음에 한꺼번에 모아서 커밋하는... 그런 과정을 생각하면 된다.
트랜잭션을 사용해 테이블을 수정하면 만약 데이터 수정 중 에러가 발생했을 시 롤백하여 모든 수정을 초기화 할 수 있어 편리하다.

MySQL에서 트랜젝션을 시작하기 위해서는 다음과 같은 명령을 사용하면 된다.

START TRANSACTION

이 명령을 사용하면 자동커밋이 꺼지고 이후 COMMIT이나 ROLLBACK 명령을 사용해야만 그 수정한 내용이 적용되거나 사라진다.

profile
학부생

0개의 댓글