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

  1. [DBMS] HAVING 조건
  2. [DBMS] Group By
  3. [DBMS] NULL도 데이터이다
  4. [Java] 형변환
  5. [Java] 실행
  6. [Java] Java SE, JDK, JRE
  7. [DBMS] 서브쿼리
  8. [DBMS] 집합연산자
  9. [DBMS] 조인
  10. [DB] DB2 마이그레이션

[DBMS] HAVING 조건

HAVING 조건


- SELECT 절에 조건을 사용하여 결과를 제한할 때는 WHERE 절을 사용하지만 그룹의 결과를 제한할 때는 HAVING 절을 사용합니다. 

- 예를 들어 설명하자면 부서별로 그룹지은 후(GROUP BY), 그룹 지어진 부서별 평균 급여가 2000 이상인(HAVING) 부서번호와 부서별 평균 급여를 출력하는 경우입니다.

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;




부서의 최대값과 최소값을 구하되 최대 급여가 2900이상인 부서만 출력합니다. 

SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO HAVING MAX(SAL) >= 2900;







'Server > DBMS' 카테고리의 다른 글

[DBMS_Oracle] 시퀀스  (0) 2014.12.08
[DBMS_Oracle] dual  (0) 2014.12.08
[DBMS] Group By  (0) 2014.12.02
[DBMS] NULL도 데이터이다  (0) 2014.12.02
[DBMS] 서브쿼리  (0) 2014.11.30

[DBMS] Group By


Group By


- 그룹함수를 쓰되 어떤 컬럼 값을 기준으로 그룹함수를 적용할 경우 GROUP BY 절 뒤에 해당 컬럼을 기술하면 됩니다. 

SELECT 칼럼명, 그룹함수

FROM 테이블명 

WHERE 조건 (연산자) 

GROUP BY 칼럼명;


- 합계, 평균, 최대값.이나, 최소값. 등을 어떤 칼럼을 기준으로 그 칼럼의 값 별로 보고자 할 때 GROUP BY 절 뒤에 해당 칼럼을 기술하면 됩니다. 

- GROUP BY 절을 사용할 때 주의할 점은 GROUP BY 절 다음에는 칼럼의 별칭을 사용할 수 없고, 반드시 칼럼명을 기술해야 한다는 점입니다. 


- 사원 테이블을 부서 번호로 그룹지어 봅시다.

SELECT DEPTNO FROM EMP GROUP BY DEPTNO;



다음은 소속 부서별 평균 급여 구하는 예제입니다. 

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;


 


- 다음은 소속 부서별 최대 급여와 최소 급여를 구하는 예제입니다.

SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO;





'Server > DBMS' 카테고리의 다른 글

[DBMS_Oracle] dual  (0) 2014.12.08
[DBMS] HAVING 조건  (0) 2014.12.02
[DBMS] NULL도 데이터이다  (0) 2014.12.02
[DBMS] 서브쿼리  (0) 2014.11.30
[DBMS] 집합연산자  (0) 2014.11.30

[DBMS] NULL도 데이터이다

NULL도 데이터이다


DBMS에서의 NULL은 매우 중요한 데이터입니다. 왜냐하면 DBMS에서는 컬럼에 널값이 저장되는 것을 허용하는데 널 값을 제대로 이해하지 못한 채 쿼리문을 사용하면 원하지 않는 결과를 얻을 수 있기 때문입니다. 

다음은 널에 대한 이해를 돕기 위해서 다양한 널의 정의를 살펴본 것입니다.


1 0(zero)도 아니고 

2 빈 공간도 아니다. 

3 미확정(해당 사항 없음), 알 수 없는(unknown) 값을 의미한다. 

4 어떤 값인지 알 수 없지만 어떤 값이 존재하고 있다.

5 ? 혹은 ∞의 의미이므로 

6 연산, 할당, 비교가 불가능하다.

- NULL은 ? 혹은 ∞의 의미이기 때문에 연산, 할당, 비교가 불가능합니다. 


select ename, comm, sal*12+comm, nvl(comm, 0), sal*12+nvl(comm, 0) from emp;

- 연봉 계산을 위해 사원 테이블에서 급여와 커미션 칼럼을 살펴본 결과 영업사원이 아닌 사원들의 커미션은 NULL로 지정되어 있으므로 연봉을 올바르게 계산하기 위해서는 커미션이 NULL인 경우 0으로 변경하여 계산에 참여하도록 해야 합니다

- 오라클에서는 NULL을 0 또는 다른 값으로 변환하기 위해서 사용하는 함수로 NVL을 제공합니다. 커미션에 널이 저장되어 있더라도 널을 다른 값으로 변환하는 NVL 함수를 사용하면 제대로 된 계산 결과를 얻을 수 있습니다.  






