'분류 전체보기'에 해당되는 글 304건

  1. 2009.06.02 그룹 함수
  2. 2009.06.02 GROUP BY
  3. 2009.06.02 Join
  4. 2009.06.02 Equijoin
  5. 2009.06.02 Non-Equijoin
  6. 2009.06.02 Outer Join
  7. 2009.06.02 Self Join
  8. 2009.06.02 Default Editor 변경하기
  9. 2009.06.02 패스워드 만료 정책
  10. 2009.06.02 사용자 계정 삭제

그룹 함수

DB 2009. 6. 2. 13:47

단일 행 함수와는 달리 그룹 함수는 여러 행 또는 테이블 전체에 대해 함수가 적용되어 하나의 결과를 가져오는 함수를 말한다.

그룹 당 하나의 결과가 주어지도록 행의 집합에 대해 연산할 경우 GROUP BY 절을 이용하여 그룹화 할 수 있고 HAVING을 이용하여 그룹에 대한 조건을 제한할 수 있다.

<그룹함수의 종류>

 AVG(DISTINCT|ALL|n) : NULL값을 제외한 n개 행의 평균값.

 COUNT(DISTINCT|ALL|*) : NULL값을 포함한 행의 개수.

 MAX(DISTINCT|ALL|expr) : 최대값.

 MIN(DISTINCT|ALL|expr) : 최소값.

 STDDEV(DISTINCT|ALL|n) : NULL값을 제외한 n의 표준 편차.

 SUM(DISTINCT|ALL|n) : NULL값을 제외한 n의 합계.

 VARIANCE(DISTINCT|ALL|n) : NULL값을 제외한 n의 분산.

 * DISTINCT는 해당 함수로 하여금 오직 중복되지 않는 값만 리턴하게 해준다.

   그러나 ALL(Default)은 해당 함수로 하여금 모든 값을 고려하게 한다.

 * expr이 있는 인수들의 자료 형태는 CHAR, VARCHAR2, NUMBER, DATE형이 될 수 있다.

 * COUNT(*)를 제외한 모든 그룹 함수들은 NULL값을 무시한다.

   NULL값을 하나의 값으로 치환하기 위해서는 NVL함수를 사용하면 된다.

 * 모든 자료형에 대하여 MAX와 MIN을 사용할 수 있다.

   그러나 AVG, SUM, VARIANCE, STDDEV는 NUMBER만 사용 가능하다.

 문제1> EMP 테이블에서 모든 SALESMAN에 대하여 급여의 평균, 최고액, 최저액, 합계를 출력하라.

   SELECT AVG(sal), MAX(sal), MIN(sal)
   FROM emp
   WHERE job LIKE 'SAL%'


   AVG(SAL)   MAX(SAL)   MIN(SAL)
   --------- ---------- ----------
           1400       1600       1250

 문제2> EMP 테이블에 등록되어 있는 인원수, 보너스에 NULL이 아닌 인원수, 보너스의 평균,

           등록되어 있는 부서의 수를 구하여 출력하라.

      SELECT COUNT(*), COUNT(comm), AVG(NVL(comm, 0)), COUNT(DISTINCT deptno)
      FROM emp


      COUNT(*) COUNT(COMM) AVG(NVL(COMM,0)) COUNT(DISTINCTDEPTNO)
       --------- ----------- ---------------- ---------------------
                  17           5       147.058824                     3

[출처] 그룹 함수|작성자 이경모


'DB' 카테고리의 다른 글

TO_CHAR 함수  (0) 2009.06.02
기타 함수  (0) 2009.06.02
GROUP BY  (0) 2009.06.02
Join  (0) 2009.06.02
Equijoin  (0) 2009.06.02
Posted by 으랏차
,

GROUP BY

DB 2009. 6. 2. 13:46

GROUP BY는 그룸함수를 테이블보다 작은 그룹으로 나누어 사용할 수 있는 절이다.

테이블을 하나의 그룹으로 다루면 필요하지 않으나 테이블 안에서 그룹을 나눌 때 사용한다는 말이다.


