Key란 릴레이션 안에서 각 튜플을 유일하게 식별할 수 있는 애트리뷰트 집합(set of attributes)
relational database의 relations들이 언제나 항상 지켜줘야 하는 제약사항들이다.
relational data model 자체가 가지는 constraints이다. 예를 들면 relation은 중복되는 tuple을 가질 수 없다는 예시가 있고 다른 예시론 relation 내에서는 같은 이름의 attribute를 가질 수 없다는 예시도 있다.
주로 DDL을 통해 schema에 직접 명시할 수 있는 constraints이다.
join이란 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법을 말한다. 연결하려면 테이블들이 적어도 하나의 컬럼을 공유하고 있어야 한다.
from 절에는 table들만 나열하고 where절에 join condition을 명시하는 방식이다.
SELECT D.name FROM employee AS E, department AS D WHERE E.id = 1 and E.dept_id = D.id;
이는 old-style join syntax이다. where절에 selection condition(E.id)과 join condition(E.dept_id = D.id)이 같이 있기 때문에 가독성이 떨어진다. 이때문에 복잡한 join 쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 커지게 된다.
위의 문제로 JOIN을 명시할 수 있는 join이 필요하게 되었다. 따라서 나온 것이 explicit join이다.
explicit join은 from절에 JOIN 키워드와 함께 joined table들을 명시하는 방식이다. from 절에서 ON 뒤에 join condition이 명시된다. 이 때문에 위의 단점들이 확실히 줄어들게 된다.
즉 가독성이 좋아지고 복잡한 join문을 작성할 때에도 실수할 가능성이 줄어들게 된다.
교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여준다. 보통 그냥 JOIN을 적게 되면 INNER가 생략되었다고 생각하면 된다. 가장 기본적인 타입의 JOIN이다.
기본적으로 JOIN table ON 조건과 같이 사용할 때 조건을 만족시키는 테이블을 표시해준다고 생각하면 된다.
따라서 inner join은 두 table에서 join condition을 만족하는 tuple들로 result table을 만드는 join이다. 이때문에 조건을 만족하지 못하는 튜플들은 테이블에 포함되지 않는다.
join condition의 연산자는 대부분의 연산자가 사용 가능하며 null 값을 가지는 tuple은 result table에 포함되지 못한다.
내부 조인의 경우에는 공통 컬럼명 기반으로 결과 집합을 생성하지만 외부 조인은 조건문에 만족하는 않는 행도 표시해주는 조인입니다. 그래서, 조인을 했을 때 한쪽의 테이블에 데이터가 없어도 조인 결과에 포함시키는 조인이다.
보통 LEFT(RIGHT,FULL) JOIN 이라고 쓰면 LEFT(RIGHT, FULL) OUTER JOIN처럼 OUTER가 생략됐다고 생각하면 된다.
왼쪽 외부 조인은 왼쪽에 A 테이블과 오른쪽에 B 테이블이 있을때 테이블 A의 모든 데이터와 테이블 B와 매칭이 되는 레코드를 포함하는 조인이다. 즉 왼쪽 테이블을 기준으로 똑같으면 값을 출력하고 아니라면 B테이블의 값을 null로 출력해서 A테이블은 일단 모두 나오는게 보장된다.
즉 A테이블은 모두 result table에 보장되며 B테이블은 조건이 매칭되지 않을 경우 null값으로 채워진다.
LEFT의 반대이다. B테이블이 모두 나오며 A테이블이 매칭되지 않을경우 null로 표시된다. 나머지 튜플들은 Join Condition에 매칭이 된 튜플들이다.
MtSQL에서는 명시적인 SQL 구문은 지원하지 않지만, UNION을 사용해 완전 외부 조인을 할 수 있다. 왼오른 모두 나오고 같은건 둘 다 나온다.
즉 result 테이블에 조건에 맞는 튜플 + 조건에 맞지 않는 A,B테이블의 모든 튜플을 담는다.
join condition에서 = 컨디션을 사용해서 조회를 한다면 이를 equi join라고 한다.
셀프 조인은 자기 자신과 조인하는 조인이다. 예를 들어 자신의 테이블 중에 같은 부서나 같은 과목을 든는 아이를 출력하고 싶을때 사용한다.
서브 쿼리내에서 존재하지 않는 데이터만 추출하여 메인 쿼리에서 추출하는 조인이다. NOT EXISTS나 NOT IN을 통해 사용 가능하다. 즉 이게 안들어있는걸 추출한다는 의미
예를 들어 같은 컬럼이 조인을 통해 같은 이름의 컬럼의 id를 통해 조인을 할 때 result table에 두 번 표시되는 경우가 있다. 이 때 USING을 사용하면 된다.
SELECT * FROM empl E INNER JOIN depart D ON E.dept_id = D.dept_id;
위의 코드를 실행하게 되면 dept_id 컬럼이 테이블에 두 개가 나오게 된다. 하지만 USING을 사용하면 아래처럼 표현이 가능하다.
SELECT * FROM emp E INNER JOIN depart D USING (dept_id);
또한 dept_id가 맨 앞으로 가게 된다.
정리하자면 두 테이블이 equi join할 때 join하는 attribute의 이름이 같다면, USING으로 간단하게 작성이 가능하다. 이 때 같은 이름의 attribute는 한 번만 표시된다.
두 테이블에서 같은 이름을 가지는 모든 attribute pair에 대해서 equi join을 수행한다. join condition을 따로 명시하지 않는다. 사용 예시는 아래와 같다.
FROM table1 NATURAL [INNER] JOIN table 2
두 table의 tuple pair로 만들 수 있는 모든 조합(= Catesian Product)을 result table로 반환한다. 그리고 위와 마찬가지로 join condition이 없다.
이는 implicit cross join과 explicit cross join이 각각 다르다.
table이 자기 자신에게 join하는 경우이다.