본문 바로가기
AWS(산대특)

DAY 14 - MysQL

by dkdlxl 2024. 2. 7.

join

: 두 개 이상의 테이블의 특정 조건에 따라 조합하여 결과를 조회하고자 할떄 사용하는 명령어 

 

INNER JOIN

: 두 테이블에서 조건이 일치하는 레코드만 반환 

select
E.employee_number as employee_number,
E.name as employee_name, 
    D.code as department_code,
    D.name as department_name,
    D.tel_number as department_tel_number
from employee as E inner join department as D
on E.department_code = D.code;


LEFT OUTER JOIN (LEFT JOIN)

: 첫 번째 테이블의 모든 레코드와 두 번째 테이블의 조건이 일치하는 레코드를 반환, 첫 번쨰 테이블의 레코드에서 조건이 일치하는 값이 없으면 null로 표현 

select
E.employee_number as employee_number,
E.name as employee_name, 
    D.code as department_code,
    D.name as department_name,
    D.tel_number as department_tel_number
from employee as E left join department as D
on E.department_code = D.code;


RIGHT OUTER JOIN (RIGHT JOIN)

: 두 번째 테이블의 모든 레코드와 첫 번째 테이블의 조건이 일치하는 레코드를 반환, 두 번쨰 테이블의 레코드에서 조건이 일치하는 값이 없다면 null로 반환

select
E.employee_number as employee_number,
E.name as employee_name, 
    D.code as department_code,
    D.name as department_name,
    D.tel_number as department_tel_number
from employee as E right join department as D
on E.department_code = D.code;


서브쿼리

: 쿼리 내부에 위치하는 또 다른 쿼리, 쿼리 결과를 조건이나 테이블로 사용할 수 있도록 함 

where 절에서 서브쿼리

: 쿼리 결과를 조건으로 사용하여 조건을 동적으로 지정 
: where 절에서 비교 연산으로 사용될 때 조회하는 컬럼의 개수 및 레코드 개수 주의 

-- 에러
select * from employee 
where department_code = ( 
select code from department 
);

 

* 서브쿼리에서 1개의 컬럼에는 1개의 값이 나왐

- 이 상태에서는 3개의 값(department의 값)이 나오기 때문에 결과 값을 찾을 수 없어서 에러가 남 

select * from employee 
where department_code = ( 
select code from department where name = '인사부'
);

* 에러가 나지 않을려면 where절 사용 

 

from 절에서의 서브쿼리 : 쿼리 결과 테이블을 다시 from절에 사용하여 복합적인 테이블 조회

select * 

from (
	select name, department_code
    from employee
	where department_code is null) as SQ # is not null일 때 에러남 is null로 변경함 
# (as로 SQ이름을 임의로 지정, 지정하지 않을 시 에러남)

where name = '홍길동';

* 서브쿼리를 사용할려면 테이블의 이름이 있어야 함

select * 
from (
select name as employee_name, department_code -- 에러 (as employee_name으로 변경상태에서 where절에 그대로 name을 사용했기 때문)
    from employee
    where department_code is null
) as SQ 
where employee_name = '홍길동'; # select에서 지정한 name으로 바꿔야지 사용가능
# select name as employee_name을 지정해줬기 때문에 where절에서 name이 없기 때문이다


부서 이름이 '개발부'인 사원이름, 부서코드, 부서명을 조회
:  하나의 테이블로는 찾을 수 없음 - 서브쿼리로 찾기 불가능 # 2개 이상의 테이블로 찾는 경우 join을 사용 

 

부서 이름이 '개발부'인 사원이름, 부서코드를 조회 
: 하나의 테이블로 찾을 수 있음 - 서브쿼리로 찾기 가능 # 1개의 테이블로 찾는 경우 서브쿼리 가능 
: join도 가능하지만 서브쿼리가 join보다 처리속도가 빠르기 때문에 서브쿼리를 사용함 

select name, department_code
from employee
where department_code = (
select code -- 부서코드를 조회
from department
where name = '개발부'
);

 

집계 함수

: 레코드를 '그룹화'하여 하나의 결과를 반환하는 함수 

count() : 특정 조건에 맞는 행의 개수를 반환 

select count(*) from jeju;
select count(*) from jeju where speed_80m > 3;


sum() : 특정 컬럼의 값을 모두 합한 결과를 반환 

select sum(speed_80m) from jeju;
select sum(speed_80m), sum(speed_70m) from jeju where observe_date like '2023-08-__';
select sum(speed_80m)/ count(speed_80m) from jeju;


avg() : 특정 컬럼의 값의 평균을 반환 

select avg(speed_80m) from jeju;


min(), max() : 특정 컬럼의 최소값과 최대값을 반환 

select min(speed_80m), max(speed_80m) from jeju;

 

그룹화(group by) : 레코드를 하나 이상의 컬럼으로 그룹하여 결과를 도출하고자 할때 사용 
일반적으로 집계함수와 함께 사용됨 

# select * from jeju2 group by observe_date; -- 에러 
select observe_date from jeju2 group by observe_date; # select위치에서 표현을 해줘야 실행됨  
# select observe_date, speed_80m from jeju2 group by observe_date; -- 에러  
select observe_date, speed_80m from jeju2 group by observe_date, speed_80m; # select위치에서 표현을 해둔것은 group by절에도 표현을 해줘야 함
select observe_date, avg(speed_80m) from jeju2 group by observe_date;

  
필터링(HAVING) : 그룹화된 결과에 필터링을 적용하는 명령어 
주의! where절과 사용방법이 같지만 where절은 select 이전에 실행되고 having절은 select 이후에 실행 

select observe_date, avg(speed_80m) as avg 
from jeju2 
group by observe_date
having avg > 5.5;
select observe_date, avg(speed_80m) as avg 
from jeju2 
group by observe_date
having speed_80m > 5.5; -- 에러 #speed_80m는 이 테이블에 대해서는 존재하지 않음
select observe_date, avg(speed_80m) as avg 
from jeju2 
where speed_80m > 5.5 # 사용하기 위해서는 where절에서 사용해야 함 
group by observe_date;

'AWS(산대특)' 카테고리의 다른 글

DAY 16 - MySQL  (0) 2024.02.13
DAY 15 - MySQL  (0) 2024.02.08
DAY 13 - MySQL  (0) 2024.02.06
DAY 12 - MySQL  (0) 2024.02.05
DAY 11 - GitHub  (0) 2024.02.01