190528_DAY ANSI JOIN 복습, 서브쿼리, DDL시작


============================= JOIN문제 ============================================
※아래의 문제들을 ANSI JOIN으로 해결하시오.

문제1) 사원들의 이름, 부서번호, 부서이름을 출력
select ename, emp.deptno, dname
from emp inner join dept
on emp.deptno = dept.deptno; -- inner join 들어왔다면 반드시,, 반드시 on이 뒤따라야 함, 공통항목 이어주는

select ename, deptno, dname
from emp inner join dept
using (deptno);

select ename, deptno, dname
from emp natural join dept;

문제2) 부서번호가 30번인 사원들의 이름, 직급, 부서번호, 부서위치를 출력
select ename, job, e.deptno, loc
from emp e inner join dept d --
on e.deptno = d.deptno
where e.deptno = 30; --where 말고 and e.deptno = 30; 으로 해도 같은 결과, 단 동등조건과 추가 조건 나눈다면 where을 사용해야 한다. 

select ename, deptno, loc
from emp natural join dept -- natural join은 using 사용하는것과 동일하다.
where deptno = 30;

select ename, deptno, loc
from emp inner join dept
using (deptno)
where deptno = 30;

문제3) 커미션을 받는 사원의 이름, 커미션, 부서이름, 부서위치 출력(커미션 0은 제외)
select ename, comm, dname, loc
from emp natural join dept
where comm <> 0
and comm is not null;

select ename, comm, dname, loc
from emp inner join dept
on emp.deptno = dept.deptno
where comm != 0
and comm is not null;

문제4) DALLAS에서 근무하는 사원들의 이름, 직급, 부서번호, 부서이름을 출력
select ename, job, deptno, dname
from emp natural join dept
where loc = 'DALLAS';

select ename, job, deptno, dname
from emp inner join dept
on emp.deptno = dept.deptno
where loc = 'DALLAS';

문제5) 사원이름에 'A'가 들어가는(포함하는) 사원들의 이름과 부서이름을 출력
select ename, dname
from emp inner join dept
on emp.deptno = dept.deptno
where ename like '%A%';


문제6) 사원이름과 직급, 급여, 급여등급을 출력
select ename, job, sal, grade
from emp inner join salgrade
on sal between losal and hisal;

/*
select ename, job, sal, grade, dept.deptno --오류 내가 ㅠㅠ
from emp left join salgrade
on emp.deptno = dept.deptno
where grade between losal and hisal;
*/

문제7) 사원들의 이름과 그 사원과 같은 부서에 근무하는 사원의 사원명, 부서번호를 출력
       ===> 자기 이름을 제외한 동료(56행) 정보 출력!!
select e1.ename, e2.ename deptno
from emp e1 inner join emp e2
on e1.deptno = e2.deptno
where e1.ename <> e2.ename; --혹은 e1.empno != e2.empno



/*
select e1.ename, e2.ename e2.deptno --오류 내가  ㅠㅠ
from emp e1 left join dept e2
on e1.deptno = e2.deptno;
where e1.ename != e2.ename;
*/