'Server > DBMS' 카테고리의 다른 글

[DBMS] HAVING 조건  (0) 2014.12.02
[DBMS] Group By  (0) 2014.12.02
[DBMS] 서브쿼리  (0) 2014.11.30
[DBMS] 집합연산자  (0) 2014.11.30
[DBMS] 조인  (0) 2014.11.30

[Java] 형변환


형변환


형 변환(Type Conversion)이란 데이터의 타입을 변경하는 것이다. 예를 들어 int 타입의 정수 200의 bit 값은 아래와 같다.

00000000 00000000 00000000 11001000

프로그래밍을 처음 시작하는 사람도 컴퓨터는 모든 정보가 0과 1로 만들어진다는 이야기를 들어봤을 것이다. 여러분이 200이라는 숫자를 입력하면 컴퓨터에는 위와 같이 0과 1로 이루어진 조합으로 저장된다. 바로 이 0과 1을 bit라고 부른다. 위의 데이터는 8X4개의 자릿수로 이루어져 있다. 이것을 32bit라고 부른다. 위의 데이터는 int 형으로 숫자 200을 저장했을 때 메모리상에 만들어지는 내용이다. 그럼 실수형인 float 타입으로 정수 200.0을 저장하면 어떻게 될까? 사람에게는 똑같은 수인 정수 200과 실수 200.0을 컴퓨터는 전혀 다른 방식으로 저장한다. float 타입의 정수 200.0의 bit 값은 아래와 같다.


01000011 01001000 00000000 00000000

정수 200과 실수 200.0의 bit 값이 완전히 다른 것을 알 수 있다. 이렇게 형식이 다른 데이터들을 더하려면 한쪽의 데이터 타입을 다른 쪽의 데이터 타입으로 전환(Conversion)해야 한다. 자바는 이러한 형 변환을 자동으로 처리해주는데 이러한 전환작업을 자동(암시적) 형 변환(implicit Conversion)이라고 부른다.


1. 자동 형 변환

아래 예제를 보자. 

double a = 3.0F;

위의 코드는 double 타입의 변수 a에 float 타입의 값을 대입하고 있다. 이 때 3.0F의 값은 자동으로 double 타입으로 형 변환이 일어난다. 이것이 가능한 이유는 double 타입이 float 타입보다 더 많은 수를 표현 할 수 있기 때문이다. 타입을 변경해도 정보의 손실이 일어나지 않는 경우 자동 형 변환이 일어난다.


반대로 아래의 예제는 오류가 발생한다. 상수 3.0은 상수인데, 이 상수는 double 형이다. 이 값을 표현 범위가 좁은 float에 넣으려고 하기 때문에 오류가 발생한다. 

float a = 3.0;

자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다.

아래는 자동 형 변환이 일어나는 규칙을 보여준다.


byte 타입은 short가 될 수 있지만 short는 byte 타입이 될 수 없다. long은 float가 될 수 있지만, float는 long이 될 수 없다.

상수와 상수를 연산한다면 어떻게 될까? 다음 예제를 보자. 

int a = 3;

float b = 1.0F;

double c = a + b;

위의 연산은 두 번의 형 변환이 일어난다. 우선 a와 b를 더하기 위해서 정수 a와 실수 b 중 하나가 형 변환을 해야 한다. 위의 그림에 따르면 int와 float가 붙으면 int가 float가 되기 때문에 변수 a에 담겨있는 값 3은 float 타입이 된다. 연산 결과는 float 타입이다. 하지만 이 값이 담겨질 변수 C의 타입은 double이다. float가 double 타입의 변수에 담기기 위해서는 float가 double로 형 변환을 해야 한다. 이렇게 해서 최종적으로 형 변환된 값이 변수 c에 담겼다.


2. 명시적 형 변환

자동 형 변환이 적용되지 경우에는 수동으로 형 변환을 해야 한다. 이를 명시적(Explicit Conversion)이라고 한다. 아래 예제는 모든 행의 코드에서 오류가 발생한다. 자동 형 변환이 이루어지지 않기 때문이다. (실행)

float a = 100.0;

int b = 100.0F;


위의 예제를 조금 수정해보자. 아래 코드는 오류가 발생하지 않는다. 

float a = (float)100.0;

int b = (int)100.0F;

아래와 같이 괄호 안에 데이터 타입을 지정해서 값 앞에 위치시키는 것을 명시적인 형 변환이라고 부른다.


형 변환은 한 번에 설명할 수 있는 주제는 아니다. 여러분이 객체지향까지 진입하면 다양한 방법으로 형 변환이라는 주제가 다시 언급될 것이다. 일단은 이정도로 언급하고 후속 수업을 통해서 형 변환에 대해서 좀 더 심화된 내용을 알아가자.




