jQuery로 선택된 값 읽기

$("#selectBox option:selected").val();

$("select[name=name]").val();

 

jQuery로 선택된 내용 읽기

$("#selectBox option:selected").text();

 

선택된 위치

var index = $("#test option").index($("#test option:selected"));

 

-------------------------------------------------------------------

 

// Add options to the end of a select

$("#selectBox").append("<option value='1'>Apples</option>");

$("#selectBox").append("<option value='2'>After Apples</option>");

 

// Add options to the start of a select

$("#selectBox").prepend("<option value='0'>Before Apples</option>");

 

// Replace all the options with new options

$("#selectBox").html("<option value='1'>Some oranges</option><option value='2'>More Oranges</option>");

 

// Replace items at a certain index

$("#selectBox option:eq(1)").replaceWith("<option value='2'>Some apples</option>");

$("#selectBox option:eq(2)").replaceWith("<option value='3'>Some bananas</option>");

 

// 지정된 index 값으로 select 하기

$("#selectBox option:eq(2)").attr("selected", "selected");

 

// text 값으로 select 하기

$("#selectBox").val("Some oranges").attr("selected", "selected");

 

// value 값으로 select 하기

$("#selectBox").val("2");

 

// 지정된 인덱스 값의 item 삭제

$("#selectBox option:eq(0)").remove();

 

// 첫번째 item 삭제

$("#selectBox option:first").remove();

 

// 마지막 item 삭제

$("#selectBox option:last").remove();

 

// 선택된 옵션의 text 구하기

alert($("#selectBox option:selected").text());

 

// 선택된 옵션의 value 구하기

alert($("#selectBox option:selected").val());

 

// 선택된 옵션 index 구하기

alert($("#selectBox option").index($("#selectBox option:selected")));

 

// SelecBox 아이템 갯수 구하기

alert($("#selectBox option").size());

 

// 선택된 옵션 앞의 아이템 갯수

alert($("#selectBox option:selected").prevAll().size());

 

// 선택된 옵션 후의 아이템 갯수

alert($("#selectBox option:selected").nextAll().size());

 

// Insert an item in after a particular position

$("#selectBox option:eq(0)").after("<option value='4'>Some pears</option>");

 

// Insert an item in before a particular position

$("#selectBox option:eq(3)").before("<option value='5'>Some apricots</option>");

 

// Getting values when item is selected

$("#selectBox").change(function() {

           alert($(this).val());

           alert($(this).children("option:selected").text());

});

- 이클립스 주석형식 설정

Window -> Preferences -> java -> Code Style -> code Templates -> Comments -> Types

 

수정 완료 -> Class.java 생성 후 Shift + Alt + J 누르면 자동 코멘트 등록 됨.

어떤 값이 예약 값인 NaN(숫자 아님)인지 여부를 나타내는 부울 값을 반환합니다.
isNaN(numValue) 

Number 형식으로 변환된 값이 NaN이면 true이고, 그렇지 않으면 false입니다.

필수 numValueNaN에 대해 테스트할 값입니다.

이 메서드는 보통 parseIntparseFloat 메서드의 반환 값 테스트에 사용합니다.

다른 방법으로, NaN 또는 다른 값을 포함하는 변수를 자신과 비교할 수도 있습니다. 비교 결과 값이 서로 같지 않으면 NaN입니다. 자신과 같지 않은 값은 NaN뿐이기 때문입니다.

지원되는 문서 모드: Quirks, Internet Explorer 6 표준, Internet Explorer 7 표준, Internet Explorer 8 표준, Internet Explorer 9 표준, Internet Explorer 10 표준. Windows 스토어 응용 프로그램에서도 지원됩니다. 버전 정보를 참조하십시오.

적용 대상: Global 개체(JavaScript)

JavaScript
// Returns false.
isNaN(100);

// Returns false.
isNaN("100");

// Returns true.
isNaN("ABC");

// Returns true.
isNaN("10C");

// Returns true.
isNaN("abc123");

// Returns true.
isNaN(Math.sqrt(-1));    

 

결론, 숫자값이면 'false' 이고, 문자열이면 'true' 반환 

 

- Properties Editor 플러그인 설치

 

자바 프로퍼티 파일의 기본 이코딩은 ISO-8859-1 이다.

이클립스에서 프로퍼티 파일 생성 후 한글을 입력하면 문자열이 깨진다.