★<서브쿼리> Sub Query

  • 특정 테이블에서 검색된 결과를 다른 테이블에 전달하여 새로운 결과를 검색 할 때 사용.

    문제) JAMES 사원이 근무하는 부서이름을 출력
    select deptno
    from emp
    where ename = 'JAMES'; -- 30번 부서 근무
    
    select dname
    from dept
    where deptno = 30; -- 부서명 SALES
    
    select dname
    from dept
    where deptno = (select deptno
                    from emp
                    where ename = 'JAMES');
    결과)
    DNAME
    ----------------------------
    SALES
    
    --===========================================================================
    
    문제) FORD사원과 동일한 직책을 가진 사원에 대해 사원번호, 사원명, 급여, 직책을 출력하시오
    select empno, ename, sal, job
    from emp
    where job = 'ANALYST';
    
    select job
    from emp
    where ename = 'FORD';
    
    select empno, ename, sal, job
    from emp
    where ename <> 'FORD'
            and
            job = (select job
                     from emp
                     where ename = 'FORD');
    결과)
         EMPNO ENAME                       SAL JOB
    ---------- -------------------- ---------- ------------------
          7788 SCOTT                      3000 ANALYST
    
     --===========================================================================
    
     문제) MARTIN사원의 급여와 동일하거나 더 많이 받는 사원의 사원명, 급여를 출력
     select sal
     from emp
     where ename = 'MARIN';
    
     select ename, sal
     from emp
     where sal >= ( 
             select sal
             from emp
             where ename = 'MARTIN'
             );
    
     결과)
     ENAME                       SAL
    -------------------- ----------
    ALLEN                      1600
    WARD                       1250
    JONES                      2975
    MARTIN                     1250
    BLAKE                      2850
    CLARK                      2450
    SCOTT                      3000
    KING                       5000
    TURNER                     1500
    FORD                       3000
    MILLER                     1300
    
     --===========================================================================
    
     문제) DALLAS에서 근무하는 사원의 이름, 부서번호를 출력
    
     select loc
     from dept
     where loc = 'DALLAS';
    
     select ename, deptno
     from emp
     where deptno = 
                     (
                         select deptno
                         from dept
                         where loc = 'DALLAS'
                     );
    
     select ename, deptno
     from emp natural join dept
     where loc = (
                 select loc
                 from dept
                 where loc = 'DALLAS'
                 );
    
     select ename, deptno
     from emp inner join dept
     using (deptno)
     where loc = (
                 select loc
                 from dept
                 where loc = 'DALLAS'
                 );
    
     결과)
     ENAME                    DEPTNO
    -------------------- ----------
    JONES                        20
    FORD                         20
    ADAMS                        20
    SMITH                        20
    SCOTT                        20
    
    --===========================================================================
    SUB QUERY 문제들
    문제)
    SALES부서에서 근무하는 모든 사원의 이름과 급여, 부서번호를 출력
    SELECT deptno
    FROM dept
    WHERE dname = 'SALES';
    
    SELECT ename, sal, deptno
    FROM emp
    WHERE deptno =
                (
                    SELECT deptno
                    FROM dept
                    WHERE dname = 'SALES'
                  );
    
    결과)
    ENAME                       SAL     DEPTNO
    -------------------- ---------- ----------
    ALLEN                      1600         30
    WARD                       1250         30
    MARTIN                     1250         30
    BLAKE                      2850         30
    TURNER                     1500         30
    JAMES                       950         30
    
    --===========================================================================
    
    문제) 자신의 직속상사가 KING인 사원의 이름과 급여, 직속상사의 사원번호를 출력.
    SELECT empno
    FROM emp
    WHERE ename = 'KING';
    
    SELECT ename, sal, mgr
    FROM emp
    WHERE mgr = (
                   SELECT empno
                    FROM emp
                    WHERE ename = 'KING'
                );
    결과)
    ENAME                       SAL        MGR
    -------------------- ---------- ----------
    JONES                      2975       7839
    BLAKE                      2850       7839
    CLARK                      2450       7839
    
    --===========================================================================
    
    문제) 평균급여보다 많은 급여를 받은 사원들의 사번, 사원명, 급여를 출력.(급여 내림차순)                
    SELECT AVG(sal)
    FROM emp;
    
    SELECT empno, ename, sal
    FROM emp
    WHERE sal >= (
                SELECT AVG(sal)
                FROM emp
                )
    ORDER BY SAL DESC;
    
    결과)
         EMPNO ENAME                       SAL
    ---------- -------------------- ----------
          7839 KING                       5000
          7902 FORD                       3000
          7788 SCOTT                      3000
          7566 JONES                      2975
          7698 BLAKE                      2850
          7782 CLARK                      2450
    
    --===========================================================================
    
    문제) 10번 부서의 사원 중 전체(사원) 최대급여를 받는 사원과 동일한 급여를 받는 사원의 사원번호와 사원명을 출력.
    (문제 조금 이상...)
    SELECT MAX(sal)
    FROM emp
    WHERE deptno = '10';
    
    SELECT empno, ename --열제어
    FROM emp
    WHERE sal >= (
                   SELECT MAX(sal)
                    FROM emp
                    WHERE deptno = '10'
                );
    
    SELECT empno, ename --열제어
    FROM emp
    WHERE     sal = (
                    SELECT MAX(sal)
                    FROM emp
                  )
            and
            deptno = 10;
    
    결과)
         EMPNO ENAME
    ---------- --------------------
          7839 KING
    
    --===========================================================================
    
    문제) 10번 부서에서 근무하는 사원의 이름과 10번 부서의 부서명을 출력하시오.
    SELECT a,b,c,d,e,f
    FROM (SELECT a,b,c FROM test1), (SELECT d,e,f FROM test2);
    --FROM 뒤에 테이블명(행렬구성)도 올 수 있고 서브쿼리(결과값 행렬)도 위치 할 수 있다.
    
    SELECT empno, ename, sal --에러발생 : 서브쿼리에 sal컬럼에 대한 정보가 없기 때문
    FROM (SELECT empno, ename FROM emp);
    
    SELECT ename, dname
    FROM emp, (select dname from dept where deptno = 10 )
    WHERE deptno = '10';
    
    SELECT ename, (select dname from dept where deptno = 10 ) --아무거나 쓸 수는 없다.
    --SELECT 옆, WHERE에는 1행 1열 값만 들어갈 수 있고, FROM에는 행렬만 들어가면 관계 없다.
    FROM emp
    WHERE deptno = '10';
    
    결과)
    ENAME                DNAME
    -------------------- ----------------------------
    CLARK                ACCOUNTING
    KING                 ACCOUNTING
    MILLER               ACCOUNTING
    
    --추가 정보
    SELECT ename, (SELECT '몸에 좋은 딩꼬' FROM dual ) MSG
    FROM emp
    WHERE deptno = '10';
    
    SELECT ename, (SELECT '몸에 좋은 딩꼬', '이것도 될까?'  --이건 안된다 1행 2열은 안됨! 
                   FROM dual ) MSG
    FROM emp
    WHERE deptno = '10';
    
    ORA-00913: too many values --이 오류 발생
    
    --===========================================================================
    
    문제) BLAKE와 같은 부서에 있는 사원들의 이름과 입사일자, 부서번호를 출력하시오.
    SELECT ename, hiredate, deptno
    FROM EMP
    WHERE deptno = 30;
    
    SELECT ename, hiredate, deptno
    FROM emp
    WHERE deptno = (
                    SELECT deptno
                    FROM emp
                    WHERE ename = 'BLAKE'
                    );
    
    결과)
    ENAME                HIREDATE     DEPTNO
    -------------------- -------- ----------
    ALLEN                81/02/20         30
    WARD                 81/02/22         30
    MARTIN               81/09/28         30
    BLAKE                81/05/01         30
    TURNER               81/09/08         30
    JAMES                81/12/03         30
    
    --===========================================================================
    
    추가)
    만약 BLAKE라는 이름을 갖은 신입이 새로 들어왔다면?!
    --사원추가 (다른 부서에 BLAKE 등장!)
    INSERT INTO emp ( empno, ename, hiredate, deptno )
                values ( 8000, 'BLAKE', sysdate, 20 );
    --하고 나서 다시 위~~의 명령어를 다시 입력하면?
    ORA-01427: single-row subquery returns more than one row
    --에러 발생! 이렇게 데이터의 크기가 커지면 문제가 발생 할 수 있는 것.
    
    --해결방법!
    SELECT ename, hiredate, deptno
    FROM emp
    WHERE deptno = 30 or deptno = 20;
    
    SELECT ename, hiredate, deptno
    FROM emp
    WHERE deptno in (30,20); --이렇게 줄일 수 있다.
    
    --다시 위~~~ 의 명령어로 돌아가서
    SELECT ename, hiredate, deptno
    FROM emp
    WHERE deptno IN (
                    SELECT deptno
                    FROM emp
                    WHERE ename = 'BLAKE'
                    );
    --실행이 너~ 어어어 무 잘된다!
    
    ENAME                HIREDATE     DEPTNO
    -------------------- -------- ----------
    BLAKE                19/05/28         20
    SMITH                80/12/17         20
    ALLEN                81/02/20         30
    WARD                 81/02/22         30
    JONES                81/04/02         20
    MARTIN               81/09/28         30
    BLAKE                81/05/01         30
    SCOTT                87/04/19         20
    TURNER               81/09/08         30
    ADAMS                87/05/23         20
    JAMES                81/12/03         30
    FORD                 81/12/03         20
    