1. 단일 그룹으로 사용.

   SELECT절에 그룹 함수와 Column이 같이 기술되면 반드시 GROUP BY절이 기술 되어야 한다.

   예를 들어

   SELECT deptno, COUNT(*), AVG(sal), MIN(sal), MAX(sal), SUM(sal) FROM emp;

   위와 같은 명령을 내리면 deptno는 다수의 값이지만, 나머지들은 하나의 값을 출력해야한다.

   이런 경우는 출력되지 않고 에러가 난다. 출력하는 Column의 개수는 동일해야 겠다.

   이럴 때 같은 deptno끼리 묶고, 각 deptno에 해당하는 sal의 COUNT, AVG, MIN, MAX, SUM값을

   구할 수 있겠다.

   SELECT deptno, COUNT(*), AVG(sal), MIN(sal), MAX(sal), SUM(sal)
   FROM emp
   GROUP BY deptno;


   DEPTNO COUNT(*) AVG(SAL)  MIN(SAL)   MAX(SAL) SUM(SAL)
    ------- ---------- ----------  ---------- ---------- ----------
           30               7  2128.57143           950          5500         14900
           20               6          2475            800          4500        12375
           10               4        2987.5          1500          5000        11950


2. 다수의 Column으로 그룹화

   다수의 Column을 그룹화해서 표현할 수 있다.

   예를 들어 부서별, 업무별로 그룹화해서 각각의 합계, 개수 등을 구할 수 있다.

   SELECT deptno, job, COUNT(*), AVG(sal), SUM(sal)
   FROM emp
   GROUP BY deptno, job;


   DEPTNO JOB                  COUNT(*)   AVG(SAL)   SUM(SAL)
   ------ ------------------ ---------- ---------- ----------
         20 CLERK                       2        950       1900
         30 SALESMAN                    4       1400       5600
         20 MANAGER                     1       2975       2975
         30 CLERK                       1        950        950
         30                                   2       5250      10500
         10 PRESIDENT                   1       5000       5000
         30 MANAGER                     1       2850       2850
         10 CLERK                       1       1500       1500
         20                                  1
         10 MANAGER                     1       2450       2450
         20 ANALYST                     2       3750       7500

   DEPTNO JOB                  COUNT(*)   AVG(SAL)   SUM(SAL)
   ------ ------------------ ---------- ---------- ----------
         10                                          1       3000       3000