그래서 한글이나, 기타 유니코드 문자를 정상적으로 출력되게 하기 위해서는 ASCII 값으로 바꾸어주어야 한다.

기타 변환 툴을 이용할 수도 있지만, 따로 한글 매핑파을 정도를 준비하지 않는다면 식별이 굉장히 어려워 진다.

그래서 Properties Editor 플러그인을 설치하여 사용한다. 편하니까 - 끝

 

이클립스 상단 메뉴에서

Help -> Install New SoftWare... -> Add

Properties Editor 플러그인 주소 입력

http://propedit.sourceforge.jp/eclipse/updates

 

위 항목중에 젤 밑의 PropertieEditor 만 체크해서 Next -> Finish 하면 끝

 

 

시퀀스란?

  • - 유일(UNIQUE)한 값을 생성해주는 오라클 객체이다.
  • - 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성 할 수 있다.
  • - 보통 PRIMARY KEY 값을 생성하기 위해 사용 한다.
  • - 메모리에 Cache되었을 때 시퀀스값의 액세스 효율이 증가 한다.
  • - 시퀀스는 테이블과는 독립적으로 저장되고 생성된다.

시퀀스 생성

-- 시퀀스 생성 Syntax
CREATE SEQUENCE sequence_name
    [START WITH n]
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]
  • - START WITH : 시퀀스의 시작 값을 지정한다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 한다.
  • - INCREMENT BY : 시퀀스의 증가 값을 지정한다. n을 2로 하면 2씩 증가한다. START WITH를 1로, INCREMENT BY를 2로 설정하면 1, 3, 5, 7,.. 이렇게 시퀀스 번호가 증가한다.
  • - MAXVALUE : 시퀀스 최대값
  • - MINVALUE : 시퀀스 최소값
  • - CYCLE|NOCYCLE : 최대값 도달시 순환 여부
  • - CACHE | NOCACHE : CACHE 여부, 원하는 숫자만큼 미리 만들어 Shared Pool의 Library Cache에 상주시킨다.

시퀀스 수정

START WITH 값을 제외하고 ALTER SEQUENCE 명령어로 수정 할 수 있다.

-- 시퀀스 수정 Syntax
ALTER SEQUENCE sequence_name
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]

시퀀스의 사용예

시퀀스 생성

empno를 자동 증가하는 시퀀스를 만들어 보자

-- 8000부터 시작하는 시퀀스를 생성하자
CREATE SEQUENCE  seq_empno
 START WITH  8000
INCREMENT BY 1
 CACHE 20;


-- 시퀀스가 정상적으로 생성되었는지 조회해 보자
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.CURRVAL FROM DUAL;

시퀀스를 이용해서 데이터를 등록해 보자

-- INSERT 시 시퀀스 사용
INSERT INTO emp 
        (empno, 
         ename, job, mgr, 
         hiredate, sal, comm, deptno)
VALUES
        (seq_empno.NEXTVAL, 
         'TIGER', 'MANAGER', 7839, 
         SYSDATE, 3000, null, 20);


-- SELECT 절에서 시퀀스 사용
CREATE TABLE emp2
AS 
SELECT seq_empno.NEXTVAL as empno, ename, 
       job, mgr, hiredate, sal, comm, deptno
FROM emp; 


-- 시퀀스가 정상적으로 반영되었는지 조회해 보자
SELECT * FROM emp;

시퀀스 수정

시퀀스 수정 예이다.

-- seq_empno  시퀀스의 증과값과 Cache 사이즈를 변경하는 예이다.
ALTER SEQUENCE  seq_empno
INCREMENT BY 10
CACHE 40;


-- 시퀀스가 정상적으로 변경되었는지 조회해 보자
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.CURRVAL FROM DUAL;

시퀀스 삭제

DROP SEQUENCE 명령으로 시퀀스를 삭제 할 수 있다.

-- seq_empno 시퀀스를 삭제한다.
DROP SEQUENCE seq_empno;

1. Single-Row Subquery

- SELECT 문장에서 오직 하나의 행(값)만 반환하는 Query이다

- 단일 행 연산자(=,>, >=, <, <=, <>, !=) 만 사용된다.

-- empno가 7369의 job을 조회 한 후 
-- job이 'CLERK'인 사원의 이름과 직업을 반환 한다.
SELECT ename,job
  FROM emp
 WHERE job = (SELECT job
                FROM emp
               WHERE empno = 7369);

  • [그림] Single-Row Subquery
  • 단일행서브쿼리

