영보의 SystemOut.log

[Oracle] JOIN / EQUI_JOIN / NON_EQUI_JOIN/ JOIN예제 본문

Database/Oracle

[Oracle] JOIN / EQUI_JOIN / NON_EQUI_JOIN/ JOIN예제

영보로그 2020. 8. 12. 17:20
반응형

 

# JOIN

 1) 하나의 SQL명령문에 의해 여러 테이블에 저장된 데이터를 한번에 조회할 수 있는 기능

 2) 관계형 데이터베이스 분야의 표준

 3) 두개 이상의 테이블을 '결합'한다는 의미 

 

 

 

# JOIN 종류

INNER JOIN(교집합) => 다른 테이이블에서 데이터를 연결 

EQUI_JOIN
: = 연산자

      1. Oracle JOIN : Oracle에서만 사용하는 쿼리 문장

         형식)

          SELECT 컬럼명, 컬렴명...

          FROM 테이블명, 테이블명 

          WHERE 테이블명.col=테이블명.col

          ***컬럼명이 다른 경우에는 테이블(별칭).

              생략이 가능

          emp, dept

      2. ANSI JOIN : 전체 데이터베이스에서 사용하는 쿼리

         형식)

           SELECT 컬럼명, 컬렴명...

           FROM 테이블명 (INNER)JOIN 테이블명

           ON 테이블명.col=테이블명.col
===================1,2 컬럼명이 다를 수도 있다

   3. NATRUAL JOIN

         형식)

           SELECT 컬럼명, 컬럼명...

           FROM emp NATURAL JOIN dept;

    4. JOIN~USI

         형식)

           SELECT 컬럼명, 컬럼명...

           FROM emp JOIN dept USING(deptno);

===================3,4 반드시 같은 컬럼명이 존재

NON EQUI_JOIN
: =이 아닌 연산자


  NON EQUI_JOIN 
  : =이 아닌 연산자 => 비교연산자, BETWEEN~AND, 


 
OUTER JOIN => 다른 테이블에서 데이터를 연결

 
  SELF JOIN => 같은 테이블에서 데이터 연결

 

 

# 삭제 연산

 - DROP - 파일 통채로 다 없애버림

 - TRUNCATE - 안에 있는 데이터만 잘라내버림

 - DELETE - 하나씩 지움

 
# SELECT 문의 6가지 절에 대한 실행순서
 

 

 

# 조인 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
--1. 직업이 SALESMAN인 사원들 중에서 최대 월급을 출력
SELECT MAX(sal) FROM emp WHERE job='SALESMAN';
 
--2 부서번호, 부서번호별 최대 월급을 출력
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
--GROUP BY : 그룹별로 따로 계산이 가능하다
 
--3 위의 결과에서 20번은 제외하고 출력하시오
SELECT deptno, MAX(sal) FROM emp WHERE deptno<>20 GROUP BY deptno;
 
--4 직업, 직업별 최소 월급을 출력하는데, 직업이 SALESMAN인 사원들을 제외하고 출력하시오 
SELECT MIN(sal) FROM emp WHERE job!='SALESMAN' GROUP BY job; 
 
--5 위의 결과에서 최소 월급이 높은 것부터 출력하시오
--SELECT job, MIN(sal) FROM emp WHERE job!='SALESMAN' GROUP BY job ORDER BY MIN(sal) DESC; 
 
--6 직업과 직업별 토탈 월급을 출력하는데, 직업별 토탈 월급이 4000이상인 것만 출력하시오
SELECT job, SUM(sal) FROM emp 
--WHERE SUM(sal)>=4000 WHERE에서 집합 함수를 사용할 수 없다.
GROUP BY job HAVING SUM(sal)>=4000;
 
--7 직업, 직업별 토탈 월급을 출력하는데, 직업이 SALESMAN은 제외하고 출력하고, 직업별 토탈 월급이 4000 이상인 것만 출력하고 또 직업별 토탈 월급이 높은 것부터 출력하시오.
SELECT job, SUM(sal) FROM emp WHERE job!='SALESMAN' GROUP BY job HAVING SUM(sal)>=4000 ORDER BY 2 DESC;
 
--8 입사한 년도(4자리), 입사한 년도별 토탈 월급을 출력하시오
SELECT TO_CHAR(hiredate, 'RRRR'), SUM(sal) FROM emp GROUP BY TO_CHAR(hiredate, 'RRRR');
 