'Programing > Java' 카테고리의 다른 글

[Java] 변수의 종류  (0) 2014.12.14
[Java] abstract  (0) 2014.12.11
[Java] 인터페이스의 이해  (0) 2014.12.06
[Java] 실행  (0) 2014.12.02
[Java] Java SE, JDK, JRE  (0) 2014.12.02

[Java] 실행


실행


1. 코드

우선 코드에 대해서 알아보자. 코드(code) 혹은 소스(source)는 프로그램이 어떤 모습이고, 어떻게 동작해야 하는가를 표현한 일종의 설계도라고 할 수 있다. 그런데 컴퓨터 프로그래밍에서의 설계도는 설계도 이상의 의미가 있다. 설계도를 컴퓨터에게 제출하는 순간 컴퓨터는 그 설계도에서 요구하는 프로그램을 마법처럼 만들어주기 때문이다. 그래서 프로그래밍에서의 설계도는 그 프로그램 자체라고도 할 수 있다. 코드는 자바의 문법에 맞게 만들어진 텍스트 파일이고, 이 파일의 확장자는 .java를 사용한다.


아래와 같이 파일을 만들어보자. 코드를 만드는 데는 복잡한 프로그램이 필요 없다. 가장 간단한 에디터인 메모장(win)이나 텍스트에디터(mac)로도 코드를 만들 수 있다. 적당한 디렉터리를 만들고 아래와 같은 내용을 가지고 있는 파일을 만들어보자. 파일의 이름은 Helloworld.java다.

class Helloworld {

    public static void main(String[] args){

        System.out.println("Hello world");

    }

}


2. 컴파일

그런데 코드 자체를 바로 실행할 수는 없다. 자바의 문법은 사람만이 이해할 수 있는 형식으로 되어 있기 때문이다. 이 코드를 컴퓨터가 이해할 수 있는 상태로 변환해주는 과정이 필요한데 이것을 컴파일(compile)이라고 하고, 이 작업을 하는 소프트웨어를 컴파일러(compiler)라고 부른다. 자바의 컴파일러는 javac 라는 이름을 가지고 있다. 만약 helloworld.java라는 코드를 컴파일한다면 아래와 같은 식으로 javac를 실행하면 된다. 

javac Helloworld.java


3. 실행

위 의 명령을 실행하면 같은 디렉터리에 helloworld.class라는 이름의 파일이 생성된다. 바로 이 파일이 컴파일된 파일이고, 쉽게 말해서 실행파일이라고 할 수 있다. 그런데 이 파일은 파일 이름만으로 실행 할 수 있는 것은 아니고, 컴파일된 파일을 실행시켜주는 프로그램을 이용해야 한다. 이 작업을 하는 프로그램을 런처(launcher)라고 하고 아래와 같이 실행한다.

java Helloworld


여러분이 해야 할 일은 런처를 이용해서 확장자가 class인 파일을 실행하는 것이다. 런처는 내부적으로 자바 가상 머신에서 우리가 만든 코드가 동작하도록 한다. 우리가 만든 프로그램은 최종적으로 자바 가상머신이라는 것을 통해서 동작하게 된다.

위와 같은 흐름을 통해서 자바 프로그램이 만들어지고 실행된다. 이를 통해서 알 수 있는 것은 코드만 있다고 프로그램이 만들어지는 것은 아니라는 것이다. 실제로 동작하는 프로그램은 자바이고, 여러분은 자바가 어떻게 동작할 것인가를 코드로 작성해서 자바에게 전달하면 자바는 그 코드에 적혀있는 데로 실행하게 되는 것이다. 아래 그림을 보자.

                                                                                 




'Programing > Java' 카테고리의 다른 글

[Java] 변수의 종류  (0) 2014.12.14
[Java] abstract  (0) 2014.12.11
[Java] 인터페이스의 이해  (0) 2014.12.06
[Java] 형변환  (0) 2014.12.02
[Java] Java SE, JDK, JRE  (0) 2014.12.02

[Java] Java SE, JDK, JRE

Java SE, JDK, JRE