2. Multiple-Row Subquery란?

- 하나 이상의 행을 반환하는 Subquery이다

- 단일 행 연산자를 사용하지 못하며, 다중 행 연산자(IN, NOT IN, ANY, ALL, EXISTS)만 사용이 가능하다.

IN 연산자
  • - IN 연산자는 하나의 컬럼이 여러개의 '=' 조건을 가지는 경우에 사용
  • - OR는 IN을 포함한다. IN을 사용해 표현할 수 있는 것은 당연히 OR로 표현할 수 있다.
  • - 하지만 OR로 표한한 것은 IN으로 표현하지 못할때가 있다. (OR에서 LIKE같은 연산자를 사용한 경우)
  • - IN은 반드시 하나의 컬럼이 비교되어야 하므로 나중에 인덱스 구성에 대한 전략을 수립할 때 유리하다.
  • - 그러므로 가능한 OR보다는 IN 을 사용하는 것이 좋다.

 
-- 부서별로 가장 급여를 많이 받는 사원의 정보를 출력하는 예제
SELECT empno,ename,sal,deptno  
  FROM emp
 WHERE sal IN (SELECT MAX(sal)
                 FROM emp
                GROUP BY deptno);

EMPNO ENAME         SAL     DEPTNO
----- --------  --------- ---------
 7698 BLAKE        2850        30
 7788 SCOTT        3000        20
 7902 FORD         3000        20

ANY 연산자

- ANY 연산자는 Subquery의 여러 결과값 중 어느 하나의 값만 만족이 되면 행을 반환 한다.

 
-- SALESMAN 직업의 급여보다 많이 받는 사원의 사원명과 급여 정보를 출력하는 예제
SELECT ename, sal
  FROM emp
 WHERE deptno != 20
   AND sal > ANY (SELECT sal 
                    FROM emp 
                   WHERE job='SALESMAN');

ENAME             SAL
---------- ----------
ALLEN            1600
BLAKE            2850
CLARK            2450
...

ALL 연산자

- ALL 연산자는 Subquery의 여러 결과값 중 모든 결과 값을 만족해야 행을 반환 한다.

 
-- 모든 SALESMAN직업의 급여보다 많이받는 사원의 사원명과 급여정보를 출력하는예제
SELECT ename, sal
  FROM emp
 WHERE deptno != 20
   AND sal > ALL (SELECT sal 
                    FROM emp 
                   WHERE job='SALESMAN');

ENAME             SAL
---------- --------
CLARK            2450
BLAKE            2850
KING             5000

EXISTS 연산자
  • - EXISTS 연산자는 Subquery 데이터가 존재하는가를 체크해 존재 여부(TRUE,FALSE)를 결과로 반환한다.
  • - EXISTS절에는 반드시 메인 쿼리와 연결이 되는 조인 조건을 가지고 있어야 한다.
  • - subquery에서 결과 행을 찾으면, inner query 수행을 중단하고 TRUE를 반환한다.
 
-- 아래 예처럼 emp 테이블을 통해 사원들이 속한 부서번호의 정보만 조회하는 경우
-- 추출하고자 하는 대상은 dept 테이블이지만 emp 테이블과 조인하여 부서번호를 
-- 체크해야 한다.
-- 두 테이블의 관계가 1 : M 이므로 불필요하게 EMP 테이블을 모두 액세스하고 
-- DISTINCT로 중복 제거를 한다.
SELECT DISTINCT d.deptno, d.dname
  FROM dept d, emp e
 WHERE d.deptno = e.deptno;



-- EXISTS를 사용하는 Subquery로 변경
-- 추출하고자 하는 대상만을 FROM절에 놓고 emp테이블은 체크만 하기위해 
-- EXISTS절에 위치시켰으며 이로 인해 수행속도가 대폭 감소하게 된다.
SELECT d.deptno, d.dname
  FROM dept d
 WHERE EXISTS 
      (SELECT 1
         FROM emp e
        WHERE e.deptno = d.deptno);

3. Multiple-Column Subquery란?

결과 값이 두 개 이상의 컬럼을 반환하는 Subquery이다

Pairwise(쌍비교) Subquery

Subquery가 한 번 실행되면서 두 개 이상의 컬럼을 검색해서 주 쿼리로 넘겨 준다.

 
SELECT empno, sal, deptno
  FROM emp
 WHERE (sal, deptno) IN (SELECT sal, deptno
                          FROM emp
                         WHERE deptno = 30
                           AND comm is NOT NULL);

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7521       1250         30
      7654       1250         30
      7844       1500         30
      7499       1600         30 