3. ROLLUP과 CUBE 연산자를 이용한 GROUP BY

   테이블은 행과 열로 이루어져 있는데 ROLLUP은 테이블 행의 합계를 구해주고,

   CUBE는 행과 열의 부분합과 총계를 구해준다고 이해하면 되겠다.

   예를 들어 부서별 합계는

   SELECT deptno, sum(sal)
   FROM emp
   GROUP BY deptno;

 

        DEPTNO   SUM(SAL)
     ---------- ----------
              30      19900
              20      12375
              10      11950

   위와 같이 구할 수 있다.

   여기서 부서 급여를 총합산한 금액을 구하려면 ROLLUP기능을 사용하면 된다.

   SELECT deptno, sum(sal)
   FROM emp
   GROUP BY ROLLUP(deptno);


    DEPTNO   SUM(SAL)
    ---------- ----------
             10      11950
             20      12375
             30      19900
                      44225

   위와 같이 ROLLUP 기능을 통해 부서별 급여의 총합계가 구해졌다.

   그렇다면 부서별, 업무별 급여의 총 합계를 구해보자.

   SELECT deptno, job, sum(sal)
   FROM emp
   GROUP BY ROLLUP(deptno, job);


    DEPTNO JOB                  SUM(SAL)
    ---------- ------------------ ----------
               10                              3000
               10 CLERK                    1500
               10 MANAGER                2450
               10 PRESIDENT               5000
               10                               11950
               20
               20 CLERK                    1900
               20 ANALYST                  7500
              20 MANAGER                  2975
              20                                12375
              30                                10500

    DEPTNO    JOB                      SUM(SAL)
    ---------- ------------------ ----------
               30 CLERK                       950
               30 MANAGER                  2850
               30 SALESMAN                 5600
               30                                19900
                                                  44225

   부서별, 업무별 합계를 구하기 위해 ROLLUP으로 deptno, job을 입력해줬으나,

   부서별 합계만 구해진다.

   부서별, 업무별 급여를 함께 구하려면 CUBE를 쓰면 된다.

   SELECT deptno, job, sum(sal)
   FROM emp
   GROUP BY CUBE(deptno, job);


       DEPTNO JOB                  SUM(SAL)
   ---------- ------------------ ----------
                                               10500  

                                               44225  
                                              3000
                   CLERK                    4350
                  ANALYST                  7500
                  MANAGER                  8275
                  SALESMAN                 5600
                  PRESIDENT                5000
             10                              11950
             10                               3000
             10 CLERK                    1500

    DEPTNO JOB                  SUM(SAL)
   ---------- ------------------ ----------
              10 MANAGER                  2450
              10 PRESIDENT                5000
              20
              20                         12375
              20 CLERK                    1900
              20 ANALYST                  7500
              20 MANAGER                  2975
              30                         10500
              30                         19900
              30 CLERK                     950
              30 MANAGER                  2850

    DEPTNO JOB                  SUM(SAL)
    ---------- ------------------ ----------
              30 SALESMAN                 5600

   CUBE는 위와 같이 업무별 합계도 같이 구해진다.

   즉, 테이블에 DEPTNO는 행, JOB은 열일 때 ROLLUP은 행의 합계만 구해지고,

   CUBE는 행과 열의 부분합, 총계가 구해진다고 보면 되겠다.

   ROLLUP과 CUBE가 잘 적용되었는지 확인하려면 GROUPING함수를 사용하면 된다.

   GROUPING함수를 사용해서 0이 리턴되면 해당 컬럼이 ROLLUP이나 CUBE 연산에 사용되었음을

   나타내고, 1이 리턴되면 사용되지 않았음을 나타낸다.

   SELECT deptno, job, SUM(sal), GROUPING(deptno)
   FROM emp
   GROUP BY CUBE(deptno, job);


    DEPTNO JOB                  SUM(SAL) GROUPING(DEPTNO)
    ---------- ------------------ ---------- ----------------
                                                10500                1
                                                44225                1
                                                3000                1
                   CLERK                    4350                1
                   ANALYST                  7500                1
                   MANAGER                  8275                1
                   SALESMAN                 5600                1
                   PRESIDENT                5000                1
               10                                11950                0
               10                                 3000                0
               10 CLERK                     1500                0

    DEPTNO JOB                  SUM(SAL) GROUPING(DEPTNO)
   ---------- ------------------ ---------- ----------------
               10 MANAGER                  2450                0
               10 PRESIDENT                5000                0
               20                                                      0
               20                               12375                0
               20 CLERK                    1900                0
               20 ANALYST                  7500                0
               20 MANAGER                  2975                0
               30                                10500                0
               30                               19900                0
               30 CLERK                       950                0
               30 MANAGER                  2850                0

    DEPTNO JOB                  SUM(SAL) GROUPING(DEPTNO)
    ---------- ------------------ ---------- ----------------
                30 SALESMAN                 5600                0

   위 결과를 보면 deptno의 합계는 잘 적용되었으나 job의 합계는 적용되지 않았음을 볼 수 있다.

   배운대로라면 job의 합계는 적용되어야 정상인데...흠...뭔가 오류가 있는 모양인데...

   1이 나오면 그룹화할 집합이 없다는 뜻이라는데...

   CUBE의 정의는 행과 열의 합계와 부분합을 구해준다는 정의만 알고 일단 넘어가자.