<다중 행 서브 쿼리>

  • 서브쿼리의 결과행이 여러개 ( 2개행 이상 )
  • 반드시 다중 행 연산자 ( Multiple Row Operator) 와 함께 사용

※다중 행 연산자

  • IN : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참
  • su in (10,20,30)
  • ANY, SOME : 메인쿼리의 비교조건이 서브쿼리의 결과와 하나이상 일치하면 참.
  • ALL : 메인쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치하면 참.
  • EXISTS : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참
SELECT *
FROM dept
WHERE exists(SELECT * --서브쿼리 결과
              FROM emp
             WHERE deptno = 10);
    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                        CHICAGO
        40 OPERATIONS                   BOSTON
--위와 달리! WHERE절을 바꿔보자!
SELECT *
FROM dept    
WHERE exists(SELECT * 
              FROM emp
             WHERE deptno = 40); --10이 아니라 40으로!
--이러면 결과 안나온다, 데이터 존재 유무에 따라 SELECT, DELETE, UPDATE, INSERT시 제어하는 역할로 사용.
--서브쿼리의 결과가 있느냐 없느냐만 체크
no rows selected --결과값
사용법)
WHERE EXISTS (서브쿼리)
WHERE NOT EXISTS (서브쿼리)

--===========================================================================

문제)
급여를 3000이상 받는 사원이 소속된 부서와 동일한 부서에 근무하는 사원들의 사원명, 급여, 부서번호를 출력하시오. (여기서 조건은 **급여를 3000이상 받는 사원이 소속된 부서** 조건절로!)
SELECT ename, sal, deptno
FROM emp
WHERE deptno IN (
                  SELECT deptno
                    FROM emp
                    WHERE sal >= 3000
                ); --20번 부서와 10번 부서의 사람들