Nonpairwise(비쌍비교) Subquery

WHERE 절에서 두 개 이상의 서로 다른 Subquery가 사용되어서 결과 값을 주 쿼리로 넘겨 준다.

 
SELECT empno, sal, deptno
  FROM emp
 WHERE sal IN (SELECT sal
                 FROM emp
                WHERE deptno = 30
                  AND comm is NOT NULL);
  AND deptno IN (SELECT deptno
                   FROM emp
                  WHERE deptno = 30
                    AND comm is NOT NULL); 

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7521       1250         30
      7654       1250         30
      7844       1500         30
      7499       1600         30 

Null Values in a Subquery

서브쿼리에서 NULL 값이 반환 되면 주 쿼리 에서는 어떠한 행도 반환되지 않는다.


4. Inline View (From절 Subquery)란?

FROM절에 오는 Subquery이다.

FROM절에서 원하는 데이터를 조회하여 가상의 집합을 만들어 조인을 수행하거나 가상의 집합을 다시 조회 할 때 사용한다.

Inlivew View 안에 또 다른 Inline View가 올 수 있다.

 
-- 부서번호 20의 평균 급여보다 크고, 
-- 부서번호 20에 속하지 않은 관리자를 조회하는 예제이다.
SELECT b.empno, b.ename, b.job, b.sal, b.deptno
  FROM (SELECT empno
          FROM emp  
         WHERE sal >(SELECT AVG(sal) 
                       FROM emp 
                      WHERE deptno = 20)) a, emp b
 WHERE a.empno = b.empno
   AND b.mgr is NOT NULL
   AND b.deptno != 20;

 EMPNO ENAME      JOB         SAL     DEPTNO
 ----- --------- --------- ------- ---------
  7698 BLAKE      MANAGER     2850        30
  7782 CLARK      MANAGER     2450        10

5. Scalar Subquery란?

SELECT 절에서 사용하는 Subquery 이다.

Scalar Subquery의 특징

한 개의 로우만 반환 한다.

메인 쿼리에서 추출되는 데이터 건 수 만큼 수행되기 때문에 조인으로 수행 될 때보다 수행회수가 적을 수 있다.

일치하는 값이 없는 경우 NULL을 반환 한다.

코드성 테이블에서 코드값을 조회 할 때, 불필요한 조인을 하지 않기 위해 많이 사용한다.

Scalar Subquery 예제

아래는 일반적인 Scalar Subquery 예이다.

 
-- 직업이 ‘MANAGER’인 사원의 사원명, 부서명을 조회하는 예제
SELECT ename,
       (SELECT dname FROM dept d WHERE d.deptno = e.deptno) deptno
FROM emp e
WHERE job ='MANAGER';

ENAME      DEPTNO
---------- --------------
JONES      RESEARCH
BLAKE      SALES
CLARK      ACCOUNTING

NULL값을 반환하는 Outer Join형태의 Scalar Subquery 예

 -- Scalar Subquery는 일치하는 값이 없으면 NULL을 반환하므로 Outer Join과 같은 형태이다.
-- 아래는 부서별 최대 급여정보 조회 예이다.
-- 부서 40에 해당하는 직원이 없기 때문에 최대 급여가 조회 되지 않는다.
SELECT d.deptno, d.dname,
       (SELECT MAX(sal) 
          FROM emp
         WHERE deptno = d.deptno) sal
  FROM dept d;



-- 결과가 동일한 Outer Join 예이다.
SELECT d.deptno, d.dname, MAX(e.sal)
  FROM dept d, emp e
 WHERE d.deptno = e.deptno(+)
 GROUP BY d.deptno, d.dname
 ORDER bY d.deptno;

DEPTNO DNAME          SAL
------ -----------  -----
    10 ACCOUNTING    5000
    20 RESEARCH      3000
    30 SALES         2850
    40 OPERATIONS

GROUP BY절

  • - GROUP BY 절은 데이터들을 원하는 그룹으로 나눌 수 있다.
  • - 나누고자 하는 그룹의 컬럼명을 SELECT절과 GROUP BY절 뒤에 추가하면 된다.
  • - 집계함수와 함께 사용되는 상수는 GROUP BY 절에 추가하지 않아도 된다. (개발자 분들이 많이 실수 함)
  • - 아래는 집계 함수와 상수가 함께 SELECT 절에 사용되는 예이다.

