eajni IT 초보사전 💦💦

[DB] SQL 조인

2023-02-24

5장 조인


두개 이상 테이블의 컬럼 출력 시 Join을 사용해 컬럼의 정보를 가져옴

  • ANSI 호환 JOIN : 모든 SQL에서 공통으로 사용하는 JOIN구문 ( Oracle, MY_SQL(Maria DB), MS-SQL, IBM DB2, …)

EQUI JOIN

공통 키컬럼을 이용해 두 테이블의 교집합 출력

  • 오라클 only ( 다른 SQL에서 호환 불가) ANSI 호환의 SQL구문에서 INNER JOIN과 같음
  • select절에 공통 키 컬럼 출력시 반드시 테이블명을 명시 (if not 오류 발생)
  • from절에 join할 테이블 명시, comma(,)를 사용해 나열
  • using절에 공통 키 컬럼 지정
  • where절에 두 테이블의 공통 키 컬럼을 찾아서 ‘=’
  • and절에서 조건을 처리
  • INNER JOIN (ANSI 호환 JOIN)
    • from절에 INNER JOIN
    • on절에 공통된 키 컬럼을 ‘=’로 처리
    • where에서 조건을 처리함

`

select eno 사원번호, ename 사원명, employee.dno 부서번호, dname 부서명, loc 부서위치
from employee, department               --조인할 테이블 나열
using (dno)
where employee.dno = department.dno     --두 테이블의 공통 키컬럼을 찾아서 '=' 처리
and employee.dno >=20;                  --조건 처리

--inner join
select ena 사원번호, ename 사원명, dno 부서번호, dname 부서명, loc 부서위치
from employee e INNER JOIN department d -- inner join
on e.dno = d.dno        --공통 키컬럼을 '=' 처리
where e.dno >=20;       --where로 조건을 처리함

NATURAL JOIN

  • 오라클 only (공통의 키 컬럼을 Oracle 내부에서 자동으로 공동 키컬럼을 찾아서 처리함) equi join과 같이 where 절에 두 테이블 공통 키 컬럼을 명시하지 않아도 됨
  • 두 테이블의 공통 키 컬럼은 동일한 타입이어야 함
  • select 절에서 공통 키컬럼 출력시 테이블명을 명시하면 오류 발생
  • from 절에서 natural join 사용
select ename 이름, salary 월급, dno 부서번호, dname 부서명    --테이블 명을 명시하면 안됨
from employee e natural join department d 
where salary >=2000;

NON EQUI JOIN

  • 오라클 only
  • from절에 테이블을 ,로 나열
  • where 절에 비교구문(<, >=), between~and 사용(공통 키 컬럼 없이 join), ‘=’을 사용하지 않음
select eno, hiredate, e.dno, salary, grade, dname
from employee e, department d, salgrade s
where e.dno=d.dno
and salary between losal and hisal;

SELF JOIN

  • 자신의 테이블(원본)을 가상의 테이블(원본을 복사한 테이블)에 join 반드시 별칭을 사용해 join, 상속관계 조회에 유용함
    select e.ename 사원, e.manager 상관번호, m.eno 상관번호, m.ename 상관 
    from employee e, employee m  -- 같은 테이블 사용, 반드시 별칭 적용
    where e.manager = m.eno
    order by e.ename asc;
    

    OUTER JOIN

  • 두 테이블에 공통적이지 않은 내용까지 출력 (null 포함) 오라클에서는 plus(+)를 사용해 outer join
  • ANSI 호환 구문
    • LEFT [OUTER] JOIN : 왼쪽 테이블 모든 레코드 출력
    • RIGHT [OUTER] JOIN : 오른쪽 테이블 모든 레코드 출력
    • FULL [OUTER] JOIN : 양쪽 테이블 모든 레코드 출력

카디시안 곱

  • 모든 레코드 조합 출력 (한 쪽만 데이터 있을 경우 반대 측은 null)

6장 서브쿼리


단일행 서브쿼리

  • 내부 쿼리문의 결과로 한 개의 행 반환
  • 단일행 비교연산자 (>, >=, <, <=, =, <>)

다중행 서브쿼리

내부 쿼리문의 결과로 여러개 개의 행 반환

  • 다중행 비교연산자 (IN, ANY, SOME, ALL, EXISTS)

--단일행
select ename, dno
from employee
where dno = 
	(select dno
	from employee
	where ename='SCOTT');

--다중행
select eno, ename
from employee
where salary in 
	(select min(salary)
	from employee
	group by dno);

select eno, ename, job, salary
from employee
where salary < 	any 
	(select salary
	from employee
	where job='SALESMAN')
	and job <> 'SALESMAN';

7장 뷰


물리적인 테이블을 근거한 논리적인 가상테이블 (디스크 저장 공간이 할당되지 않음)

목적

  1. 보안 : 실제 테이블의 특정 컬럼을 숨겨서 처리
  2. 편의성 : 복잡한 구문을 view로 만들어서 처리

뷰 생성

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name [(alias, alias, alias, ...)] 
AS subquery 
[WITH CHECK OPTION] 
[WITH READ ONLY];
  • CREATE OR REPLACE VIEW : 이미 존재하는 뷰에 대해서 그 내용을 새롭게 변경하여 재 생성
  • FORCE : 기본 테이블의 존재 여부에 상관없이 뷰 생성
  • WITH CHECK OPTION : 해당 뷰를 통해서 볼 수 있는 범위내에서만 UPDATE 또는 INSERT 가능
  • WITH READ ONLY : 해당 뷰를 통해서는 SELECT만 가능하며 INSERT/UPDATE/DELETE 불가

뷰 삭제

DROP VIEW {view} [,..n]
  • USER_VIEWS 데이터 딕셔너리에 저장되어 있는 뷰의 정의를 삭제

Comments

Content