ENAME                       SAL     DEPTNO
-------------------- ---------- ----------
FORD                       3000         20
ADAMS                      1100         20
SCOTT                      3000         20
JONES                      2975         20
SMITH                       800         20
BLAKE                                   20
MILLER                     1300         10
KING                       5000         10
CLARK                      2450         10

조건서브쿼리)
SELECT deptno
FROM emp
WHERE sal >= 3000;

    DEPTNO
----------
        20
        10
        20

--===========================================================================

문제)
부서번호가 30번인 사원들 중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원의 사원명, 급여를 출력.
(ALL 다중 행 연산자 사용!!)

조건서브쿼리)
SELECT SAL
FROM EMP
WHERE DEPTNO = 30;

결과)
       SAL
----------
      1600
      1250
      1250
      2850
      1500
       950

SELECT ename, sal
FROM emp
WHERE sal > 
            (
               SELECT SAL
                FROM EMP
                WHERE DEPTNO = 30
            ); --에러 발생!

SELECT ename, sal
FROM emp
WHERE sal > ALL --ALL을 쓰자!
            (
               SELECT SAL
                FROM EMP
                WHERE DEPTNO = 30
            );

SELECT ename, sal
FROM emp
WHERE sal > 
            (
               SELECT MAX(SAL) -- MAX 쓰면 ALL안써도 된다, 하지만 위에서 연습겸 ALL을 사용한 것.
                FROM EMP
                WHERE DEPTNO = 30
            );

결과)
ENAME                       SAL
-------------------- ----------
JONES                      2975
FORD                       3000
SCOTT                      3000
KING                       5000

--===========================================================================

문제) 부서번호가 30번인 사원들 중 급여를 가장 많이 적게 사원보다 더 많은 급여를 받는 사원의 사원명, 급여를 출력(ANY 다중 행 연산자 사용!)

SELECT ename, sal
FROM EMP
WHERE sal  >
         (
            SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
            FROM emp
            WHERE deptno = 30
          );

ORA-01427: single-row subquery returns more than one row -- 에러발생

SELECT ename, sal
FROM EMP
WHERE sal  > ALL --모든 데이터중 가장 큰 값
         (
            SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
            FROM emp
            WHERE deptno = 30
          );
ENAME                       SAL
-------------------- ----------
JONES                      2975
FORD                       3000
SCOTT                      3000
KING                       5000