-- 부서별 사원수 조회
SELECT '2005년' year, deptno 부서번호, COUNT(*) 사원수
  FROM emp
 GROUP BY deptno
 ORDER BY COUNT(*) DESC;


YEAR     부서번호     사원수
------ ---------- ----------
2005년         30          6
2005년         20          5
2005년         10          3

아래 예제는 부서별로 그룹하여 부서번호, 인원수, 급여의 평균, 급여의 합을 조회하는 예제이다.

 
SELECT deptno, COUNT(*), ROUND(AVG(sal)) "급여평균", 
       ROUND(SUM(sal)) "급여합계"
  FROM emp
 GROUP BY deptno;


  DEPTNO   COUNT(*)    급여평균    급여합계
-------- ---------- ---------- ----------
      30          6       1567       9400
      20          5       2175      10875
      10          3       2917       8750

아래 예제는 업무별로 그룹하여 업무, 인원수, 평균 급여액, 최고 급여액, 최저 급여액 및 합계를 조회하는 예제이다.

 
SELECT job, COUNT(empno) "인원수", AVG(sal) "평균급여액",
       MAX(sal) "최고급여액", MIN(sal) "최저급여액", 
       SUM(sal) "급여합계"
  FROM emp
 GROUP BY job;


JOB           인원수   평균급여액   최고급여액   최저급여액    급여합계
----------- -------- ---------- ---------- ---------- ----------
CLERK              4     1037.5       1300        800       4150
SALESMAN           4       1400       1600       1250       5600
PRESIDENT          1       5000       5000       5000       5000
MANAGER            3 2758.33333       2975       2450       8275
ANALYST            2       3000       3000       3000       6000 

  • - GROUP BY 절은 집계 함수 없이도 사용 될 수 있다.(DISTINCT와 용도가 비슷해 짐)
  • - 아래 예제를 보면 GROUP BY는 말 그대로 그룹을 나누는 역할을 한다.
-- GROUP BY를 이용한 부서번호 조회 예
SELECT deptno
  FROM emp
 GROUP BY deptno;


DEPTNO
------
    30
    20
    10

DISTINCT와 GROUP BY절

  • - DISTINCT와 GROUP BY 개념에 대해서 좀 더 이해를 해보자.
  • - DISTINCT는 주로 UNIQUE(중복을 제거)한 컬럼이나 레코드를 조회하는 경우 사용한다.
  • - GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용한다.
  • - 하지만 두 작업은 조금만 생각해보면 동일한 형태의 작업이라는 것을 쉽게 알 수 있으며, 일부 작업의 경우 DISTINCT로 동시에 GROUP BY로도 처리될 수 있는 쿼리들이 있다.
  • - 두 기능 모두 Oracle9i까지는 sort를 이용하여 데이터를 만들었지만, Oracle10g 부터는 모두 Hash를 이용하여 처리한다.
  • - 그래서 DISTINCT를 사용해야 할지, GROUP BY를 사용해서 데이터를 조회하는 것이 좋을지 고민되는 경우들이 가끔 있다.

아래의 예제는 동일한 결과를 반환한다.

-- DISTINCT를 사용한 중복 데이터 제거
SELECT DISTINCT deptno FROM emp;


-- GROUP BY를 사용한 중복 데이터 제거
SELECT deptno FROM emp GROUP BY deptno;


DEPTNO
------
    30
    20
    10

하지만 곰곰히 생각해 보면 GROUP BY와 DISTINCT는 각자 고유의 기능이 있다

집계함수를 사용하여 특정 그룹으로 구분 할 때는GROUP BY 절을 사용하며, 특정 그룹 구분없이 중복된 데이터를 제거할 경우에는 DISTINCT 절을 사용 하도록 하자

-- 아래와 같은 기능은 DISTINCT를 사용하는 것이 훨씬 효율적이다.
SELECT COUNT(DISTINCT d.deptno) "중복제거 수", 
       COUNT(d.deptno) "전체 수"
  FROM emp e, dept d
 WHERE e.deptno = d.deptno;


-- 집계 함수가 필요한 경우는 GROUP BY를 사용해야 한다.
SELECT deptno, MIN(sal)
  FROM emp 
 GROUP BY deptno;