- Java SE(Java Platform, Standard Edition)는 자바의 표준안이다. 자바라는 언어가 어떠한 문법적인 구성을 가졌는지와 같은 것들을 정의하고 있다. 이것은 구체적인 소프트웨어가 아니고 그 소프트웨어의 설계도라고 할 수 있다. 소프트웨어에서는 설계도라는 표현 대신에 명세서(spec, specification)이라는 말을 사용한다. 이 명세서에 따라서 Java가 만들어지게 된다. Java SE 7은 버전 7에 대한 명세서이다. 자바는 계속 진화하고 있는 기술이다. 이 명세서는 JCP(Java Community Process, http://jcp.org)라는 조직을 통해서 만들어진다.


- JDK(Java Development Kit)는 Java SE의 표준안에 따라서 만들어진 구체적인 소프트웨어다. Java 개발자라면 JDK를 다운받아서 설치해야 한다. 여기에는 Java 프로그램을 실행하면 Java 코드를 컴파일하는 컴파일러와 개발에 필요한 각종 도구 그리고 JRE가 포함되어 있다. 즉 개발자를 위한 자바 버전이다.


- JRE(Java Runtime Environment)는 자바가 실제로 동작하는 데 필요한 JVM, 라이브러리, 각종 파일들이 포함되어 있다. 자바로 만들어진 프로그램을 구동하려고 한다면 이것을 설치한다. 일반인을 위한 자바 버전이라고 할 수 있다.


- JVM(Java Virtual Machine) JVM은 자바가 실제도 구동하는 환경이다. 자바로 만들어진 소프트웨어는 JVM이라는 가상화된 환경에서 구동되고, 하드웨어나 운영체제에 따라서 달라질 수 있는 호환성의 문제는 운영체제 버전에 따라서 만들어진 JVM이 알아서 해결한다. 즉 하나의 자바 프로그램을 만들면 어떤 환경에서도 실행할 수 있는 것이 바로 JVM의 역할이라고 할 수 있다.


JVM은 자바를 실행하기 위한 가상 기계라고 할 수 있다. 컴퓨터(머신)를 사용해서 자바를 실행하기 위한 가상 컴퓨터라고 이해하면 좋을 것이다.

가상 기계는 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어이며, 컴퓨터의 성능이 향상됨에 따라 점점 더 많은 하드웨어들이 소프트웨어화되어 컴퓨터 속으로 들어오고 있다.

그 예로는 TV와 비디로를 스프트웨어한 윈도우 미디어 플레이어던가, 오디오 시스템을 소프트웨어화한 윈엠프 등이 있다.

이와 마찬가지로 '가상 컴퓨터'는 실제 컴퓨터(하드웨어)가 아닌 스프트웨어로 구현된 컴퓨터라는 뜻으로 컴퓨터 속의 컴퓨터라고 생각하면 된다.


자바로 작성된 어플리케이션은 모두 이 가상 컴퓨터에서만 실행되기 때문에, 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

이 관계를 그림으로 나타내면 아래와 같다.


cp.)

자바로 프로그래밍을 하기 위해서는 먼저 JDK를 설치해야 한다. JDK를 설치하면, 자바가상머신과 자바클래스 라이브러리외에 자바를 개발하는데 필요한 프로그램들이 설치된다.


(1) JDK의 bin 디렉터리의 주요 파일

1) javac.exe: 자바 컴파일러, 자바소스코드를 바이트코드로 컴파일한다.

c:\jdk1.6\work\javac Hello.java


2) java.exe: 자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.

c:\jdk1.6\work\java Hello


3) javap.exe: 역어셈플러, 컴파일된 클래스파일을 원래의 소스로 변환한다.

c:\jdk1.6\javap Hello > Hello.java


vo.) 바이트코드

JVM이 이해할 수 있는 기계어, JVM은 바이트코드를 다시 해당 OS의 기계어로 변환되어 OS로 전달한다.


cf.) jar.exe: 압축프로그램, 클래스파일과 프로그램과 프로그램의 실행에 관련된 파일을 하나의 jar파일(.jar)로 압축하거나 압축해제한다.


cf.) JDK와 JRE

JDK: 자바개발도구

JRE: 자바실행환경


JDK: JRE + 개발에 필요한 실행파일(javac.exe등)

JRE: JVM+클래스라이브러리


프롬프트 창에서 자바 파일 실행

Hello.java 작성 ---> javac.exe --->Hello.class 생성 ---> java.exe ---> 실행



'Programing > Java' 카테고리의 다른 글

[Java] 변수의 종류  (0) 2014.12.14
[Java] abstract  (0) 2014.12.11
[Java] 인터페이스의 이해  (0) 2014.12.06
[Java] 형변환  (0) 2014.12.02
[Java] 실행  (0) 2014.12.02

[DBMS] 서브쿼리


서브쿼리


1. 서브쿼리의 개념

서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미합니다.

SQL 에 포함된 또 다른 SQL을 서브쿼리라고 합니다. 서브쿼리는 SELECT절, FROM절, WHERE절, HAVING절에 사용될 수 있습니다.

서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며 서브쿼리에서는 메인 쿼리의 모든 컬럼을 참조할 수 있지만 메인 쿼리에서는 서브쿼리의 컬럼을 참조할 수 없습니다.

  • 서브쿼리 개념


