본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

[DB] JOIN,서브쿼리

by 초응 2022. 12. 15.

[JOIN]

: 두개 이상의 표를 연결해서 하나의 데이터로 보여주는 것.

 

데이터베이스는 뼈대이다.

정규화 작업  - 표를 나누는 작업

제 1 정규화 작업 : NULL을 허용하지 않는다. (표를 나누는 작업)

제 2 정규화 작업 :  중복을 허용하지 않는다. (중복되는 데이터가 있다면 그안에 표를 또 나눈다)

제 3 정규화 작업 -

-

BCNF 역정규화 : 나눈 표를 다시 합치는 작업(필요한 데이터 합치기)

 -> 개발자가 제 2 정규화 까지는 만들어 놔야 한다.

 

EQUL JOIN : 같은 데이터를 연결할 때 사용하는 JOIN (=)
컬럼명의 모호성.
--[EQUL JOIN : 같은 데이터를 연결할 때 사용하는 join]
--프라이머리키 기본키 (나라는걸 알려주기위한(식별을 위한)) 

select empno,ename,sal,dname
from emp,dept
where emp.deptno = dept.deptno
and ename='FORD'

-- 컬렴 명의 모호성 해결(dept가 어느 테이블의 dept인지모름) 

select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d --(emp 와 e는 다른거. 가상테이블))
where e.deptno = d.deptno

 


NON-EQUL JOIN: 범위를 지정하여 사용하는 JOIN (관계 연산자 , <=,>=,<,>)
select empno,ename,dname,sal,grade
from emp,salgrade,dept
where  emp.sal between salgrade.losal and salgrade.hisal
and emp.deptno = dept.deptno

SELF JOIN : JOIN할 대상이 나와 나 (= eaul join)

 *내가 지정한 이름으로 복사한 가상테이블 만들 수 있음. 
- emp를 복사한  가상테이블 e1 , emp를 복사한 가상테이블 e2
- 별칭을 준다는건 워크테이블을 만든다는것.

select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno

OUTER JOIN : 없는 것들은 빈공간이라도 출력하기 (연산자 (+)이용)

select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno (+)

[서브 쿼리]
- 하나의 메인쿼리(SQL)에 포함되어 있는 또 다른 SQL문 (또 다른 쿼리의 재료로 쓰인다.)
- 결과가 하나만 나오면 단일행 서브쿼리라고 하며 그룹 함수(ex.count)와 같이 사용된다. 
- 결과가 여러개 나오면 다중행 서브쿼리. 연산자를 사용하여야한다. (연산자 : IN, ANY,ALL,EXIST 등)
-  in (=)  : or와 같은 하나라도 만족하면 참. = 으로 비교.
- all  : 비교 조건이 검색 결과와 모두 일치해야함, 단일행 서브쿼리(최대값)
- any : 비교 조건이 검색 결과와 하나라도 만족하면 참.  단일행 서브쿼리 (최소값)
select dname,loc
from dept
where deptno = (select deptno
                from emp
                    where ename = 'FORD')
                    
select a.* ,dname 
from (select empno ,ename,sal,deptno from emp)a , dept
where a.deptno = dept.deptno
and sal >=2000

select empno,ename,sal
from emp
--where sal>1600 or sal>1250 or sal>2850 or sal>1500 or sal>950
where sal>any (select sal
from emp
where deptno = 30 )

select empno, ename, sal
from emp
where deptno = (select deptno
                from emp
                where sal> (
                select avg(sal)
                from emp)and
                ename like '%S%')