MySQL/MySQL icia 26일차

MySQL Join , 서브쿼리란?

swkn 2023. 3. 29. 16:34

MySQL Join에 대해서

1. 내부조인 ( inner join )

1. 두개 이상의 테이블을 하나의 테이블처럼 조회

2. 조건 : 두 테이블이 같은 컬럼 정보를 가지고 있어야 함

3. 보통 참조 관계에 있는 테이블 간에 join을 주로 한다.

4. 예시로는 게시글과 댓글의 관계를 들 수 있다.

게시글 테이블 : 제목 , 내용 , 작성자 , 글번호

댓글 테이블 : 댓글번호 , 내용 , 작성자 , 글번호

같은 deptno ( 글번호 ) 를 가지고 있다.

 

2. 외부조인 ( join )

외부조인은 두 테이블에 각각 결합이 되는 컬럼을 지정하고 각각의 컬럼에 같은 값이 저장되어 있는 데이터를 결합하여 받아온다.

내부 조인의 경우는 일치하지 않는 데이터를 검색하지 않았지만 외부 조인의 경우 일치하지 않는 경우도 데이터로 받아온다.

emp의 deptno와 dept의 deptno가 같은 경우 데이터를 합쳐서 출력한다

emp의 deptno 칼럼과 dept의 deptno 칼럼이 같은 것을 합쳐서 조회한 것이다.

 

 

 

3. 조인( join )의 예제

select * from emp e , dept d where e.deptno = d.deptno;

약어로도 사용 할 수 있다.

 

select empno , ename , deptno , dname from emp e , dept d where e.deptno = d.deptno;

deptno가 emp도 있고 dept에도 있기 때문에 명확하지 않아 오류가 난다

 

select e.empno , e.ename , e.deptno , d.dname , d.loc from emp e , dept d where e.deptno = d.deptno;

emp의 칼럼 empno , ename , deptno  dept의 칼럼 dname , loc을 조회했다.

 

-- emp , dept를 조인하여 empno , ename , deptno , dname , loc 조회
-- 단 , 급여가 2500 이상인 사람만 조회하고 , 조회 결과는 사원이름 기준으로 오름차순 정렬
select e.empno , e.ename , e.deptno , d.dname , d.loc 
	from emp e , dept d 	
		where e.deptno = d.deptno and e.sal >= 2500
				order by e.ename asc;

급여가 2500 이상 , 사원이름 기준으로 오름차정렬

 

 

 

2. 서브쿼리( Subquery )

1. 서브쿼리란?

1. 보조 쿼리문

2. 하나의 메인 쿼리문 안에 ()를 이용하여 쿼리문을 작성하는 형태다.

3. 먼저 수행되어야 하는 쿼리문이 있는경우 서브쿼리를 사용한다.

4. 서브쿼리는 단일 행또는 복수 행 비교 연산자와 함께 사용가능하다.

5. 서브쿼리에서는 order by를 사용하지 못한다.

 

2. 서브쿼리가 사용가능한곳

1. select 절

2. from 절

3. where 절

4. having 절

5. order by 절

6. insert 문의 values 절

7. update 문의 set 절

 

3. 서브쿼리 사용 예제

-- 최저급여를 받는 사람이 누구인지?
select * from emp order by sal asc;
-- 1. 최저급여값이 얼마인지?
select min(sal) from emp;
-- 2. 최저급여 값을 받는 사람이(최저급여 값과 sal 값이 일치하는) 누구인지 조회
select * from emp where sal=800;
-- 서브쿼리 적용
select * from emp where sal=(select min(sal) from emp);
-- 최고급여를 받는 사원 정보 조회
select * from emp where sal=(select max(sal) from emp);
-- allen보다 높은 급여를 받는 사원 조회
select * from emp where sal>(select sal from emp where ename = 'allen') 
	order by sal asc;