--9 위의 문제에서 토탈 월급을 출력할때 콤마가 찍히게 천단위를 부여하시오
--SELECT TO_CHAR(hiredate, 'RRRR'), TO_CHAR(SUM(sal),'99,999') FROM emp GROUP BY TO_CHAR(hiredate, 'RRRR');
 
--10 사원 테이블의 사원수가 몇명인지 조회하시오
SELECT COUNT(*FROM emp;
 
-- 11 커미션을 카운트하시오
SELECT COUNT(comm) FROM emp;
 
-- 12 사원 테이블의 커미션의 평균 값을 출력하시오
SELECT ROUND(AVG(comm),2FROM emp;
 
-- 13 직업, 직업별 인원수를 출력하는데, 직업이 SALESMAN은 제외하고 출력하고, 직업별 인원수가 3명 이상인 것만 출력하고, 직업별 인원수가 높은것 부터 출력하시오
SELECT job, COUNT(*FROM emp WHERE job!='SALESMAN' GROUP BY job HAVING COUNT(*)>=3 ORDER BY 2 DESC;
 
-- 14 직업, 직업별 인원수를 출력하는데 직업별 인원수가 3명 이상인 것만 출력하시오
SELECT job, COUNT(*FROM emp GROUP BY job HAVING COUNT(*)>=3;
 
-- 15 부서번호, 부서번호별 평균 월급을 출력하는데, 20번 부서번호는 제외하고 출력하고 부서번호별 평균 월급이 2000이상인 것만 출력하며, 부서번호별 평균 월급이 높은 것부터 출력하시오.
SELECT deptno, AVG(sal)
FROM emp
WHERE deptno!=20
GROUP BY deptno
HAVING AVG(sal)>=2000 ORDER BY 2 DESC;
 
-- 16 사원이름, 부서위치를 출력하시오
SELECT ename, loc FROM emp, dept WHERE emp.deptno=dept.deptno;
 
-- 17 직업이 SALESMAN인 사원들의 이름과 월급과 직업과 부서위치를 출력하시오
SELECT ename, sal, job, loc FROM emp, dept
WHERE emp.deptno=dept.deptno
AND job='SALESMAN';
 
-- 18 사원이름, 월급, 부서위치, 부서번호를 출력하세요
--같은 컬럼이면 가지고오는 테이블을 꼭 적어야한다.
SELECT ename, sal, loc, emp.deptno FROM emp, dept WHERE emp.deptno=dept.deptno;
 
-- 19 DALLAS에서 근무하는 사원들의 이름과 부서위치와 월급을 출력하시오
SELECT e.ename, e.sal, d.loc FROM emp e, dept d WHERE e.deptno= d.deptno AND d.loc ='DALLAS';
 
-- 20 월급이 3000이상인 사원들의 월급과 부서위치와 입사일을 출력하시오
SELECT ename, sal, loc, hiredate From emp, dept where emp.deptno=dept.deptno And sal>=3000;
 
-- 21 1981년도에 입사한 사원들의 이름과 입사일과 부서위치를 출력하시오
SELECT ename, hiredate, loc FROM emp, dept WHERE emp.deptno=dept.deptno 
AND TO_CHAR(hiredate,'YYYY')=1981;
--AND SUBSTR(hiredate,1,2)=81;
--AND hiredate LIKE '81%';
 
-- AVG => ROUND
-- SUM => TO_CHAR(SUM(sal), '99,999')
-- 22 부서위치, 부서위치별 토탈월급을 출력하시오
SELECT loc, SUM(sal) FROM emp, dept WHERE emp.deptno=dept.deptno GROUP BY loc;
 
-- 23 위의 문제에서 토탈월급에 콤마를 찍어서 출력하시오
SELECT loc, TO_CHAR(SUM(sal), '99,999'FROM emp, dept WHERE emp.deptno=dept.deptno GROUP BY loc;
 
-- 24 emp테이블과 salgrade 테이블을 조인해서 이름과 월급과 grade(급여등급)을 출력하시오.
SELECT ename, sal, grade 
FROM emp, salgrade s
WHERE sal BETWEEN s.losal AND s.hisal;
 
-- 25 사원이름, 자기의 직송상사의 이름을 출력하시오
SELECT e1.ename "본인이름", e2.ename "사수이름" FROM emp e1, emp e2 WHERE e1.mgr=e2.empno;
cs
반응형