4. GROUPING SETS

   GROUP BY절의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러개 기술할 수 있다.

   GROUPING SETS 함수 사용이 불가능했던 이전 버전에서는 복잡한 UNION ALL연산자라는 것을

   사용해서 길게 코딩했다고 하는데, 지금은 GROUPING SETS함수를 이용해서

   간단하게 사용할 수 있다.

   예를 들어 부서, 업무를 한 그룹으로 묶고 부서, 관리자를 한 그룹으로 묶은 후 이 두 그룹 급여의

   총액을 구한다고 하자.

     SELECT deptno, job, mgr, sum(sal)
      FROM emp
      GROUP BY GROUPING SETS((deptno, job), (deptno, mgr));


    DEPTNO JOB                       MGR   SUM(SAL)
    ---------- ------------------ ---------- ----------
                20 CLERK                               1900
                30 SALESMAN                            5600
                20 MANAGER                             2975
                30 CLERK                                950
                30                                    10500
                10 PRESIDENT                           5000
                30 MANAGER                             2850
                10 CLERK                               1500
                20
                10 MANAGER                             2450
                20 ANALYST                             7500

    DEPTNO JOB                       MGR   SUM(SAL)
    ---------- ------------------ ---------- ----------
               10                                     3000
               20                          7839       2975
               30                                    10500
               10                          7839       2450
               30                          7698       6550
               20                          7566       7500
               10                          7782       1500
               20
               20                          7902        800
               10                                     8000
               30                          7839       2850

    DEPTNO JOB                       MGR   SUM(SAL)
    ---------- ------------------ ---------- ----------
               20                          7788       1100


5. HAVING절

   WHERE절을 이용하여 조회하고자 하는 레코드를 선별할 수 있으나,

   그룹에 대한 조건은 HAVING절에서 기술한다.

   예를 들어 아래와 같이 그룹에 대한 조건을 WHERE절을 쓰면 에러 난다.

   SELECT deptno, COUNT(*), SUM(sal)
    FROM emp
    WHERE COUNT(*) > 4
    GROUP BY deptno;

   WHERE COUNT(*) > 4
              *
   3행에 오류:
   ORA-00934: 그룹 함수는 허가되지 않습니다

   위처럼 에러가 발생하니 HAVING을 이용해 아래와 같이 코딩하면 정상적으로 결과가 출력된다.

   SELECT deptno, COUNT(*), SUM(sal)
    FROM emp
    GROUP BY deptno
    HAVING COUNT(*) > 4;

  

   DEPTNO   COUNT(*)   SUM(SAL)
   ------ ---------- ----------
         30          8      19900
         20          6      12375


   문제1> EMP 테이블에서 급여가 최대 5000 이상인 직원이 있는 부서에 대해서

             부서번호, 평균 급여, 급여의 합을 구하여 출력하여라.

             SELECT deptno, AVG(sal), SUM(sal)
             FROM emp
             GROUP BY deptno
             HAVING MAX(sal) >= 5000


            DEPTNO   AVG(SAL)   SUM(SAL)
            ---------- ---------- ----------
                        30     2487.5      19900
                        10     2987.5      11950


   문제2> EMP 테이블에서 업무별 급여의 평균이 3000 이상인 업무에 대해서

             업무명, 평균 급여, 급여의 합을 구하여 출력하여라.

             SELECT job, AVG(sal), SUM(sal)
             FROM emp
             GROUP BY job
             HAVING AVG(sal) > 3000;


             JOB                  AVG(SAL)   SUM(SAL)
            ------------------ ---------- ----------
                                                 5250      10500
                PRESIDENT                5000       5000
                   ANALYST                  3750       7500

   문제3> EMP 테이블에서 전체 월급이 5000을 초과하는 각 업무에 대해서 업무와 월급여 합계를

             출력하여라. 단 판매원은 제외하고 월 급여 합계로 내림차순 정렬하여라.

             SELECT job, SUM(sal)
              FROM emp
              WHERE job NOT LIKE 'SALE%'
              GROUP BY job
              HAVING SUM(sal) > 5000
              ORDER BY SUM(sal) DESC;


             JOB                  SUM(SAL)
            ------------------ ----------
            MANAGER                  8275
            ANALYST                  7500

[출처] GROUP BY|작성자 이경모


'DB' 카테고리의 다른 글

기타 함수  (0) 2009.06.02
그룹 함수  (0) 2009.06.02
Join  (0) 2009.06.02
Equijoin  (0) 2009.06.02
Non-Equijoin  (0) 2009.06.02
Posted by 으랏차
,

Join

DB 2009. 6. 2. 13:46

Join은 여러 개의 테이블로부터 자료를 검색하기 위하여 사용한다.


일반적으로 Primary Key와 Foreign Key를 사용하여 Join 하는 경우가 대부분이지만,

때로는 논리적인 값들의 연관으로 Join하는 경우도 있다고 한다.