2. 서브쿼리가 가능한 곳은 다음과 같다.

SELECT CLAUSE

FROM CLAUSE

WHERE CLAUSE

HAVING CLAUSE

ORDER BY CLAUSE

INSERT VALUES CLAUSE

UPDATE SET CLAUSE


3. 서브쿼리의 유형

(1) 단일 행(Sing-Row) 서브쿼리 : SELECT 문장으로 부터 오직 하나의 행 만을 검색하는 질의이다.

서브쿼리에서 한 행에 대한 결과 값만 반환하는 것을 단일행 서브쿼리라고 합니다 (=, >, >=, <, <=, <>, !=)

- WHERE 절에서 사용된 서브쿼리에서 한 개의 결과 값만 반환할 경우 사용하는 연산자는 다음과 같습니다. 이 외의 연산자를 사용할 경우 에러가 발생할 수 있습니다.

연산자의미
=같음
>보다 큼
>=크가나 같음
<보다 작음
<=작거나 같음
, !=같지 않음

▶ 구문

SELECT select_list

FROM table_name

WHERE 표현식 연산자 (SELECT select_list

                       FROM table_name

                       WHERE 조건식);

표현식 연산자 : subquery는 비교 연산자 우측에 () 안에 작성한다.


▶ 예제

employee 테이블에서 gildong보다 급여를 많이 받는 사원을 출력하시오.

SELECT ename, salary

FROM employee

WHERE salary > (SELECT salary

                         FROM employee

                         WHERE ename = 'gildong') ;

 

20번 사원과 같은 부서에서 일하는 사원을 출력하시오.

SELECT ename, dno

FROM employee

WHERE dno = (SELECT dno

                   FROM employee

                   WHERE eno = 20) ;



(2) 다중 행(Multiple-Row) 서브쿼리 : SELECT 문장으로부터 하나 이상의 행을 검색하는 질의이다.

서브쿼리에서 여러 행에 대한 결과 값을 반환하는 것을 다중행 서브쿼리라고 합니다. (IN, NOT IN, ANY, ALL, EXISTS)

- 다중 행 subquery를 이용하여 데이터를 비교할 경우에는 다중 행 연산자를 사용합니다. 만약 다중 행 subquery에 단일 행 연산자를 사용한다면, 다음과 같은 오류가 발생합니다.

다중 행 연산자설명
IN(서브쿼리)서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미한다. (Multiple OR 조건)
비교연산자 ALL(서브쿼리)서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미한다. 비교 연산자로 ">"를 사용했다면 메인쿼리는 서브쿼리의 모든 결과 값을 만족해야 하므로, 서브쿼리 결과의 최대값보다 큰 모든 건이 조건을 만족한다. ANY 연산자는 Subquery의 여러 결과값 중 어느 하나의 값만 만족이 되면 행을 반환 한다.
비교연산자 ANY(서브쿼리)서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미한다. 비교 연산자로 ">"를 사용했다면 메인쿼리는 서브쿼리의 값들 중 어떤 값이라도 만족하면되므로, 서브쿼리의 결과의 최소값보다 큰 모든 건이 조건을 만족한다. ANY 연산자는 Subquery의 여러 결과값 중 어느 하나의 값만 만족이 되면 행을 반환 한다. (SOME은 ANY와 동일함.)
EXISTS(서브쿼리)서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미한다. 조건을 만족하는 건이 여러 건이더라도 1건만 찾으면 더 이상 검색하지 않는다.

▶ 예제1 (IN)

각 부서에서 급여를 가장 적게 받는 사원들을 출력하시오
SELECT dno, ename, salary
FROM employee
WHERE salary = (SELECT MIN(salary)
                      FROM employee
                      GROUP BY dno);
[ERR-31002 : A single-row subquery returns more than one row.] 단일 행 하위 질의에 2개 이상의 행이 리턴되었다. 

SELECT dno, ename, salary
FROM employee
WHERE salary IN (SELECT MIN(salary)
                       FROM employee
                       GROUP BY dno) ;

10 rows selected.  


SELECT ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO
FROM EMP 
WHERE SAL>=3000);

SELECT ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO IN (10, 20);


▶ 예제2 (ANY)

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


▶ 예제3 (ALL)

모든 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


▶ 예제4 (EXISTS)

-- 아래 예처럼 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)[다중 컬럼] 서브쿼리 : SELECT 문장으로부터 하나 이상의 컬럼을 검색하는 질의이다.

서브쿼리에서 여러 열에 대한 결과 값을 반환하는 것을 다중열 서브쿼리라고 합니다. 메인쿼리의 조건절에 여러 컬럼을 동시에 비교할 수 있다. 서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼 개수와 컬럼의 위치가 동일해야 한다. 