HAVING 절

  • - WHERE 절에서는 집계함수를 사용 할 수 없다.
  • - HAVING 절은 집계함수를 가지고 조건비교를 할 때 사용한다.
  • - HAVING절은 GROUP BY절과 함께 사용이 된다.

아래 예제는 사원수가 다섯 명이 넘는 부서와 사원수를 조회하는 예제이다.

SELECT b.dname, COUNT(a.empno) "사원수" 
  FROM emp a, dept b
 WHERE a.deptno = b.deptno
 GROUP BY dname
HAVING COUNT(a.empno) > 5;


DNAME          사원수
------------ -------
SALES              6

아래 예제는 전체 월급이 5000을 초과하는 JOB에 대해서 JOB과 월급여 합계를 조회하는 예이다. 단 판매원(SALES)은 제외하고 월 급여 합계로 내림차순 정렬하였다.

SELECT job, SUM(sal) "급여합계"
  FROM emp  
 WHERE job != 'SALES'      -- 판매원은 제외
 GROUP BY job              -- 업무별로 Group By 
HAVING SUM(sal) > 5000     -- 전체 월급이 5000을 초과하는
 ORDER BY SUM(sal) DESC;   -- 월급여 합계로 내림차순 정렬


JOB                  급여합계
------------------ ----------
MANAGER                  8275
ANALYST                  6000
SALESMAN                 5600

GROUPING SETS

  • - GROUPING SETS 함수는 GROUP BY의 확장된 형태로 하나의 GROUP BY절에 여러개의 그룹 조건을 기술할 수 있다.
  • - GROUPING SETS 함수의 결과는 각 그룹 조건에 대해 별도로 GROUP BY한 결과를 UNION ALL한 결과와 동일하다.
  • - GROUPING SETS 함수를 사용하면 UNION ALL등을 사용하여 복잡하게 SQL문장을 작성했던 것을 간단하게 한 문장으로 해결 할 수 있다.

아래는 GROUPING SETS함수와 GROUP BY, UNION ALL을 이용하여 동일한 결과를 출력하는 예제이다.

--  GROUPING SETS 예제
SELECT deptno, job, SUM(sal)
 FROM emp
 GROUP BY GROUPING SETS(deptno, job);


-- GROUP BY와 UNION ALL을 이용한 예제
SELECT NULL deptno,  job, SUM(sal)
  FROM emp
 GROUP BY job
 UNION ALL
SELECT deptno, NULL job, SUM(sal)
  FROM emp
 GROUP BY deptno;


-- 조회결과
   DEPTNO JOB                  SUM(SAL)
--------- ------------------ ----------
          CLERK                    4150
          SALESMAN                 5600
          PRESIDENT                5000
          MANAGER                  8275
          ANALYST                  6000
       30                          9400
       20                         10875
       10                          8750

'공부 > ORACLE_SQL' 카테고리의 다른 글

ORACLE_[ 시퀀스(Sequence) ]  (0) 2013.05.20
ORACLE_[ SubQuery ]  (0) 2013.05.20
ORACLE_[ 집계함수(Aggregate function) ]  (0) 2013.05.20
ORACLE_[ OUTER JOIN ]  (0) 2013.05.20
ORACLE_[ JOIN ]  (2) 2013.05.20

집계 함수란 여러행 또는 테이블 전체 행으로부터 하나의 결과값을 반환하는 함수이다.

집계함수(Aggregate function)의 이해

  • - GROUP BY절을 이용하여 그룹 당 하나의 결과로 그룹화 할 수 있다.
  • - HAVING절을 사용하여 집계함수를 이용한 조건 비교를 할 수 있다.
  • - MIN, MAX 함수는 모든 자료형에 사용 할 수 있다.
  • - 일반적으로 가장 많이 사용하는 집계함수에는AVG(평균), COUNT(개수), MAX(최대값), MIN(최소값), SUM(합계) 등이 있다.

COUNT

COUNT 함수는 검색된 행의 수를 반환 한다.

-- 검색된 행의 총 수 4개를 반환. 즉 4개의 부서가 존재한다.
SELECT COUNT(deptno) FROM dept;

COUNT(DEPTNO)
-------------
            4

MAX

MAX 함수는 컬럼값 중에서 최대값을 반환 한다.

-- sal 컬럼값 중에서 제일 큰값을 반환. 즉 가장 큰 급여를 반환.
SELECT MAX(sal) salary FROM emp;

SALARY
-------
  5000   

MIN