그러니까 만약 emp테이블과 dept 테이블의 칼럼을 SELECT로 조회한다고 했을 때 한 쿼리문에 emp테이블과 dept테이블을 모두 조회할 수 있는데 이런 것을 Join이라고 한다.

[출처] Join|작성자 이경모


'DB' 카테고리의 다른 글

그룹 함수  (0) 2009.06.02
GROUP BY  (0) 2009.06.02
Equijoin  (0) 2009.06.02
Non-Equijoin  (0) 2009.06.02
Outer Join  (0) 2009.06.02
Posted by 으랏차
,

Equijoin

DB 2009. 6. 2. 13:46

Equijoin이란 조인 조건에서 =을 사용하여 값들이 정확하게 일치하는 경우에 사용하는 조인을 말한다.

대부분 PK와 FK의 관계를 이용해서 조인하고 다른 말로 단순 조인 또는 내부 조인 이라고도 한다.


1. Equijoin으로 자료 검색

   1) SELECT절은 검색할 열 이름을 명시.

   2) FROM절은 Access해야 하는 두 개 이상의 테이블을 명시.

   3) WHERE절은 테이블의 조인 조건을 명시.

   4) 양쪽 테이블에 공통으로 존재하는 열 이름은 모호함을 피하기 위하여 열 이름 앞에 테이블명을

       기술해야 한다.

   문제> EMP 테이블에서 사원번호, 이름, 업무, EMP 테이블의 부서번호, DEPT테이블의 부서번호,

            부서명, 근무지를 출력하여라.

            SELECT empno, ename, job, emp.deptno, dept.deptno
             FROM emp, dept
             WHERE dept.deptno = emp.deptno
             ORDER BY dept.deptno


             EMPNO ENAME           JOB                    DEPTNO     DEPTNO
            -------- --------------- ------------------ ---------- ----------
                   7839 KING            PRESIDENT                  10         10
                   7782 CLARK           MANAGER                    10         10
                   7934 MILLER          CLERK                      10         10
                   1111 홍길동                                             10         10
                   7788 SCOTT           ANALYST                    20         20
                   7876 ADAMS           CLERK                      20         20
                   7566 JONES           MANAGER                    20         20
                   7369 SMITH           CLERK                      20         20
                   3311                                                   20         20
                   7902 FORD            ANALYST                    20         20
                   1000 대조영                                     30         30

               EMPNO ENAME           JOB                    DEPTNO     DEPTNO
              -------- --------------- ------------------ ---------- ----------
                    7900 JAMES           CLERK                      30         30
                    7844 TURNER          SALESMAN                   30         30
                   7698 BLAKE           MANAGER                    30         30
                   7654 MARTIN          SALESMAN                   30         30
                   7521 WARD            SALESMAN                   30         30
                   1001 TEST                                               30         30
                   7499 ALLEN           SALESMAN                   30         30


2. Table에 Alias 사용

   테이블 별칭을 사용하여  긴 테이블 명을 간단하게 사용할 수 있다.

   SQL 코드를 적게 사용하여 코딩 시간이 절약되고 메모리를 보다 적게 사용한다.

   SELECT e.empno, e.ename, e.job, e.deptno, d.deptno, d.dname, d.loc

   FROM dept d, emp e  //FROM절에 dept를 d라고 별칭을 만들고, emp를 e라고 별칭을 만들었다.

   WHERE d.deptno = e.deptno

   ORDER BY d.deptno;

   1) 테이블 Alias는 30자까지 사용 가능하지만 짧을수록 좋다.

   2) FROM절에서 Alias가 사용되면 SELECT문 전체에서 사용 가능하다.

   3) 테이블의 Alias에 가급적 의미를 부여하는게 좋다.

   4) 테이블의 Alias는 현재 SELECT 문장에서만 유용하다.


3. WHERE절에 AND 연산자를 사용하여 추가적인 검색 조건을 가질 수 있다.

   SELECT e.empno, e.ename, job, e.sal, d.dname, d.loc
   FROM dept d, emp e
   WHERE d.deptno = e.deptno AND e.job = 'SALESMAN'


   EMPNO ENAME     JOB              SAL DNAME        LOC
   ------- --------- --------- ---------- ------------ --------
        7499 ALLEN     SALESMAN        1600 SALES        CHICAGO


        7521 WARD      SALESMAN        1250 SALES        CHICAGO


        7654 MARTIN    SALESMAN        1250 SALES        CHICAGO


        7844 TURNER    SALESMAN        1500 SALES        CHICAGO


