두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
Equi Join
:두 개의 테이블 간에 칼럼값들이 정확하게 일치하는 경우 컬럼을 매칭(주로 PK 와 FK)
( Simple Join)=내부조인(INNER JOIN)
Inner Join : Equi Join 과 동등
Non-Equi Join
: 두 개의 테이블간에 칼럼값이 서로 정확하게 일치하지 않는 경우에 사용
: 조건절에서 JOIN 조건이 '='이 아닌 다른 연산기호로 주어지는 경우
('<', BETWEEN a AND b)
Natural Join
:각 테이블에 동일한 이름의 컬럼이 존재 할 때 자동으로 조건이 적용된다.
Self Join
: 두 개의 테이블들 간에 JOIN을 거는 것이 아니라 같은 테이블에 있는 한 테이블 내에서 Join 하는 경우
Cartesian Product
: 모든 가능한 행들의 조합-발생 가능한 모든 경우의 수 (N개 행 테이블, M개 행 테이블 => N * M)
: 테이블들 간의 JOIN조건을 생략하거나(where절에 조인 조건 주지 않거나 where절을 추가해도 조인 조건 주지 않는 경우) 조건을 잘못 설정했을 경우, 두 테이블의 데이터를 기준으로 가능한 모든 조합의 데이터 조회됨 => Cross Join 발생 => 불필요한 양의 데이터 조회 => CPU과부화 ==> JOIN 사용 시 조인 조건 반드시 작성
Outer Join
:( Left/ Right/ Full Outer Join )
: 오른쪽외부조인
: 조건이 일치하지 않더라도 모든 행들을 검색하고자 할 때 사용, (+) 로 표시
--EQUI 조인과 WildCARD를 사용하여 이름에 ‘민’자가 포함된 모든 사원의 이름과 부서명을 출력하시오.
SELECT EMP.ENAME 사원이름
, DEPT.DNAME 부서명
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.ENAME LIKE '%민%';
--NATUAL JOIN을 이용하여 대전에 근무하는 모든 사원의 이름, 업무, 부서번호 및 부서명을 출력하시오.
SELECT EMP.ENAME 사원이름
, EMP.JOB 업무
, DEPTNO 부서번호 --테이블 이름 명시 x => 교차됨
, DEPT.DNAME 부서명
FROM EMP NATURAL JOIN DEPT
WHERE DEPT.LOC = '대전';
--SELF JOIN을 사용하여 사원의 이름 및 사원번호를 관리자 번호와 함께 출력하시오.
SELECT A.ENAME 사원이름
, A.EMPNO 사원번호
, A.MGR 관리자번호
, E.ENAME 관리자명
FROM EMP A, EMP E
WHERE A.MGR = A.EMPNO;
--SELF JOIN을 사용하여 지정한 사원의 이름, 부서번호, 지정한 사원과 동일한 부서에서 근무하는 사원을 출력하시오. (고영우)
SELECT E.ENAME 사원명, E1.DEPTNO 부서번호
FROM EMP E, EMP E1
WHERE E.DEPTNO = E1.DEPTNO
AND E1.ENAME = '고영우';
--사원 번호가 7499인 사원과 담당 업무가 같은 사원을 표시(사원 이름과 담당업무)하시오.
SELECT E1.ENAME 사원이름
, E1.JOB 담당업무
FROM EMP E, EMP E1
WHERE E.EMPNO = '7499'
AND E.JOB=E1.JOB;
--AND E1.EMPNO <> 7499;
--상품테이블에서 상품코드, 상품명, 분류명, 거래처 명을 조회 하시오.
SELECT P.PROD_ID 상품코드
, P.PROD_NAME 상품명
, L.LPROD_NM 분류명
, B.BUYER_NAME 거래처명
FROM PROD P, LPROD L, BUYER B
WHERE P.PROD_LGU = l.lprod_gu
AND P.PROD_BUYER = B.BUYER_ID;
--HAKJUM 테이블 생성, 값 삽입
CREATE TABLE HAKJUM
(
GRADE CHAR(2) NOT NULL,
MIN_POINT NUMBER(3) NOT NULL,
MAX_POINT NUMBER(3) NOT NULL,
CONSTRAINT XPK_HAKJUM PRIMARY KEY (GRADE)
);
INSERT INTO HAKJUM (GRADE, MIN_POINT, MAX_POINT) VALUES ('A+', 96, 100); ...
ROWNUM
SELF JOIN
GROUP BY
--상품테이블에서 상품코드, 상품명, 분류명, 거래처 명을 조회 하시오.
SELECT P.PROD_ID 상품코드
, P.PROD_NAME 상품명
, L.LPROD_NM 분류명
, B.BUYER_NAME 거래처명
FROM PROD P, LPROD L, BUYER B
WHERE P.PROD_LGU = l.lprod_gu
AND P.PROD_BUYER = B.BUYER_ID;
--사원번호가 7499인 사원보다 급여가 많은 사원을 표시하시오. 사원이름과 감당 업무
SELECT E2.ENAME 사원이름
, E2.JOB 담당업무
, E2.SAL 급여
FROM EMP E1, EMP E2
WHERE E1.EMPNO = '7499' AND E1.SAL < E2.SAL;
--최소급여를 받는 사원의 이름, 담당업무 및 급여를 표시하시오.
SELECT ENAME 사원이름
, JOB 담당업무
, SAL 급여
FROM EMP
WHERE SAL = (SELECT MIN(SAL) FROM EMP);
--평균급여가 가장 적은 직급의 직급 이름과 직급의 평균을 구하시오.
--1단계
SELECT JOB 직급이름
, AVG(SAL) 직급평균
FROM EMP
GROUP BY JOB
ORDER BY AVG(SAL) ASC;
--2단계
SELECT JOB, ASD
FROM (SELECT JOB, AVG(SAL) ASD
FROM EMP
GROUP BY JOB
ORDER BY AVG(SAL) ASC);
--3단계
SELECT JOB 담당업무, ASD 급여평균
FROM (SELECT JOB, AVG(SAL) ASD
FROM EMP
GROUP BY JOB
ORDER BY AVG(SAL) ASC)
WHERE ROWNUM = 1;
--각 부서의 최소 급여를 받는 사원의 이름, 급여, 부서번호를 표시하시오.
SELECT E.ENAME 사원이름
, E.SAL 급여
, E.DEPTNO 부서번호
FROM EMP E,
(SELECT DEPTNO, MIN(SAL) SAL FROM EMP GROUP BY DEPTNO) E1
WHERE E.SAL = E1.SAL;
--평균 영업사원 급여보다 급여가 적으면서 업무가 영업사원이 아닌 사원들을 표시(사원번호, 이름, 담당 업무, 급여)하시오.
SELECT DISTINCT(E.EMPNO) 사원번호
, E.ENAME 이름
, E.JOB 담당업무
, E.SAL 급여
FROM EMP E,
(SELECT AVG(SAL) SALL FROM EMP WHERE JOB ='영업사원') E1 --!!SALL!!
WHERE NOT JOB ='영업사원'
AND E1.SALL < E.SAL;