▶ 예제

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 

FROM PLAYER 

WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT) 

                            FROM PLAYER 

                            GROUP BY TEAM_ID) 

ORDER BY TEAM_ID, PLAYER_NAME; 

다중 칼럼 서브쿼리는 서브쿼리의 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미한다.


(4) FROM절상의 서브쿼리(INLINE VIEW) : FROM절상에 오는 서브쿼리로 VIEW처럼 작용 한다.

SELECT 의 FROM 절에서 사용하는 서브쿼리를 inline view라고 합니다. view와는 달리 inline view에서 사용하는 SELECT문을 저장하지 않기 때문에 dynamic view 라고도 부릅니다.

다른 서브쿼리와는 다르게 inline view에서 질의하는 칼럼들을 메인 서브쿼리에서 사용할 수 있습니다.


▶ 예제1

사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하라.

SELECT e.ename, e.salary, a.avg_sal

FROM employee e, (SELECT dno, AVG(salary) avg_sal FROM employee GROUP BY dno) a

WHERE e.dno = a.dno;

ENAME             SALARY       AVG_SAL     

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

HSCHOI            2000000      2150000     

JHCHOI            2300000      2150000     

HYCHOI            1700000      1340000     

KWKIM              980000      1340000     

YHBAE             4000000      2438250

 


▶ 예제2

 부서번호 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 절에서 사용하는 서브쿼리를 스칼라 서브쿼리(Scalar Subquery)라 한다.

스칼라 서브쿼리는 한 행, 한 칼럼(1 Row 1 Column)만을 반환하는 서브쿼리를 말한다. 

스칼라 서브쿼리는 메인 서브쿼리의 row수 만큼 반복되어 실행이 되고, 만약 조건에 만족하는 스칼라 서브쿼리의 결과가 없다면 NULL 을 리턴하게 된다.


▶ 예제

사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하시오.

SELECT ename, salary, (SELECT AVG(salary) FROM employee WHERE dno = e.dno) avg_sal 

FROM employee e;

ENAME            SALARY       AVG_SAL     

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

HSCHOI           2000000      2150000     

KSKIM             1800000      1800000


cp.) HAVING 절에서 서브쿼리 사용하기

HAVING 절은 그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해서 사용한다.

SELECT P.TEAM_ID 팀코드, T.TEAM_NAME 팀명, AVG(P.HEIGHT) 평균키 

FROM   PLAYER P, TEAM T 

WHERE  P.TEAM_ID = T.TEAM_ID 

GROUP  BY P.TEAM_ID, T.TEAM_NAME 

HAVING AVG(P.HEIGHT) < (SELECT AVG(HEIGHT) 

                        FROM PLAYER 

                        WHERE TEAM_ID ='K02');


cp.) UPDATE문의 SET 절에서 사용하기

UPDATE TEAM A 

SET  A.STADIUM_NAME = (SELECT X.STADIUM_NAME 

                         FROM STADIUM X 

                         WHERE X.STADIUM_ID = A.STADIUM_ID); 


cp.)  INSERT문의 VALUES절에서 사용하기

- INSERT INTO 다음에 VALUES 절을 사용하는 대신에 서브 쿼리를 사용할 수 있습니다. 

- 이렇게 하면 기존의 테이블에 있던 여러 행을 복사해서 다른 테이블에 삽입할 수 있습니다. 

- 이 때 주의할 점은 INSERT 명령문에서 지정한 컬럼의 개수나 데이터 타입이 서브 쿼리를 수행한 결과와 동일해야 한다는 점입니다. 

INSERT INTO PLAYER(PLAYER_ID, PLAYER_NAME, TEAM_ID) 

VALUES((SELECT TO_CHAR(MAX(TO_NUMBER(PLAYER_ID))+1) FROM PLAYER), '홍길동', 'K06'); 




'Server > DBMS' 카테고리의 다른 글

[DBMS] HAVING 조건  (0) 2014.12.02
[DBMS] Group By  (0) 2014.12.02
[DBMS] NULL도 데이터이다  (0) 2014.12.02
[DBMS] 집합연산자  (0) 2014.11.30
[DBMS] 조인  (0) 2014.11.30

[DBMS] 집합연산자


집합 연산자


두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중에 또 다른 방법이 있는데 그 방법이 바로 집합 연산자(Set Operator)를 사용하는 방법이다. 