4. 세 개 이상의 테이블 조인

   때로는 세 개 이상의 테이블을 조인할 수도 있다.

   방법은 FROM에는 테이블을 하나 더 적어주면 되고, WHERE절에는 AND를 이용해 조인한다.

[출처] Equijoin|작성자 이경모


'DB' 카테고리의 다른 글

그룹 함수  (0) 2009.06.02
GROUP BY  (0) 2009.06.02
Join  (0) 2009.06.02
Non-Equijoin  (0) 2009.06.02
Outer Join  (0) 2009.06.02
Posted by 으랏차
,

Non-Equijoin

DB 2009. 6. 2. 13:45

테이블 사이에 관련 있는 Column이 있을 때 쓰는 조인을 Equijoin이라고 한다면 , Non-Equijoin은 관련 없는 Column이 있을 때 조인하는 것을 말한다고 이해하면 되겠다.


예를 들어 salgrade 테이블과 emp 테이블을 참조해서 사원번호, 이름, 업무, 급여, 급여의 등급, 상한값, 하한값을 출력한다고 가정하자.

사원번호, 이름, 업무, 급여는 emp테이블에 속해 있고, 급여의 등급, 상한값, 하한값은 salgrade 테이블에 속해 있다.

두 테이블에 공통되는 Column은 없지만 sal이 salgrade의 상한값, 하한값 사이에 속해 있다는 관련성은 있다.

이 때, BETWEEN AND를 사용해서 조인하는데 이렇게 조인하는 것을 Non-Equijoin이라고 한다.


SELECT e.empno, e.ename, e.job, e.sal, s.grade, s.losal, s.hisal
FROM salgrade s, emp e
WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno = 10;

//emp테이블의 sal이 salgrade 테이블의 losal과 hisal 사이에 있고 emp테이블의 deptno가 10인

//sal을 검색하는 구문이다.


<=, >= 와 같이 다른 연산자를 사용 가능하나 BETWEEN AND 가장 단순하다.

BETWEEN AND 사용 시 하한값을 먼저 명시하고 상한값을 나중에 명시해야 한다는 점을 명시하자.

[출처] Non-Equijoin|작성자 이경모


'DB' 카테고리의 다른 글

그룹 함수  (0) 2009.06.02
GROUP BY  (0) 2009.06.02
Join  (0) 2009.06.02
Equijoin  (0) 2009.06.02
Outer Join  (0) 2009.06.02
Posted by 으랏차
,

Outer Join

DB 2009. 6. 2. 13:44

A 테이블과 B테이블을 Equijoin한다고 했을 때 공통되는 칼럼의 레코드에서 B테이블의 레코드 중 A테이블에서 검색이 되지 않는 레코드는 SELECT로 나타나지 않는다.

즉, 조인된 B테이블 엄연히 존재함에도 A테이블에 없기 때문에 나타나지 않는 것이다.

이 때, A테이블에 없어도 나타나게 하려고 설정하는 조인을 Outer Join이라고 한다.

예를 들어 emp 테이블에는 부서번호가 10, 20, 30만 존재하는데, 부서의 정보가 들어있는 dept테이블에는 10,20,30뿐만 아니라 40도 있다. 이 두 테이블을 Equipjoin하면 40번은 안나온다는 얘기다.

이럴 때 40번도 나오게 하려는 조인을 Outer Join이라고 하는 것이다.

연산자는 (+)를 쓰며 조인하려는 레코드가 없는 쪽에 (+)를 붙인다.

SELECT e.empno, e.ename, e.job, e.deptno,
d.deptno, d.dname, d.loc
FROM dept d, emp e
WHERE d.deptno = e.deptno(+);

// 40번도 나타나게 하기 위해 40번이 없는 테이블, 즉 emp테이블 쪽에 (+)를 붙인다.


