DataBase/Concepts

[DataBase] 04. SQL(Structured Query Language) - Intermediate(1)

lumana 2024. 10. 11. 00:16

 

SQL(Structured Query Language) - Intermediate(1)

#Database/Concepts/Temp


(10/10) 굉장히 공들여서 작성한 글이여서 원래 동아리 스터디 용도로 일부 공개 했었는데, 더 많은 분들이 봤으면 하는 마음에 오픈!


이전 챕터에서 이어서 SQL 구문과 관련된 내용이 이어집니다. 요번 챕터에서 Join Operation을 중점으로 다루게 될텐데, 요즘 SQL 코테에서도 Join 관련 문제가 자주 등장한다고 하니 꼼꼼히 봐두시길!


Joined Relations

관계 대수에서 Join Operation에 대해서 살펴봤던거 기억나시나요? 기억 안나시면 서운합니다 ㅠㅠ
챕터 2 내용을 복기해보자면 Cartesian 곱은 모든 가능한 조합의 결과를 생성하므로 원하지 않은 결과까지 relation에 포함될 수 있어서, 선택 조건을 지정해서 원하는 데이터를 뽑아냈어야 했다. 이를 한 번에 처리해주는 Operation이 Join Operation을 사용한다고 했었습니다.


  • Join Operatioins은 두 개의 relation을 가져와 결과로 또 다른 relation을 반환합니다.
    • Join 작업은 카티션 곱으로, 두 relation의 튜플이 일치하는지 확인합니다 (일부 조건 하에).
    • 두 테이블의 공통 값을 사용하여 두 테이블의 열을 결합하는 데 사용됩니다.
      • SQL 쿼리에서 테이블을 결합하는 데 Join 키워드를 사용합니다.
    • Join 결과에 존재하는 attribute을 지정합니다.

Join에는 3가지 타입이 있습니다.

  • Natural join
  • Inner join
  • Outer join

3가지 Join 각각이 무엇이고 어떤 차이점이 존재하는지 살펴보겠습니다.


Natural Join

Natural Join은 두 테이블 간에 동일한 이름의 컬럼들을 자동으로 사용하여 조인한다.


  • Natural join은 동일한 attribute에 대해 동일한 값을 갖는 튜플을 일치시키며, 각 공통 열의 한 사본만 유지합니다.
    • 연관된 테이블(from절에 사용할 테이블)의 동일한 값을 가진 열은 한 번만 나타납니다

Syntax

SELECT *
FROM table1
NATURAL JOIN table2;

예시: 강의를 수강한 학생의 이름과 강의 과목 ID

select name, course_id
from students, takes
where student.ID = takes.ID;

  • from 절에서 cartesian 곱으로 얻는 relation에서 student.ID = takes.ID인 레코드를 선택하고 있다.

위 쿼리를 natural join을 통해서 작성한다면?

select name, course_id
from students
natural join takes;

선택 조건을 따로 작성하지 않아도 된다. Attribute의 이름이 같은 것(여기선 ID)끼리 알아서 비교해주기 때문에 쿼리가 매우 simple해졌다


예시: foods 테이블과 company 테이블의 Natural Join

SELECT *
FROM foods
NATURAL JOIN company;

결과

  • foods 테이블과 company table에서 Company_id가 일치하는 열(레코드)의 조합으로 구성된 Relation이 반환되었다.
  • foods table에 Company_id가 20인 레코드는 company table에 일치하는 레코드가 없으므로 Result table에는 빠져있다.

예시


Join Condition

여기까지 봤을 때 의문이 한 가지 떠오를 수 있다.
만약 비교해야 할 Attribute의 이름이 다르다면? 내가 원하는 Attribute 간의 비교를 지정해주고 싶다면?


이 때 사용하는게 ON 절이다. ON 절을 사용하면 명확하게 어떤 열을 기준으로 테이블을 조인할지를 지정할 수 있다.

  • 예를 들어, 두 테이블 A와 B가 있을 때, A.column1과 B.column2가 일치하는 행들을 조인하고 싶다면, ON A.column1 = B.column2라고 명시하면 된다.
  • 조건은 on 키워드를 사용한다는 점을 제외하면 where 절처럼 작성하면 된다.

예시

select *
from student, takes
where student_ID = takes_ID

위 구문을 join과 on을 사용하면 아래와 같이 나타낼 수 있다.


select *
from student join takes
on student_ID = takes_ID

주의!!! Natural joinjoin은 다르다. Natural join은 동일한 이름의 Column끼리 비교하지만, Join은 on 절을 통해 비교해야 할 Attribute를 지정해줘야 한다. 만약 on 절을 사용하지 않으면 두 테이블 간의 Cartesian 곱이 이루어진다.



Inner Join

INNER JOIN은 두 테이블 간에 교집합을 반환한다. 즉, ON 조건에 따라 두 테이블에서 일치하는 행만 결합하여 결과로 반환한다.


위에서 Join Condition을 설명하면서 Join ~~~ on 으로 sql을 작성한 것을 봤을텐데, 사실 여기서 사용한 Join이 Inner Join에 해당한다. Inner를 명시하지 않아도 Inner Join으로 작동하는 것이다.


Syntax

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;


예제: foods 테이블의 item_name, item_unit 열과 company 테이블의 company_name, company_city 열을 결합하기 위해 company_id가 일치하는 레코드만 선택하기


SELECT foods.item_name, foods.item_unit, company.company_name, company.company_city
FROM foods
INNER JOIN company
ON foods.company_id = company.company_id;


헷갈리지 말자 | INTERSECT VS INNER JOIN

INTERSECT : 두 쿼리의 결과에서 공통된 행을 반환

INNER JOIN : 두 테이블 간의 일치하는 행을 결합하여 하나의 결과로 반환