집합 연산자연산자의 의미
UNION여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
UNION ALL여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. 일반적으로 여러 개의 결과가 상호 배타적인(Exclusive)일 때 많이 사용한다. 개별 SQL문의 결과가 서로 중복되지 않는 경우, UNION과 결과가 동일한다. (결과의 정렬 순서에는 차이가 있을 수 있음)
INTERSECT여러 개의SQL문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다.
EXCEPT앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다. (일부 데이터베이스는 MINUS를 사용함)


1. UNION : 합집합

UNION은 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않은 값들을 반환 한다.


▶부서번호를 조회하는 UNION 예제

SELECT deptno FROM emp

UNION

SELECT deptno FROM dept;

DEPTNO

--------

      10

      20

      30

      40 


2. UNION ALL : 중복을 포함하는 합집합

UNION과 같으나 두 테이블의 중복되는 값 까지 반환 한다.


부서번호를 조회하는 UNION ALL 예제

SELECT deptno FROM emp

UNION ALL

SELECT deptno FROM dept;

 DEPTNO

-------

     20

     30

     30

     20

     30

...

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


3. INTERSECT : 교집합

INTERSECT는 두 행의 집합중 공통된 행을 반환 한다.


▶ 부서번호를 조회하는 INTERSECT 예제

SELECT deptno FROM emp

INTERSECT

SELECT deptno FROM dept;

  DEPTNO

---------

       10

       20

       30



4. MINUS : 차집합

MINUS는 첫 번째 SELECT문에 의해 반환되는 행 중에서 두 번째 SELECT문에 의해 반환되는 행에 존재하지 않는 행들을 반환 한다.


▶ 사원이 없는 부서를 조회하는 MINUS 예제

SELECT deptno FROM dept

MINUS

SELECT deptno FROM emp;

 DEPTNO

---------

     40





'Server > DBMS' 카테고리의 다른 글

[DBMS] HAVING 조건  (0) 2014.12.02
[DBMS] Group By  (0) 2014.12.02
[DBMS] NULL도 데이터이다  (0) 2014.12.02
[DBMS] 서브쿼리  (0) 2014.11.30
[DBMS] 조인  (0) 2014.11.30

[DBMS] 조인

조인


join이란?

- 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법이다. 다시 말해, 두 개 이상의 테이블들을 연결하여 데이터를 검색하는 것을 JOIN 이라고 합니다.

- 보통 둘 이상의 행들의 공통된 값 primary Key 및 Foreign Key 값을 사용하여 조인한다.

- 보통 테이블을 select 문장 안에서 조인하려면 적어도 하나의 컬럼이 그 두 테이블 사이에서 공유 되어야 한다.

- JOIN 시 사용되는 JOIN 연산자에 따라서 EQUI JOIN과 NON EQUI JOIN 으로 구별되며, FROM 절의 JOIN 형태에 따라서 INNER JOIN과 OUTER JOIN 으로 구별합니다.


Join 분류

1) JOIN 조건으로 사용되는 연산자에 따른 분류

JOIN설명
EQUI JOIN두 테이블 간의 칼럼 값들이 서로 일치하는 경우
JOIN 조건으로 '=' 연산자를 사용
NON EQUI JOIN두 테이블 간의 칼럼 값들이 서로 일치하지 않는 경우
JOIN 조건으로 'BETWEEN ~ AND' 등의 범위 비교 연산자를 사용


 2) FROM 절의 JOIN 형태에 따른 분류

JOIN설명
INNER JOINJOIN 조건에서 값이 일치하는 행만 반환
OUTER JOINJOIN 조건에서 한쪽 값이 없더라도 행을 반환


1. EQUI JOIN

- 두 테이블 간의 컬럼 값들이 서로 정확하게 일치하는 경우에 사용하는 JOIN으로 WHERE 절에 '=' 연산자를 사용하여 JOIN 조건을 명시합니다.

- 일반적으로 기본키, 외래키로 지정된 컬럼을 JOIN으로 많이 사용합니다.

  • EQUI JOIN 개념

(1)  EQUI JOIN 구문

SELECT table1.column_name, table2.column_name

FROM table1, table2

WHERE table1.column_name = table2.column_name;

- table1.column_name : 데이터를 검색할 테이블 및 열을 명시한다.

- table 이름 대신에 FROM 절에 기술한 테이블의 alias를 사용해도 된다.

- table1.column_name = table2.column_name : 두 테이블을 JOIN 시킬 JOIN 조건을 명시한다.

- table 이름 대신에 FROM 절에 기술한 테이블의 alias를 사용해도 된다.


(2) EQUI JOIN 예제

사원이 어떤 부서에서 근무하는지를 검색하시오.

SELECT employee.eno, employee.ename, department.dno, department.dname

FROM employee, department

WHERE employee.dno = department.dno;


사원이 어떤 부서에서 근무하는지를 검색하시오(별칭을 사용하시오).

