ice rabbit programming

[SQL] 관계, 외래키, alias, join 본문

Development/SQL

[SQL] 관계, 외래키, alias, join

판교토끼 2020. 6. 28. 14:26

관계란?

관계는 각 테이블 간의 논리적 관계로, 1대1, 1대n, n대m관계가 있다.

- 1대1 관계 : 각 개체가 1:1로 이어지는 관계(ex. 사람:주민등록번호)
- 1대n 관계 : 한 쪽 개체가 여러 객체를 가지는 관계(ex. 직원들:부서)
- n대m 관계 : 양 쪽 개체가 서로 여러 개체(다수 관계)를 가지는 관계(ex. 상품:고객)
 -> 여러 고객은 여러 상품을 살 수있고, 여러 상품은 여러 고객에게 팔릴 수 있다.

데이터 중복이 있으면 데이터의 일관성, 무결성, 보안성, 경제성 등에 해를 끼칠 수 있으므로, 테이블을 만들 때는 중복이 되지 않게 해야 한다. 이를 해결하기 위해 중복의 가능성이 있는 데이터를 다른 테이블로 나누고 관계를 맺게 한다.

외래키

관계를 가지고 있는 다른 테이블의 컬럼을 참조하여 만든 컬럼으로, 고유키이거나 unique이어야 한다. 즉, 중복이면 안 된다.

외래키는 참조 무결성의 특징을 가지는데, 참조 대상이 존재하지 않는 외래키를 허용하지 않는다. MySQL에서 아직 만들어지지 않은 테이블/컬럼/데이터를 참조하려 하면 바로 에러가 발생한다. 단, null이 들어가는 것은 허용한다.

create table employee(
	empno int not null,
    deptno int,
    foreign key(empno) references dept(deptno)
)

와 같이 선언한다.

alias(별칭)

C++이나 다른 언어들에서도 alias를 많이 들어볼 수 있다. SQL에서 alias는 컬럼의 별명으로, 컬럼이 너무 길어서 문제가 발생하거나 가독성이 떨어질 때 별칭을 붙여서 보기 편하게 할 수 있다.

floor(-123823749235235.21938712~129837129487.13498723948)라는 것이 있다고 하면, 너무 보기 어려우니 뒤에 
as Math 를 붙여 컬럼명을 Math로 조회할 수 있도록 하는 기능이다.

Join

join은 전 글에서도 썼듯이 2개 이상의 테이블을 조합하여 한 번에 표현하는 것인데, 필자가 생각하기로는 관계형 데이터베이스에서 가장 많이 쓰이고 중요한 개념이라고 생각한다.

관계를 가지고 있는 여러 테이블을 조합하여 원하는 결과를 조회하는 것이다. 즉, 관계를 맺어 특정한 컬럼을 공유하고 있어야 하고, 공유할 때 참조 무결성을 보장해 주는 것이 외래키이다.

select actors.name, films.name, films.film_id from films join actors on films.film_id = actors.film_id;

이런 식으로 조인을 하고 on으로 조건을 넣어줄 수 있는데, 이 때 AS와 DOT을 사용할 수 있다. select에서 column을 지정하지 않고 *을 쓰면 모든 열이 중복을 포함해서 나오므로 데이터 가공이 필요할 경우 주의해야 한다.