SELECT ename, sal
FROM EMP
WHERE sal  > ANY --모든 데이터중 가장 큰 값, 각 항목보다 커도 좋고(1600보다, 1250보다...)
         (
            SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
            FROM emp
            WHERE deptno = 30
          );

ENAME                       SAL
-------------------- ----------
KING                       5000
FORD                       3000
SCOTT                      3000
JONES                      2975
BLAKE                      2850
CLARK                      2450
ALLEN                      1600
TURNER                     1500
MILLER                     1300
WARD                       1250
MARTIN                     1250
ADAMS                      1100

문제 해답
SELECT ename, sal
FROM EMP
WHERE sal  > --모든 데이터중 가장 큰 값, 각 항목보다 커도 좋고(1600보다, 1250보다...)
         (
            SELECT min(sal) --1600, 1250, 1250, 2850, 1500, 950 들어옴
            FROM emp
            WHERE deptno = 30
          );

ENAME                       SAL
-------------------- ----------
ALLEN                      1600
WARD                       1250
JONES                      2975
MARTIN                     1250
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500
ADAMS                      1100
FORD                       3000
MILLER                     1300

--===========================================================================

문제1)

SCOTT과 급여가 동일하거나 더 많이 받는 사원의 이름과 급여 출력
SELECT ename, sal
FROM emp
WHERE sal >= any ( --SCOTT가 하나 있으면 >= 도 관계 없지만, 중복되면 any등으로 사용해야 한다.
                SELECT sal
                FROM emp
                WHERE ename = 'SCOTT'
            );

ENAME                       SAL
-------------------- ----------
SCOTT                      3000
KING                       5000
FORD                       3000

--추가
SELECT ename, sal
FROM emp
WHERE sal >= all ( --SCOTT가 하나 있으면 >= 도 관계 없지만, 중복되면 any등으로 사용해야 한다.
                SELECT sal
                FROM emp
                WHERE ename = 'SCOTT'
            );
--===========================================================================

문제2)
직급(job)이 사원(CLERK)인 사람이 속한 부서의 부서번호와 부서명, 부서위치를 출력.
SELECT dname, loc
FROM dept
WHERE deptno IN (
                SELECT deptno
                FROM emp
                WHERE job = 'CLERK' 
            );

DNAME                        LOC
---------------------------- --------------------------
ACCOUNTING                   NEW YORK
RESEARCH                     DALLAS
SALES                        CHICAGO

--===========================================================================

문제3)
사원명에 'T'를 포함하고 있는 사원들과 같은 부서에서 근무하고 있는 사원의 사원번호 이름을 출력.
SELECT empno, ename
FROM emp
WHERE deptno IN ( -- = 을 쓴다면 모두 만족해야 하는 것, IN을 써야 한다.
                SELECT deptno
                FROM emp
                WHERE ename like '%T%'
              );

     EMPNO ENAME
---------- --------------------
      7902 FORD
      7876 ADAMS
      7788 SCOTT
      7566 JONES
      7369 SMITH
      8000 BLAKE
      7900 JAMES
      7844 TURNER
      7698 BLAKE
      7654 MARTIN
      7521 WARD
      7499 ALLEN
--===========================================================================

문제4) 부서위치가 NEW YORK인 모든 사원의 이름, 부서번호를 출력

SELECT ename, deptno
FROM emp
WHERE deptno IN ( --NEW YORK이 또 생길 수도 있잖아. 지사라던가... 그래서 IN을 쓰는것이 좋다.
                   SELECT deptno
                    FROM dept
                    WHERE loc = 'NEW YORK'
                  );

ENAME                    DEPTNO
-------------------- ----------
CLARK                        10
KING                         10
MILLER                       10

--===========================================================================

문제5) SALES부서의 모든 사원의 이름과 급여출력

SELECT ename, sal
FROM emp
WHERE deptno = 
               (
                   SELECT deptno
                   FROM dept
                   WHERE dname = 'SALES'
                );

ENAME                       SAL
-------------------- ----------
ALLEN                      1600
WARD                       1250
MARTIN                     1250
BLAKE                      2850
TURNER                     1500
JAMES                       950

--===========================================================================

문제6) KING에게 보고하는 모든 사원의 이름과 급여를 출력

