Subquery
여러번의 연산을 한번에 실행
필요한 경우 : 여러번의 연산을 실행해야 할 때, 조건문에 연산 결과를 사용해야 할 때, 조건에 query 결과를 사용하고 싶을 때
select column1, special_column
from
( /* subquery */
select column1, column2 special_column
from table1
) a
괄호 안에서 select문으로 쿼리를 조회해 주면 column1, 2가 나온다.
이 결과를 메인 쿼리 문에서 계산을 해주고 싶을 때, 결과문에서 column1만 뽑아서 사용하는 것이 subquery문이다.
ex) 음식 주문시간이 25분보다 초과한 시간을 가져오기
select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from
(
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders
) a
괄호 안에서 food_orders에서 데이터를 불러오는데 order_id, restaurant_name, food_preparation - 25를 해줌
25분보다 몇분이 초과됐는지 구하기 위해 25를 빼주고, over_time라고 별명을 지어줌 → 25를 빼주는 연산 진행
괄호로 묶어준 다음 연산 결과를 가져와서 over_time이 0보다 큰 경우에는 over_time을 출력해주고,
0보다 작은 경우에는 0을 출력해라 라고 if문을 작성함
괄호 안에있는 것만 연산을 하면 마이너스 값들도 같이 출력이 되기 때문에 괄호 안의 연산을 한번 해준 다음 if문을 적어서 알아보기 쉬운 모양으로 출력되게 함
JOIN
데이터가 다른 테이블에 있을 때 조회
join은 공통 컬럼을 기준으로 묶는다.
공통컬럼을 기준으로 두 테이블을 합쳐서 각 테이블에서 필요한 데이터를 조회할 수 있도록 만들어 준다.
-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
공통 컬럼은 묶어주기 위한 공통값이기 때문에 두 테이블의 컬럼명은 달라도 된다.
left join
공통 컬럼(키값)을 기준으로 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미한다.
select 조회할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
inner join
공통 컬럼(키값)을 기준으로 두 테이블 모두 있는 값만 조회한다.
select 조회할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
테이블에 잘못된 값이 들어 있을 때
방법1 . 없는 값 제외해주기
mysql에서는 사용할 수 없는 값일때 해당 값을 연산에서 제외해서 0으로 간주한다.
avg(if(ex<>'Not given', ex, null))
ex가 ‘not given’이 아니다, 정상적인 값을 가지고 있으면 ex를 그대로 써주고, not given이란 값을 가지고 있으면 없는것으로 친다.
(null은 데이터가 아예없다 라는 것을 의미한다.)
null값을 제외하고 싶을 때
is not null → null인 값들은 다 제외
where b.customer_id is not null
customer 테이블에서 데이터가 없는 것들을 다 제외하는 것 → is not null을 where절에 적어준 다음 평균을 구하면 null값을 0으로 대체하거나 다른 값으로 대체하는 것이 아니라 없는 값들을 제외한 다음에 평균을 구해준다.
방법2. 다른 값을 대신 사용하기
사용할 수 없는 값대신 다른 값을 대체해서 사용하는 방법이 있는데, 데이터 분석 시에는 평균값 혹은 중앙값 등 대표값을 이용하여 대체하기도 한다.
다른 값으로 변경하고 싶을때 사용가능한 문법
다른 값이 있을 때 조건문 이용하기 if(ex>=1, ex, 대체값)
null 값일 때 coalesce(ex, 대체값)