EMPNO ENAME         JOB            DEPTNO  DEPTNO DNAME         LOC
----- ------------- ------------- ------- ------- ------------- --------
 7369 SMITH         CLERK              20      20 RESEARCH      DALLAS
 7499 ALLEN         SALESMAN           30      30 SALES         CHICAGO
 7521 WARD          SALESMAN           30      30 SALES         CHICAGO
 7566 JONES         MANAGER            20      20 RESEARCH      DALLAS
 7654 MARTIN        SALESMAN           30      30 SALES         CHICAGO
 7698 BLAKE         MANAGER            30      30 SALES         CHICAGO
 7782 CLARK         MANAGER            10      10 ACCOUNTING    NEW YORK
 7788 SCOTT         ANALYST            20      20 RESEARCH      DALLAS
 7839 KING          PRESIDENT          10      10 ACCOUNTING    NEW YORK
 7844 TURNER        SALESMAN           30      30 SALES         CHICAGO
 7876 ADAMS         CLERK              20      20 RESEARCH      DALLAS

EMPNO ENAME         JOB            DEPTNO  DEPTNO DNAME         LOC
----- ------------- ------------- ------- ------- ------------- --------
 7900 JAMES         CLERK              30      30 SALES         CHICAGO
 7902 FORD          ANALYST            20      20 RESEARCH      DALLAS
 7934 MILLER        CLERK              10      10 ACCOUNTING    NEW YORK
                                                  40 OPERATIONS    BOSTON

위와 같이 결과가 쭉 출력되고, emp테이블에 없는 40번의 정보는 맨 아래에 출력되었다.

[출처] Outer Join|작성자 이경모


'DB' 카테고리의 다른 글

그룹 함수  (0) 2009.06.02
GROUP BY  (0) 2009.06.02
Join  (0) 2009.06.02
Equijoin  (0) 2009.06.02
Non-Equijoin  (0) 2009.06.02
Posted by 으랏차
,

Self Join

RHCE 2009. 6. 2. 13:44

emp테이블에는 직원들의 매니저가 있는 칼럼이 있는데, 이름이 있는 것이 아니라, 사원번호로 존재한다. 매니저의 사원번호가 있는 칼럼은 mgr이다. mgr에 있는 사원번호를 토대로 empno 칼럼을 조회해서 이름을 알 수 있다. 이럴 때 같은 테이블에 있는 칼럼들이지만 조인해서 처리할 수 있는데 이렇게 조인하는 것을 Self Join이라고 한다.

Self Join은 같은 테이블에 대해 두 개의 alias를 작성(테이블 구분)함으로 FROM 절에 두 개의 테이블을 사용하는 것과 같이 한다.

SELECT worker.ename || '의 관리자는 ' || manager.ename || '이다.'
FROM emp worker, emp manager

//emp테이블 안에서 마치 두 개의 테이블이 있는 것처럼 worker와 manager로 나누었다.
WHERE worker.mgr = manager.empno;


WORKER.ENAME||'의관리자는'||MANAGER.E
-------------------------------------
SMITH의 관리자는 FORD이다.
ALLEN의 관리자는 BLAKE이다.
WARD의 관리자는 BLAKE이다.
JONES의 관리자는 KING이다.
MARTIN의 관리자는 BLAKE이다.
BLAKE의 관리자는 KING이다.
CLARK의 관리자는 KING이다.
SCOTT의 관리자는 JONES이다.
TURNER의 관리자는 BLAKE이다.
ADAMS의 관리자는 SCOTT이다.
JAMES의 관리자는 BLAKE이다.

WORKER.ENAME||'의관리자는'||MANAGER.E
-------------------------------------
FORD의 관리자는 JONES이다.
MILLER의 관리자는 CLARK이다.

[출처] Self Join|작성자 이경모


'RHCE' 카테고리의 다른 글

Default Editor 변경하기  (0) 2009.06.02
패스워드 만료 정책  (0) 2009.06.02
사용자 계정 삭제  (0) 2009.06.02
사용자를 다수의 그룹에 포함시킬 때...  (0) 2009.06.02
생성되는 사용자의 umask값 조정  (0) 2009.06.02
Posted by 으랏차
,

Default Editor 변경하기