SELECT ename, sal
FROM emp
WHERE mgr IN
            (
                SELECT empno
                FROM emp
                WHERE ename = 'KING'
             );

ENAME                       SAL
-------------------- ----------
JONES                      2975
BLAKE                      2850
CLARK                      2450

--===========================================================================

문제7) 자신의 급여가 평균 급여보다 많고  이름에 'S'가 들어가는 사원과
      ------------------------ ----------
                (1번째 조건)      (2번째 조건)
                ---> 1,2번을 동시에 만족하는 사원의 부서

       동일한 부서에서 근무하는 모든 사원의 사원번호, 사원명, 급여 출력.

SELECT empno, ename, sal
FROM emp
WHERE deptno IN -- IN 은 = 과 같음 (거으...의?), 여기서는 IN 또는 ANY 또는 ALL이 나와야 한다!
            (
                SELECT deptno
                FROM emp
                WHERE ename like '%S%'
                        and
                sal > (SELECT AVG(sal) FROM emp)
              );

     EMPNO ENAME                       SAL
---------- -------------------- ----------
      7902 FORD                       3000
      7876 ADAMS                      1100
      7788 SCOTT                      3000
      7566 JONES                      2975
      7369 SMITH                       800
      8000 BLAKE

-- WHERE 그룹함수() => 에러
-- WHERE sal > avg(sal) 이러면 에러 
-- 정상실행 위해서는 서브쿼리로 !
-- WHERE sal > ( SELECT avg( sal )
--                FROM emp)  => 정상실행

-- HAVING 그룹함수() => 정상실행
-- HAVING avg(sal) > 2000 => 정상실행
-- HAVING deptno = 10 => 정상실행 왜? 그룹 중 10번 부서만!!
-- HAVING sal > 2000 => 에러? 왜? 10번부서에는 sal속성이 없기 때문에

<DDL.> Data Definition Language : (객체)데이터 정의어

  • 객체 : TABLE, VIEW, SEQUENCE, TRIGGER

  • create, drop, alter, rename, truncate

  • DDL은 AUTO 커밋!

<테이블(객체) 생성>

형식)

CREATE TABLE 테이블명
(
    컬럼명1 자료형,
    컬럼명2 자료형,
    컬럼명3 자료형
);

<자료형> 데이터 : 문자, 숫자, 날짜, 이미지등

  • CHAR : 주어진 크기만큼 고정길이의 문자 저장 1바이트 ~ 2000바이트
pName char(10)
gildong입력 ---> '    gildong' 이 입력됨 ( 앞에 공백)
  • VARCHAR2 : 주어진 크기만큼 가변길이의 문자 저장 1바이트 ~ 4000바이트
pName varchar2(10)
gildong입력 ---> 'gildong' 입력!
  • NUMBER(p[,s]) : 정밀도와 스케일로 표현되는 숫자
    • 바이트 수 생략 가능
number(7,2) --전체 자릿수 7, 소숫점 이하 2자리까지 표현, 정수는 5자리까지!
--예) no number( 7, 2 ) => 12345.67
--입력 ==>12345 ( O )
--입력 ==>99999 ( O )
--입력 ==>123456 ( X ) 
--입력 ==>12345.678 ( O ), 입력은 된다, 하지만 저장은 12345.68(올림처리)
--입력 ==>99999.99 ( O )
--입력 ==>99999.992 ( O )
--입력 ==>99999.995 ( X ), 저장 100000.00이기때문에
pName varchar2(10) -- ( O )
pName varchar2 -- ( X )
pAge number(10) -- ( O )
pAge number -- ( O )
  • DATE : 날짜 형식 저장
  • TIMESTAMP : DATE형의 확장된 형태
  • BLOB : 대용량의 바이너리 데이터를 저장, 최대 4GB
  • CLOB : 대용량의 텍스트 데이터를 저장, 최대 4GB
  • BFILE : 대용량의 바이너리 데이터를 파일형태로 저장, 최대 4GB

CREATE TABLE emp
( );
--ORA-00904: : invalid identifier --에러발생, 이클립스에도 이런식으로 뜬다면 DB의 문제라는것을 파악해야 한다.
--테이블을 생성하기 위해서는 최소 한 개 이상의 컬럼을 정의해야 함!