MIN 함수는 컬럼값 중에서 최소값을 반환 한다.

-- sal 컬럼값 중에서 가장 작은 값 반환. 즉 가장 적은 급여를 반환
SELECT MIN(sal) salary FROM emp;

 SALARY
-------
    800    

AVG

AVG 함수는 평균 값을 반환 한다.

-- 부서번호 30의 사원 평균 급여를 소수점 1자리 이하에서 반올림
SELECT ROUND(AVG(sal),1) salary 
  FROM emp 
 WHERE deptno = 30;

 SALARY
 ------
 1566.7

SUM

SUM 함수는 검색된 컬럼의 합을 반환 한다.

-- 부서번호 30의 사원 급여 합계를 조회.
SELECT SUM(sal) salary 
  FROM emp 
 WHERE deptno = 30;

 SALARY
-------
   9400    

STDDEV

STDDEV 함수는 표준편차를 반환 한다.

-- 부서번호 30의 사원 급여 표준편차를 반환.    
SELECT ROUND(STDDEV(sal),3) salary 
  FROM  emp 
 WHERE deptno = 30;

  SALARY
--------
 668.331  

집계함수 예

아래는 부서별 사원수, 최대급여, 최소급여, 급여합계, 평균급여를 급여합게 순으로 조회하는 예이다.

SELECT deptno 부서번호, COUNT(*) 사원수, 
       MAX(sal) 최대급여, MIN(sal) 최소급여, 
       SUM(sal) 급여합계, ROUND(AVG(sal)) 평균급여
  FROM emp
 GROUP BY deptno
 ORDER BY SUM(sal) DESC;


부서번호   사원수  최대급여  최소급여   급여합계   평균급여
------- -------- --------- -------- --------- ---------
     20       5      3000       800    10875     2175
     30       6      2850       950     9400     1567
     10       3      5000      1300     8750     2917

'공부 > ORACLE_SQL' 카테고리의 다른 글

ORACLE_[ SubQuery ]  (0) 2013.05.20
ORACLE_[ GROUP BY와 HAVING절, 그리고 GROUPING SETS ]  (0) 2013.05.20
ORACLE_[ OUTER JOIN ]  (0) 2013.05.20
ORACLE_[ JOIN ]  (2) 2013.05.20
ORACLE_[CREATE TABLE]  (0) 2013.01.09

Outer Join 이란?

  • - Equi Join은 조인을 생성하려는 두 개의 테이블의 한쪽 컬럼에서 값이 없다면 테이터를 반환하지 못한다.
  • - 동일 조건에서 조인 조건을 만족하는 값이 없는 행들을 조회하기 위해 Outer Join을 사용 한다.
  • - Outer Join 연산자는 "(+)" 이다.
  • - 조인시 값이 없는 조인측에 "(+)"를 위치 시킨다.
  • - Outer Join 연산자는 표현식의 한 편에만 올 수 있다.

Outer Join 예제

Equi Join과 Outer Join의 비교.

 
-- Equi Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno, d.dname
  FROM emp e, dept d
 WHERE e.deptno = d.deptno;

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

-- Outer Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e, dept d
 WHERE e.deptno(+) = d.deptno;

DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40

Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 한다.

 
-- ename LIKE 조건절에 (+)연산자가 누락된 경우
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename LIKE '%';

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

-- ename LIKE 조건절에 (+)연산자를 추가해야 정상적으로 데이터가 조회 된다. 
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename(+) LIKE '%';

DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40

LEFT, RIGHT, FULL Outer Join

Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 한다.

LEFT OUTER JOIN

LEFT OUTERL JOIN은 오른쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

-- LEFT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM dept d 
  LEFT OUTER JOIN emp e
  ON d.deptno = e.deptno;  

RIGHT OUTER JOIN

RIGHT OUTERL JOIN은 왼쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

-- RIGHT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
 RIGHT OUTER JOIN dept d
    ON e.deptno = d.deptno;

FULL OUTER JOIN

FULL OUTERL JOIN은 양쪽 테이블 모두 Outer Join걸어야 하는 경우 사용 한다.

-- FULL OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
  FULL OUTER JOIN dept d
    ON e.deptno = d.deptno;

'공부 > ORACLE_SQL' 카테고리의 다른 글

