카테고리 없음

SQL 3주차 개발일지

막뇌 2023. 1. 5. 23:54

3주차는 Join과 Union을 중점적으로 공부 했다.

 

Join 이란?

 

실무에서 테이블은 생각보다 복잡하게 얽혀 있으며 한개의 테이블에 모든 데이터를 담는것 보다 여러개의 테이블을 운용하는것이 자원 소모가 적다.

두개이상의 테이블에서 동시에 데이터가 필요 한 경우 합치는 역할을 담당하는 쿼리이다.

두 테이블을 연결 할 때 당연하지만 어떤 기준이 되는 데이터가 있어야 한다.

 

예를 들면 A반의 신체 검사 정보 라는 테이블과

같은 A반의 하루 평균 수면 시간 이라는 테이블이 있다고 할 때

우리가 학생들의 비만도와 수면시간을 비교 해보려고 한다면

Join을 사용하여 둘을 합칠 때 적어도 학생들의 이름이라는 공통 데이터가 있을 것이다.

 

이 때 기준 값을 'Key 값'이라고 하며 이는 대부분의 상황에서 select 쿼리가 직접 지정하는 값이 될 것이다.

 

Join을 사용하기 전에 별칭(Alias) 사용에 대해 숙지해야 한다.

한 쿼리 문장에 한 테이블만 사용 할 때는 별칭을 굳이 사용하지 않아도 어떤 컬럼을 지칭 하는지 바로 알 수 있지만

한 문장에 2개 이상의 테이블이 등장 한다면 이야기가 다르다.

이 때 별칭(Alias)을 사용 하면 쉽게 구분 가능하다.

 

간단하게 Join의 예를 들어 보자

select * from bodyprofile bp
inner join sleepingtime st
on pb.name = st.name

위에서 예를 들었던 비만도와 수면시간을 비교하기 위해 학생의 이름(name컬럼)을 Key값으로 설정했다.

쿼리문에서 테이블을 최초로 불러 올 때 변수를 지정 하는것 처럼 붙여주는 별칭이다.

예문에서는 bodyprofile을 bp로, sleepingtime을 st로 설정 했다.

 

inner join과 left join의 차이

left는 남겨두다, 내버려두다 라는 의미를 가지고 있다.

위의 예를 계속 들자면 수면 시간측정을 거부 했거나 아예 등교를 하지 않은 학생이 있을 수도 있다. 측정 기간에 출석을 하지 못한 경우 이름만 존재 하고 신체검사 데이터나 수면 시간 데이터가 없을 수 있고, 심지어 Key값이 되는 이름 조차 한쪽에는 있고 한쪽에는 없는 경우가 발생할 수 있다.

이 떄 inner join을 사용하면 공통된 데이터를 갖고 있지 않은 학생은 자동으로 배제 하지만.

left join을 사용하면 날것 그대로의 데이터를 가져오게 된다. 데이터를 갖고 있지 않은 경우 NULL 로 표기 된다.

 

이 경우 where 절을 사용하면 아래와 같이 NULL값을 가진 행을 따로 종합하거나 배제 할 수 있을 것이다.

where bp.bmi is null

where st.avg_time_for_sleep is not null

Union 이란?

각 테이블이 가지는 필드명이 완전히 같을 때 2개의 테이블을 이어 붙여 보여주는 역할을 한다.

월,년도 별로 테이블이 다른경우에 쓸 수 있겠다.

(쿼리문A)
union all
(쿼리문B)

A와 B는 같은 필드명을 사용하는 테이블이어야 한다.

이렇게 되면 Key값도 필요 없다.