--===========================================================================

CREATE TABLE emp
(
    empno number(4)
);
--ORA-00955: name is already used by an existing object --에러 발생
-- 이미 존재하는 테이블명(객체명)과 같은 이름은 생성 불가!

--===========================================================================

CREATE TABLE 2emp
(
    empno number(4)
);
--ORA-00903: invalid table name --에러발생. 부적절한 테이블(식별자)명
-- 식별자 이름규칙이 있다!
-- 첫글자 숫자불가, 예약어불가, 특수문자 불가

--===========================================================================

CREATE TABLE emp2
(
    empno number(4)
);
--Table created.
--===========================================================================
SQL> select tname from tab;
TNAME
------------------------------------------------------------
DEPT
EMP
EMP2
SALGRADE
--임포트한 테이블 조회 가능

--===========================================================================

CREATE TABLE emp2
(
    empno number(4)
    ename VARCHAR(4)
    sal number(7,2)
);
--ORA-00907: missing right parenthesis -- 에러발생
--두 개 이상의 컬럼을 정의할 때 그 구분을 위해 ','(콤마)를 사용!

CREATE TABLE emp3
(
    empno number(4),
    ename VARCHAR(4),
    sal number(7,2)
);
--Table created. -- 생성 완료!

SELECT * FROM emp2;
SELECT * FROM emp3;
--no rows selected --조회결과 없음

<서브쿼리를 이용한 테이블 생성>

  • 기존 테이블의 구조( 컬럼, 자료형 )와 (행) 데이터를 복사

  • 제약(constraint)은 복사에서 제외

  • 형식

    CREATE TABLE 테이블명
    AS 서브쿼리;
    
    create table emp4
    as select * from emp; --select는 열제어 *(와일드카드)는 모든 행
    --Table created. 메시지
    
    desc emp4;
    desc emp;
    --NULL? 은 NULL허용 여부
    
    SQL> select count(*) from emp3;
    
      COUNT(*)
    ----------
             0
    
    SQL> select count(*) from emp4;
    
      COUNT(*)
    ----------
            15
    
    SELECT empno, ename, sal
    FROM emp4;
         EMPNO ENAME                       SAL
    ---------- -------------------- ----------
          8000 BLAKE
          7369 SMITH                       800
          7499 ALLEN                      1600
          7521 WARD                       1250
          7566 JONES                      2975
          7654 MARTIN                     1250
          7698 BLAKE                      2850
          7782 CLARK                      2450
          7788 SCOTT                      3000
          7839 KING                       5000
          7844 TURNER                     1500
          7876 ADAMS                      1100
          7900 JAMES                       950
          7902 FORD                       3000
          7934 MILLER                     1300
궁금상자
1. 다중행연산자 이해가 안된다. (IN, ANY, SOME, ALL, EXISTS)
- IN은 OR OR OR... =과 같으나 =보다는 IN을 쓰는것이 좋다. 중복된 값이 있을때에는 = 쓰면 에러가 발생한다. 
- ANY랑 SOME은 같은 의미로 사용되는듯 ?
- ALL과 ANY는 아래의 표 참조
- EXISTS는 서브쿼리 값 있으면 반환

2. 서브쿼리는 SELECT문 내의 또다른 SELECT문 정도?, 데이터 가공 위해, 선생님의 수업시간 설명 참조. SELECT INSERT UPDATE DELETE 에서 사용 SELECT리스트 FROM절 WHERE절에도 조건에 따라 사용 가능

3. CHAR VARCHAR VARCHAR2
아래 표 참조
 VARCHAR와 VARCHAR2차이 없으나, 오라클에서는 VARCHAR2 사용 권장, 오라클에서 VARCHAR 타입은 추후 다른 용도로 사용한다고 함
     
컬럼 > ANY 가장 작은 값보다 크다, ? > MIN
컬럼 < ANY 가장 큰 값보다 작다, ? <MAX
컬럼 > ALL 가장 큰 값보다 크다, 최대값 반환 > MAX
컬럼 < ALL 가장 작은 값보다 작다, 최소값 반환 < MIN
CHAR VARCHAR VARCHAR2
고정형 가변형 가변형
2000byte 4000byte4 000byte

+ Recent posts