RHCE 2009. 6. 2. 13:44
리눅스에서는 기본적으로 vi 에디터가 Default Editor로 설정되어 있다.
리눅스용 에디터는 vi이외에도 nano, emacs 등 여러 가지가 있는데 다른 에디터로 변경하려면 환경설정파일인 /etc/bashrc 파일에서 아래와 같이 설정해주면 된다.
EDITOR = /usr/bin/nano
export EDITOR

위 설정은 Default Editor를 nano로 변경한다는 의미이다.

'RHCE' 카테고리의 다른 글

Self Join  (0) 2009.06.02
패스워드 만료 정책  (0) 2009.06.02
사용자 계정 삭제  (0) 2009.06.02
사용자를 다수의 그룹에 포함시킬 때...  (0) 2009.06.02
생성되는 사용자의 umask값 조정  (0) 2009.06.02
Posted by 으랏차
,

패스워드 만료 정책

RHCE 2009. 6. 2. 13:43
패스워드는 기본값으로 만료되지 않는다. 이것은 사용자가 같은 패스워드를 영원히 사용할 수 있다는 것을 의미한다.
하지만 이러한 설정은 패스워드가 노출되거나 공격 당하더라도 그대로 계속 유지되는 보안상의 문제가 있다.
그렇기 때문에 한 패스워드를 일정기간동안만 사용할 수 있도록 만료 정책을 적용할 수 있다.
패스워드가 만료되도록 설정하는 것은 튼튼한 보안 정책의 일부분이다.
/etc/login.defs파일에서 만료 기본값 설정을 수정할 수 있다.
여기 설정된 정책이 앞으로 생성될 사용자에게 적용되는 것이다.

기존 사용자의 패스워드 만료기간을 설정하려면 chage 명령어를 사용한다.
`chage [사용자명]`을 입력해서 대화식으로 패스워드 만료기간을 설정할 수 있고, 아래의 특정 옵션을 사용해서 설정할 수 있다.
-m : 패스워드를 사용할 수 있는  최소 기간. (일)
-M : 패스워드를 사용할 수 있는 최대 기간. (일)
-i : 패스워드가 만료된 후에 계정을 잠그기까지 비활성화 상태 기간. (일)
-E ; 계정이 만료되는 날짜. (YYYY-MM-DD 형식)
-W : 경고 메시지가 시작하고 패스워드를 변경하기 전까지 기간. (일)
-l : 설정 목록 표시.

`chage -m 100 visitor`의 형식으로 사용하면 된다.
(visitor사용자의 패스워드 최소 기간을 100일로 설정

'RHCE' 카테고리의 다른 글

Self Join  (0) 2009.06.02
Default Editor 변경하기  (0) 2009.06.02
사용자 계정 삭제  (0) 2009.06.02
사용자를 다수의 그룹에 포함시킬 때...  (0) 2009.06.02
생성되는 사용자의 umask값 조정  (0) 2009.06.02
Posted by 으랏차
,

사용자 계정 삭제

RHCE 2009. 6. 2. 13:43
userdel 명령어는 시스템에서 사용자 계정을 삭제한다.
사용자 홈 디렉토리에 아직 필요한 정보가 있을 수 있으므로 `usermod -L`명령으로 삭제하지 않고 우선 잠궈두는 것이 현명한 방법이다.

userdel 명령어를 사용하여 계정을 삭제할 때 -r 옵션을 사용하면 사용자 홈 디렉토리와 메일박스까지 모두 삭제하게 된다.
해당 홈 디렉토리를 삭제하지 않고 계정을 삭제하면 시스템에 다음 사용자를 추가할 때 파일 소유권 문제가 생길 수 있으므로 가능하면 -r 옵션을 붙여주는 것이 좋겠다.

그리고 사용자 소유의 파일이 남아 있는지 확인하는 것이 좋다.
`find / -uid 500`
사용자 uid 500의 사용자가 소유한 파일을 찾는 명령이다.

'RHCE' 카테고리의 다른 글

Default Editor 변경하기  (0) 2009.06.02
패스워드 만료 정책  (0) 2009.06.02
사용자를 다수의 그룹에 포함시킬 때...  (0) 2009.06.02
생성되는 사용자의 umask값 조정  (0) 2009.06.02
할당량 구현  (0) 2009.06.02
Posted by 으랏차
,