ORACLE_[ GROUP BY와 HAVING절, 그리고 GROUPING SETS ]  (0) 2013.05.20
ORACLE_[ 집계함수(Aggregate function) ]  (0) 2013.05.20
ORACLE_[ JOIN ]  (2) 2013.05.20
ORACLE_[CREATE TABLE]  (0) 2013.01.09
ORACLE_[CASE문 사용법]  (0) 2012.10.05

Join 이란?
  • - 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법 이다.
  • - 보통 둘 이상의 행들의 공통된 값 Primary Key 및 Foreign Key 값을 사용하여 조인 한다.
  • - 두 개의 테이블을 SELECT문장 안에서 조인 하려면 적어도 하나의 컬럼이 그 두 테이블 사이에서 공유 되어야 한다.

Join 방법과 방식
  • - 조인의 방법 : Equi Join (등가 조인, 내부조인) , Non-Equi Join , Self Join , Outer Join
  • - 조인의 방식 : Nested Loop Join, Sort Merge Join, Hash Join

Equi Join

  • - 가장 일반적으로 사용하는 Equality Condition(=)에 의한 조인이다
  • - Equi join의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다.
-- dept 테이블과 emp 테이블을 조인하는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d, emp e
 WHERE d.deptno = e.deptno;

콤마(,) 대신 INNER JOIN을 사용 할 수 있으며, INNER는 생략 가능하다. Join 조건은 ON 절에 온다.

-- INNER JOIN절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d 
 INNER JOIN emp e
    ON d.deptno = e.deptno;

NATURAL JOIN을 사용 하면 동일한 컬럼을 내부적으로 모두조인 하므로, ON절이 생략 가능하다.

-- NATURAL JOIN절을 이용하여 조인하는 예제
SELECT  e.empno, e.ename, d.dname
  FROM  dept d 
NATURAL JOIN emp e;

NATURAL JOIN의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데, USING 문을 사용하면 컬럼을 선택해서 조인을 할 수가 있다.

-- JOIN~USING절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, deptno 
  FROM emp e 
  JOIN dept d 
 USING (deptno);

Non-Equi Join

  • - 테이블의 어떤 column도 Join할 테이블의 column에 일치하지 않을 때 사용하고, 조인조건은 동등( = )이외의 연산자를 갖는다.
  • - BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN
  • - 거의 사용하지 않는다
-- emp 테이블과 salgrade 테이블의 Non-Equi Join 예제
SELECT e.ename,e.sal,s.grade
  FROM emp e, salgrade s
  WHERE e.sal 
BETWEEN s.losal 
    AND s.hisal;

ENAME             SAL      GRADE
---------- ---------- ----------
SMITH             800          1
JAMES             950          1
ADAMS            1100          1
...

Self Join

  • - Equi Join과 같으나 하나의 테이블에서 조인이 일어나는 것이 다르다.
  • - 같은 테이블에 대해 두 개의 alias를 사용하여 FROM절에 두 개의 테이블을 사용하는 것 처럼 조인한다.
-- 사원의 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename "Manager"
  FROM emp e, emp a
 WHERE e.empno = a.mgr;

ENAME     Manager
------- ----------
FORD      SMITH
BLAKE     ALLEN
BLAKE     WARD
KING      JONES
...

Cartesian Product
  • - 검색하고자 했던 데이터뿐 아니라 조인에 사용된 테이블들의 모든 데이터가 반환 되는 현상
  • - Cartesian Product는 조인 조건을 정의하지 않은 경우 발생한다.
  • - 테이블의 개수가 N이라면 Cartesian Product를 피하기 위해서는 적어도 N-1개의 등가 조건을 SELECT 문안에 포함시켜야 하며 각 테이블의 컬럼이 적어도 한번은 조건절에 참조되도록 해야 한다.
  • CROSS JOIN을 이용하면 Cartesian Product 값을 얻을 수 있다.
-- CROSS JOIN절을 이용하여 Cartesian Product 값을 얻는 예제
SELECT  e.empno, e.ename, d.dname
  FROM  dept d CROSS JOIN emp e;

56 개의 행이 선택되었습니다.

'공부 > ORACLE_SQL' 카테고리의 다른 글

ORACLE_[ 집계함수(Aggregate function) ]  (0) 2013.05.20
ORACLE_[ OUTER JOIN ]  (0) 2013.05.20
ORACLE_[CREATE TABLE]  (0) 2013.01.09
ORACLE_[CASE문 사용법]  (0) 2012.10.05
ORACLE_[DECODE문_사용법]  (0) 2012.10.05

+ Recent posts