SELECT e.eno, e.ename, d.dno, d.dname

FROM employee e, department d

WHERE e.dno = d.dno;


    

2. NON EQUI JOIN

두 테이블 간의 컬럼 값들이 서로 일치하지 않는 경우에 사용하는 JOIN 방법으로 WHERE 절에 보통 BETWEEN ~ AND, < , > 등의 비교 연산자를 사용하여 JOIN 조건을 작성합니다.

  • ON EQUI JOIN 개념

(1) NON EQUI JOIN 예제

사원이 받는 급여의 등급을 조회

SELECT e.ename, e.salary, s.grade

FROM employee e, salary s

WHERE e.salary BETWEEN s.low_sal AND s.high_sal; 



3. INNER JOIN

JOIN 조건을 만족하는 행만 반환하는 JOIN으로 FROM 절에 INNER JOIN 혹은 JOIN 절을 사용합니다. JOIN 조건은 ON 절에 명시합니다.

  • OUTER JOIN 개념

(1) INNER JOIN 구문

SELECT table1.column_name, table2.column_name, …

FROM table1 [INNER] JOIN table2

ON table1.column_name = table2.column_name;

- table1 [INNER] JOIN table2 : JOIN 할 테이블의 이름을 나열한다. INNER 를 생략해도 INNER JOIN 방식이 적용된다.

- ON table1.column_name=table2.column_name : JOIN 조건을 명시한다


(2) INNER JOIN 예제

사원정보와 사원이 근무하는 부서이름을 검색하시오.

▶ 아래 두 쿼리는 결과가 동일하다

-- 일반적인 조인 방식

SELECT e.eno, e.ename, d.dno, d.dname 

FROM employee e, department d

WHERE e.dno = d.dno;


-- INNER JOIN 을 사용한 방식

SELECT e.eno, e.ename, d.dno, d.dname 

FROM employee e INNER JOIN department e

ON e.dno = d.dno;


    

4. OUTER JOIN

조인 조건을 만족하지 않는 데이터를 처리하기 위한 JOIN의 확장 형태입니다. INNER JOIN 이 두 테이블에 있는 키 갑싱 일치하는 데이터만 가져오는 것에 비해 OUTER JOIN은 어느 한 쪽의 데이터를 모두 가져옵니다.

또한, 한 테이블의 행이 다른 테이블의 행에 대응되지 않을 때 반환된 결과 집합의 경우, 대응되지 않는 행을 갖고 있는 테이블로 확인된 모든 결과 집합 열에 대해 NULL값이 제공됩니다.

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


(1) OUTER JOIN 구문

SELECT table1.column_name, table2.column_name, …

FROM table1 {LEFT|RIGHT|FULL} OUTER JOIN table2

ON table1.column_name = table2.column_name;


- LEFT OUTER JOIN : JOIN 수행 시 왼쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.

- RIGHT OUTER JOIN : JOIN 수행 시 오른쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.

- FULL OUTER JOIN : 조인 수행 시 왼쪽, 오른쪽 테이블의 모든 데이터를 읽어 JOIN을 수행한다. LEFT OUTER JOIN과 RIGHT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.


(2) OUTER JOIN 예제

사원이 어떤 부서에서 근무하는지를 검색하고, 부서를 아직 배정받지 못한 사원정보까지 함께 검색하시오

▶ 아래 두 쿼리의 결과는 동일하다.

SELECT e.eno, e.ename, d.dno, d.dname

FROM employee e LEFT OUTER JOIN department d

ON e.dno = d.dno;


SELECT e.eno, e.ename, d.dno, d.dname

FROM department d RIGHT OUTER JOIN employee e

ON e.dno = d.dno;


사원이 어떤 부서에서 근무하는지 검색하고, 부서를 아직 배정받지 못한 사원 및 사원이 아직 없는 부서정보도 함께 검색하시오.

SELECT e.eno, e.ename, d.dno, d.dname

FROM department d RIGHT OUTER JOIN employee e

ON e.dno = d.dno;




'Server > DBMS' 카테고리의 다른 글

[DBMS] HAVING 조건  (0) 2014.12.02
[DBMS] Group By  (0) 2014.12.02
[DBMS] NULL도 데이터이다  (0) 2014.12.02
[DBMS] 서브쿼리  (0) 2014.11.30
[DBMS] 집합연산자  (0) 2014.11.30

[DB] DB2 마이그레이션

http://cafe.naver.com/daousw/231

http://cafe.naver.com/daousw/523

'Recent Link' 카테고리의 다른 글

RSS란 무엇인가  (0) 2015.01.04
CentOS USB 설치하기  (0) 2014.12.13
[OS] Windows 7 업데이트 구성 실패  (0) 2014.11.29