# Template Literal

 

기존의 큰따옴표나 작은따옴표로 감싸는 문자열과는 다르게 백틱(')으로 감싼다.

백틱( ` )은 문자 리터럴로 화면에 보이는대로 출력하고 작은따옴표( ' )는 문자를 코드로 인식한다.

1
2
3
4
5
6
7
8
9
var name = 'HELLO';
var letter = `aaaaaaaaaaaaaaaaaaaaaaaaa  ${name}
 
 
bbbbbbb         ccccccccccc
`;
 
 
console.log(letter);
cs

 

백틱(`)안의 문자열은 줄바꿈이나 스페이스바 입력까지 그대로 출력된다.

 

 

'JavaScript' 카테고리의 다른 글

JavaScript Template Literal  (0) 2019.12.02

 

매핑

색인 시 데이터가 어디에 어떻게 저장될지를 결정하는 설정이다.

데이터베이스의 스키마에 대응하는 개념이라고도 할 수 있고 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일이다.

엘라스틱서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동으로 생성된다.

이러한 자동 매핑방식이 편리해 보이지만 실수로 잘못된 타입이 지정될 경우 수정할 방법이 없기 때문에 주의해야한다.

 

아래에서 매핑 인덱스 생성과 필드 데이터 타입을 함께 알아보겠습니다.

 

필드 데이터 타입

# keyword, text 같은 문자열 데이터 타입

# date, long, double, integer, boolean, ip 같은 일반적인 데이터 타입

# 객체 또는 중첩문과 같은 JSON 계층의 특성의 데이터 타입

# geo_point, geo_shape 같은 특수한 데이터 타입

 

# Keyword

키워드 형태로 사용할 데이터에 적합한 데이터 타입.

검색 시 필터링되는 항목 , 정렬이 필요한 항목, 집계 해야하는 항목 에 많이 사용된다.

별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 특정 코드나 키워드 등 정형화된 컨텐츠에 주로 사용된다.

만약 elastic search 라는 문자열이 keyword 타입으로 설정되면 elastic이나 search라는 질의로는 절대 검색되지 않는다.

정확히 elastic search라고 질의해야함.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "multiMovieYn" : {
      "type" : "keyword"
    }
  }
}
cs

# Text

색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석한다.

Text 타입으로 데이터를 색인하면 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "movieComment" : {
      "type" : "text"
    }
  }
}
cs

# Array

영화 데이터에 subtitleLang 필드가 있고 해당 필드에는 개봉 영화의 언어 코드 데이터가 들어있다고 가정해보자.

언어의 값으로 영어(en)와 한국어(ko)라는 두 개의 데이터를 입력하고 싶을 경우 Array 데이터 타입을 사용해야 한다.

문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있다.

Array 타입에 저장되는 값은 모두 같은 타입으로만 구성해야 한다.

 

1
2
3
4
5
PUT movie_search/_doc/1
{
 "title" : "해리포터와 마법사의 돌",
 "subtitleLang" : ["ko", "en"]
}
cs

# Numeric 

색인과 검색을 효율적으로 처리하기위한 데이터의 크기에 알맞은 다양한 타입이 제공된다.

long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수. -2^63 ~ 2^63-1
integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수. -2^31 ~ 2^31-1
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수. -32768 ~ 32767
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수. -128 ~ 127
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

 

# Date

Date 타입은 JSON 포맷에서 문자열로 처리된다.

날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야한다.

별도의 형식을 지정하지 않을 경우 기본 형식인 “yyyy-MM-ddTHH:mm:ssZ”로 지정된다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
 "properties" : {
   "date" : {
     "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss"
   }
 }
}
cs

# Range 

범위가 있는 데이터를 저장할 때 사용하는 데이터 타입이다.

데이터의 시작과 끝만 지정한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "showRange" : {
      "type" : "date_range"
    }
  }
}
 
PUT movie_search/_doc/2
{
  "showRange" : {
    "gte" : "2001-01-01",
    "lte" : "2001-12-31"
  }
}
cs

 

# Boolean

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "check" : {
      "type" : "boolean"
    }
  }
}
cs

 

# Geo-Point 

위도, 경도 등 위치 정보를 담은 데이터를 저장할 때 사용할 수 있는 타입이다.

위치기반 데이터를 색인하고 검색하는 데 매우 유용하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "filmLocation" : {
      "type" : "geo_point"
    }
  }
}
 
PUT movie_search/_doc/3
{
  "title" : "해리포터와 마법사의 돌",
  "filmLocation" : {
    "lat" : 55.415555,
    "lon" : -1.3333
  }
}
cs

# IP

IP 주소와 같은 데이터를 저장하는 데 사용한다. IPv4IPv6를 모두 지정 가능.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "ipAddr" : {
      "type" : "ip"
    }
  }
}
 
PUT movie_search/_doc/4
{
  "ipAddr" : "127.0.0.1"
}
cs

# Object

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다.

문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.

이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 데이터 타입이라고 한다.

Object 데이터 타입을 정의할 때는 다른 데이터 타입과 같이 특정 키워드를 이용하지 않고 단지 필드값으로 다른 문서의 구조를 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies" : {
      "properties" : {
        "companyName" : {
          "type" : "text"
        }
      }
    }
  }
}
 
PUT movie_search/_doc/5
{
  "title" : "반지의 제왕",
  "companies" : {
    "companyName" : "워너브라더스"
  }
}
cs

# Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.

필드에 객체가 배열 형태로 저장 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#인덱스 생성
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies_nested" : {
      "type" : "nested"
    }
  }
}
 
#데이터 색인
PUT movie_search/_doc/8
{
  "title" : "해리포터와 마법사의 돌",
  "companies_nested" : [
    {
      "companyCd" : "1",
      "companyName" : "워너브라더스"
    },{
      "companyCd" : "2",
      "companyName" : "Hello films"
    }
    ]
}
#검색
POST movie_search/_search
{
  "query": {
    "nested": {
      "path": "companies_nested",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "companies_nested.companyName": "워너브라더스"}
              },
              {
                "match" : {
                  "companies_nested.companyCd" : "1"
                }
              }
          ]
        }
      }
    }
  }
}
cs

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p61~97

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 매핑, 필드 데이터 타입  (0) 2019.12.02
Elasticsearch 란?  (0) 2019.11.30

 

안녕들 하시죠!

이번시간에는 Elasticsearch에 대해 알아보겠습니다.

 

Elasticsearch

아파치 루씬을 기반으로 한 대표적인 검색엔진이다.

Java로 개발되었으며 역색인과 분산처리 등 기존 검색 기능의 한계를 극복하여 현재 다수의 기업에서 활용하려는 시도를 많이 하고있다.

 

검색 서비스 > 검색 시스템 > 검색 엔진

 

# 검색 엔진

광활한 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. (Elasticsearch)

 

 

# 검색 시스템  

대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭하는 용어이다.

수집기를 이용해 방대한 데이터를 수집하고 이를 다수의 검색엔진을 이용해 색인하고 검색 결과를 UI로 제공한다.

 

# 검색 서비스

검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다.

 

검색시스템의 구성요소

 

# 수집기

웹사이트, 블로그, 카페 등 웹에서 필요한 정보를 수집하는 프로그램이다.

 

# 스토리지

DB에서 데이터를 저장하는 물리적인 저장소.

검색엔진은 색인한 데이터를 스토리지에 보관한다.

 

# 색인기

검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집된 데이터를 검색 가능한 구조로 가공하고 저장해야한다. 그 역할을 하는 것이 색인기다.

색인기는 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

# 검색기

검색기는 사용자 질의를 입력받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다.

질의와 문서가 일치하는지는 유사도 기반의 검색 순위 알고리즘으로 판단한다.

검색기 또한 색인기와 마찬가지로 형태소 분석기를 사용해 사용자 질의에서 유의미한 용어를 추출해 검색한다.

따라서 사용하는 형태소 분석기에 따라 품질이 달라진다.

 

 

 

 

엘라스틱서치와 관계형 데이터베이스 비교
엘라스틱서치 관계형 데이터베이스
index database
shard partition
type table
document row
field column
mapping schema
Query DSL SQL

 

추가, 검색, 삭제, 수정 기능 비교

엘라스틱서치에서 사용하는 HTTP 메서드

기능 데이터베이스 질의 문법
GET 데이터 조회 SELECT
PUT 데이터 생성 INSERT
POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
DELETE 데이터 삭제 DELETE
HEAD 인덱스의 정보 확인 -
엘라스틱서치 장점

 

# 엘라스틱서치는 유연하다

역색인되는 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간과 검색 시간에 동일하게 지정한다면 해당하는 쿼리에 어떠한 문자열이 들어와도 검색이 가능해진다.

 

# 구조화되지 않은 비정형 데이터도 검색이 가능하다.

 

# 오픈소스 검색엔진

루씬 기반으로 개발된 오픈소스 검색엔진, 버그의 빠른 수정.

 

# 전문 검색 (Full Text) 검색이 가능하다.

내용 전체를 색인해서 특정 단어가 포함된 문서를 검색한다.

 

# 통계 분석

비정형 로그 데이터를 수집하고 한곳에 모아 통계분석이 가능하고 키바나를 통해 신시간으로 쌓이는 로그를 시각화하고 분석할 수 있다.

 

# 스키마리스

정형화되지 않은 다양한 형태의 문서도 자동으로 색인하고 검색할 수 있다.

 

# RESTful API

HTTP 기반의 RESTful API를 지원하기 떄문에 요청뿐 아니라 응답에도 JSON 형식을 사용해 플랫폼에 종속되지 않고 사용이 가능하다.

  

# 멀티테넌시

서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 개의 인덱스를 한번에 조회할 수 있다.

 

# Document-Oriented

여러 계층의 데이터를 JSON 형식의 구조화된 문서로 인덱스에 저장할 수 있다.

계층 구조로 문서도 한번의 쿼리로 쉽게 조회할 수 있다.

 

# 역색인

예를 들어 검색엔진이란 단어가 포함된 모든 문서를 찾아야 한다고 하자.

일반적으로는 처음부터 끝까지 모든 문서를 읽어야만 원하는 결과를 얻을 수 있다.

하지만 역색인 구조는 해당 단어만 찾으면 단어가 포함된 모든 문서의 위치를 알 수 있기 때문에 빠르게 찾을 수 있다.

 

# 확장성과 가용성

엘라스틱서치를 분산 구성해서 확장한다면 대량의 문서를 좀 더 효율적으로 처리할 수 있다.

분산환경에서 데이터는 샤드라는 작은 단위로 나뉘어 제공되며, 인덱스를 만들 때마다 샤드의 수를 조절할 수 있다.

이를 통해 데이터의 종류와 성격에 따라 데이터를 분산해서 빠르게 처리가 가능하다.

 

엘라스틱서치 단점

# 준 실시간

내부적으로 커밋과 플러시 같은 복잡한 과정 때문에 1초정도의 딜레이가 있다.

 

# 트랜잭션과 롤백 기능을 제공하지 않는다.

 

# 데이터의 업데이트를 제공하지 않는다.

데이터의 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 이용한다.

비용이 많이 들지만 => 불변적이라는 이점을 취할 수 있다.

 

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p1~10

 

오늘은 여기까지입니다 감사합니다.

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 매핑, 필드 데이터 타입  (0) 2019.12.02
Elasticsearch 란?  (0) 2019.11.30

안녕들 하시죠!

이번시간에는 Bootstrap 사용법에 대해 알아보겠습니다.

 

1. Bootstrap 라이브러리 다운

 

Bootstrap 공식 홈페이지에 가면 다운받을 수 있습니다.

http://bootstrapk.com/getting-started/

아래에 파일을 첨부했고, 저는 3.3.2 버전을 사용했습니다.

bootstrap-3.3.2-dist.zip
0.25MB
bootstrap-4.3.1-dist.zip
0.68MB

2. eclipse에 Bootstrap 라이브러리 폴더 만들기

 

WebContent 밑에 resources라는 폴더를 만들고 라이브러리를 압축 풀어 드래그해 넣었습니다.

3. Bootstrap 샘플 얻기

 

여러 사이트가 있지만 저는 https://www.bootdey.com/ 에서 샘플을 찾아보았습니다.

원하는 샘플을 찾아 클릭해 들어갑니다.

저는 개인프로필 샘플을 찾아들어갔습니다.

https://www.bootdey.com/snippets/view/gray-profile

 

 

4. HTML code 복사

 

원하는 .jsp나 .html 파일에 HTML code를 복사해 <body>태그 안에 붙여넣기 합니다.

 

5. CSS 파일 만들기

CSS code 부분 복사 -> 아까 만들어 둔 eclipse의 resources 폴더의 css 폴더에 .css 파일을 하나 만들기 -> 붙여넣기.

6. Bootstrap CDN 추가

 

HTML code를 복사 붙여넣기 했던 페이지에 CDN 코드 추가.

<link rel="stylesheet" href="resources/css/bootstrap.css">
<!-- CSS code를 복사해 붙여넣은 PersonInfo, 본인 파일명과 root를 작성해주세요 --!>
<link rel="stylesheet" href="resources/css/PersonInfo.css"> 
<script src="resources/js/bootstrap.js"></script>

7. 결과화면

 

 

오늘은 여기까지입니다.

궁금한점 있으시면 댓글이나 쪽지 부탁드려요 감사합니다.

안녕들 하시죠 !

이번시간에는 프로그래머스 Level2에 있는 '가장 큰 수' (정렬) 문제를 풀어보겠습니다.

 

문제

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예                                                      

numbers return
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330

 

코드설명

- 숫자를 String 형으로 변환

1
2
3
4
5
6
7
// 숫자를 String 문자형으로 바꾸기 위해 strNumbers 라는 String형 배열 준비.
String[] strNumbers = new String[numbers.length]; 
 
// String형 배열 strNumbers에 valueOf 메소드를 사용해 숫자를 문자로 바꿔 저장.  
for (int i = 0; i < numbers.length; i++) {
    strNumbers[i] = String.valueOf(numbers[i]);
cs

* valueOf() 메소드

인자에 들어있는 객체를 String 객체로 형 변환시켜주는 메소드.

1
2
3
4
String number = "1234567890"
String sNumbers = String.valueOf(number);
String tbool = String.valueOf(true);
String fbool = String.valueOf(false);
cs

 

- Arrays API를 사용해 정렬

1
2
3
4
5
6
7
8
9
// 컬렉션 프레임워크 Arrays 클래스의 sort 메소드사용.
// Comparator 메서드를 사용해 객체간의 특정한 정렬을 한다.
// compare() 메서드를 오버라이딩해서 숫자간 비교.
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
    return (o2 + o1).compareTo(o1 + o2);
    }
});
cs

 

- 예외 처리

1
2
3
4
// 맨 처음 문자가 0이면 0반환
if (strNumbers[0].equals("0")) {
    return "0";
}
cs

- 순차적으로 저장 후 return

1
2
3
4
5
6
// String strNumber에 순차적으로 저장해 answer로 return 
String answer = "";
for (String strNumber : strNumbers) {
    answer += strNumber;
}
return answer;
cs

 

 

전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.Arrays;
import java.util.Comparator;
 
public class Solution {
 
    public String solution(int[] numbers) {
        // 숫자를 String 문자형으로 바꾸기 위해 strNumbers 라는 String형 배열 준비.
        String[] strNumbers = new String[numbers.length];
 
        // String형 배열 strNumbers에 valueOf 메소드를 사용해 숫자를 문자로 바꿔 저장.
        for (int i = 0; i < numbers.length; i++) {
            strNumbers[i] = String.valueOf(numbers[i]);
        }
 
        // 컬렉션 프레임워크 Arrays 클래스의 sort 메소드사용.
        // Comparator 메서드를 사용해 객체간의 특정한 정렬을 한다.
        // compare() 메서드를 오버라이딩해서 숫자간 비교.
        Arrays.sort(strNumbers, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });
 
        // 맨 처음 문자가 0이면 0반환
        if (strNumbers[0].equals("0")) {
            return "0";
        }
 
        // String strNumber에 순차적으로 저장해 answer로 return
        String answer = "";
        for (String strNumber : strNumbers) {
            answer += strNumber;
        }
 
        return answer;
 
    }
 
    public static void main(String[] args) {
        Solution s = new Solution();
        int number[] = { 6102 };
        int number2[] = { 3303459 };
        System.out.println(s.solution(number));
        System.out.println(s.solution(number2));
    }
}
cs

 

오늘은 여기까지입니다 감사합니다.

'Java' 카테고리의 다른 글

Java) 가장 큰 수 ( 정렬 )  (0) 2019.10.02
Java의 Math 클래스  (0) 2019.05.17
Java의 문자열 분리 (StringTokenizer)  (0) 2019.05.16
Java의 == 연산자와 equals 메소드  (0) 2019.05.13
Java의 추상 클래스  (0) 2019.05.11
Java의 생성자  (0) 2019.04.29

안녕들 하시죠!

이번 시간에도 '사내 DB테이블'을 이용한 문제풀이를 통해 ORACLE SQL 쿼리문을 복습해보겠습니다.

 

언어 및 툴

ORACLE DATABASE, SQLDEVELOPER

 

테이블 생성 참고

2019/09/28 - [Database] - ORACLE SQL 쿼리 복습을 위한 '사내 DB테이블' 세팅

 

쿼리 실행 순서

5 SELECT 
1 FROM 
2 WHERE
3 GROUP BY
4 HAVING
6 ORDER BY

 

문제

1. 사원수가 3명 이상인 부서명과 인원수를 출력하시오. ( group by, having )

having절 -- group by로 묶은 값들에 조건을 추가한다 (=where)

SELECT [그룹으로 묶은 컬럼명]
     , [집계할 컬럼명]
FROM [테이블명]
GROUP BY [그룹으로 묶을 컬럼명]
HAVING [그룹으로 묶은 값에 조건 추가]

count 함수 -- 테이블 전체 행 검색 ( count(*) )

                   특정 컬럼의 숫자 검색 ( count(컬럼명) )

1
2
3
4
5
select job
     , count(*)
from emp
group by job
having count(*>= 3;
cs

 

2. 직무 중 가장 적게 수입을 가지는 직무의 평균 월급을 출력하시오.
1
2
3
select min(AVG(sal)) 
from emp 
group by job;
cs

 

3. 사원번호, 사원이름, 부서이름, 부서번호를 출력하시오. ( Join )

Oracle 내부조인 -- 테이블간에 동일한 컬럼을 조인

1
2
3
4
5
6
7
select emp.ename
     , emp.empno
     , dept.dname
     , dept.deptno
from emp
   , dept
where emp.deptno = dept.deptno;
cs

Natural 조인 -- 테이블간에 동일한 모든 컬럼을 조인 

1
2
3
4
5
select ename
     , empno
     , dname
     , deptno
from emp natural join dept;
cs

Join On -- 조인의 세부조건을 지정할 수 있다.

1
2
3
4
5
6
select ename
     , empno
     , dname
     , dept.deptno
from emp join dept
on emp.deptno = dept.deptno;
cs

Join Using -- 컬럼을 선택해서 조인.

1
2
3
4
5
6
select ename
     , empno
     , dname
     , deptno
from emp join dept
using (deptno);
cs

 

 

 

4. 부서가 30이고, 급여가 1500이상인 사원의 이름, 급여, 부서명, 부서번호를 출력하시오. ( Join on )
1
2
3
4
5
6
7
8
select emp.ename
     , emp.sal
     , dept.dname
     , dept.deptno
from emp join dept
on emp.deptno = dept.deptno
where emp.deptno = 30
and sal >= 1500;
cs

 

5. 사원수가 5명이 넘는 부서의 부서명과 사원수를 출력하시오.

 

1
2
3
4
5
6
7
8
select dept.dname
     , count(*)
from emp
   , dept
where emp.deptno = dept.deptno
group by emp.deptno
       , dept.dname
having count(*>= 5;
cs

 

6. ADAMS 사원이 근무하는 부서이름과 지역이름을 출력하시오.
1
2
3
4
5
6
7
select dept.dname
     , dept.loc
     , emp.ename
from emp
   , dept
where emp.deptno = dept.deptno
and emp.ename = 'ADAMS';
cs

 

7. NEW YORK 이나 DALLAS 지역에 근무하는 사원들의 사원번호, 사원이름을 사원번호 순으로 검색하시오.
1
2
3
4
5
6
7
select e.empno
     , e.ename
from emp e
   , dept d
where e.deptno = d.deptno
and (d.loc = 'NEWYORK' or d.loc='DALLAS')
order by e.empno;
cs

오늘은 여기까지입니다 감사합니다.

안녕들 하시죠!

저번시간부터 개인 홈페이지 프로젝트에 기능들을 하나 하나 추가해보고 있습니다.

저번 게시물에 dao, vo, servlet, service, exception 패키지를 추가하고 가겠습니다.

다음 게시물부터는 기능을 하나씩만 추가할 생각이라 글이 좀 짧아질 것 같습니다.

 

사용언어와 문법

Oracle database, HTML5, Javascript, JSP/Servlet, JQuery, EL, JSTL 등

 

MVC 패턴

 

DupchkServlet(중복체크), JoinServlet, LoginServlet -> CustomerService -> CustomerDAO

 

SearchZipServlet(우편번호찾기) -> ZipService -> ZipDAO

 

뒷단 구성에 사용될 클래스들

 

DupchkServlet(중복체크), JoinServlet, LoginServlet -> CustomerService -> CustomerDAO

DupchkServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package Servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import my.service.CustomerService;
 
 
@WebServlet("/dupchk")
public class DupchkServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private CustomerService service;
    
    public DupchkServlet() {
        service = new CustomerService();
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        
        // Service 단 연결
        CustomerService service = new CustomerService();
        String str;
        str = service.dupchk(id);
                        
        request.setAttribute("result", str);
        String path= "/result.jsp";
        RequestDispatcher rd = request.getRequestDispatcher(path);
        rd.forward(request, response);
        
    }
}
cs

JoinServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package Servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import my.service.CustomerService;
import my.vo.Customer;
 
@WebServlet("/join")
public class JoinServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private CustomerService service;
    
    public JoinServlet() {
        super();
        service = new CustomerService();
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        String pwd = request.getParameter("pwd");
        String name = request.getParameter("name");
        String buildingno = request.getParameter("buildingno");
        String addr = request.getParameter("zipcode"+ "/" + request.getParameter("addr1"+ "/" + request.getParameter("addr2");
        
        Customer c = new Customer();
        c.setId(id);
        c.setPwd(pwd);
        c.setName(name);
        c.setBuildingno(buildingno);
        c.setAddr(addr);
        
        String str = service.join(c);
        request.setAttribute("result",  str);
        
        String path = "/result.jsp";    
        RequestDispatcher rd = request.getRequestDispatcher(path);
        rd.forward(request, response);
        
    }
}
cs

LoginServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package Servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
 
import my.service.CustomerService;
 
@WebServlet("/login"// servlet url,로그인 요청을 하게 되면 가장 먼저 LoginServlet을 호출하게 된다.
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private CustomerService service;
    
    public LoginServlet() { // 생성자에서 service객체 자동 생성
        service = new CustomerService();
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
 
        String path = "/result.jsp";
        
        String id = request.getParameter("id");
        String pwd = request.getParameter("pwd");
        
        HttpSession session = request.getSession();
        session.removeAttribute("loginInfo");
        
        String str = service.login(id, pwd);
        /*--로그인성공시 HttpSession객체의 속성으로 추가 --*/
        JSONParser parser = new JSONParser();
        try {
            Object obj = parser.parse(str);
            JSONObject jsonObj = (JSONObject)obj;
            if((Long)jsonObj.get("status"== 1) {//로그인 성공!
                session.setAttribute("loginInfo", id);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        request.setAttribute("result", str);
        RequestDispatcher rd = request.getRequestDispatcher(path);            
        rd.forward(request, response);        
    }
}
cs

CustomerService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package my.service;
 
import java.sql.SQLException;
 
import org.json.simple.JSONObject;
 
import my.dao.CustomerDAO;
import my.exception.NotFoundException;
import my.vo.Customer;
 
public class CustomerService {
    private CustomerDAO dao;
 
    public CustomerService() {
        dao = new CustomerDAO();
    }
    
    public String login(String id, String pwd) { 
        int status = -1;
        
        try {
            Customer c = dao.selectById(id);
            if (c.getPwd().equals(pwd) && c.getStatus() == 1) {
                status = 1;    
            } 
            else if(c.getStatus() == 0){
                status = -1;     
            }
                 
        } catch (SQLException | NotFoundException e) {
            e.printStackTrace();
        }
        
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("status", status);
        jsonObj.put("id", id);
        String str = jsonObj.toString();
        return str;
    }
 
    public String join(Customer c) {
        int status = -1;
        try {
            status = dao.joinMember(c);
        } catch (NotFoundException e) {
            e.printStackTrace();
            status = -1;
        }
        String str = "{\"status\":\"" + status + "\"}";
        return str;
    }
 
    public String dupchk(String id) {
        int status = 1;
        try {
            dao.selectById(id);
            status = -1;
        } catch (SQLException | NotFoundException e) {
            e.printStackTrace();
            status = 1;
        }
        
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("status", status);
 
        String str = jsonObj.toString();
        return str;
    }
}    
cs

CustomerDAO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package my.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
 
import my.exception.NotFoundException;
import my.vo.Customer;
import my.dao.CustomerDAO;
 
public class CustomerDAO {
    // oracle db와의 연동
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
 
    String url = "jdbc:oracle:thin:@localhost:1521:xe";
    String user = "C##ora_user";
    String pw = "hong";
 
    public CustomerDAO() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    public void CloseDB() throws SQLException {
        if (rs != null)
            rs.close();
        if (pstmt != null)
            pstmt.close();
        if (con != null)
            con.close();
    }
 
    public Customer selectById(String id) throws SQLException, NotFoundException { // login, dupchk할때 SELECT문으로 DB에서 ID를 찾는다.
        Customer customer = new Customer();
        String SelectSQL = "Select * from customers where Customer_id=?";
 
        con = DriverManager.getConnection(url, user, pw);
        pstmt = con.prepareStatement(SelectSQL);
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
 
        String dbid = null;
        String dbpwd = null;
        String dbaddr = null;
        String dbname = null;
        String dbbuildingno = null;
        int customerStatus = 0;
 
        if (rs.next()) {
            dbid = rs.getString("customer_id");
            dbpwd = rs.getString("customer_pwd");
            customerStatus = rs.getInt("customer_status");
            dbaddr = rs.getString("CUSTOMER_ADDR");
            dbname = rs.getString("CUSTOMER_NAME");
            dbbuildingno = rs.getString("customer_buildingno");
 
            customer.setId(dbid);
            customer.setPwd(dbpwd);
            customer.setStatus(customerStatus);
            customer.setAddr(dbaddr);
            customer.setName(dbname);
            customer.setBuildingno(dbbuildingno);
 
        } else {
            throw new NotFoundException("아이디가 존재하지 않습니다 !");
        }
        CloseDB();
        return customer;
    }
 
    public int joinMember(Customer c) throws NotFoundException { // join 할때 DB에 INSERT문으로 삽입
 
        int status = -1;
        String query = "INSERT INTO CUSTOMERS(CUSTOMER_ID,CUSTOMER_STATUS,CUSTOMER_PWD,CUSTOMER_NAME,CUSTOMER_BUILDINGNO,CUSTOMER_ADDR) VALUES ( ?, ?, ?, ?, ?, ?)";
 
        try {
            con = DriverManager.getConnection(url, user, pw);
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, c.getId());
            pstmt.setInt(21);
            pstmt.setString(3, c.getPwd());
            pstmt.setString(4, c.getName());
            pstmt.setString(5, c.getBuildingno());
            pstmt.setString(6, c.getAddr());
            pstmt.executeUpdate();
            status = 1;
        } catch (SQLException e) {
            e.printStackTrace();
            status = -1;
        }
        try {
            CloseDB();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return status;
    }
}
cs

 

SearchZipServlet(우편번호찾기) -> ZipService -> ZipDAO

SearchZipServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Servlet;
 
import java.io.IOException;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import my.service.ZipService;
 
@WebServlet("/searchzip")
public class SearchZipServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    public SearchZipServlet() {
        super();
       
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String input = request.getParameter("doro");
        ZipService service = new ZipService();
        String str = service.searchZip(input);
        
        request.setAttribute("result", str);
        String path= "/result.jsp";
        RequestDispatcher rd = request.getRequestDispatcher(path);
        rd.forward(request, response);
    }
}
 
cs

ZipService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package my.service;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
 
import my.dao.ZipDAO;
 
public class ZipService {
    private ZipDAO zdao;
    public ZipService(){
        zdao = new ZipDAO() ;
    }
    
    public String searchZip(String doro) {
        List<Map<String,String>> addrlist = new ArrayList<Map<String,String>>();
        Map<StringString> addrmap;
        addrlist = zdao.selectByDoro(doro);
        
        JSONArray jsonArr = new JSONArray();
        
        for(int i = 0 ; i < addrlist.size(); i++) {
            addrmap = addrlist.get(i);
            JSONObject obj = new JSONObject();
            obj.put("zipcode", addrmap.get("zipcode"));
            obj.put("doroaddr", addrmap.get("doroaddr"));
            obj.put("buildingaddr", addrmap.get("buildingaddr"));
            obj.put("buildingno", addrmap.get("buildingno"));
                
            jsonArr.add(obj);
        }
        return jsonArr.toString();
    }
}
cs

ZipDAO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package my.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ZipDAO {
    String url = "jdbc:oracle:thin:@localhost:1521:xe";
    String user = "C##ora_user";
    String pw = "hong";
 
    public List<Map<StringString>> selectByDoro(String doro){
        
        List<Map<String,String>> addrlist = new ArrayList<Map<String,String>>();
        Connection conn = null;    
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String doroname  = "SELECT zipcode,  \r\n" + 
                "sido||' ' \r\n" + 
                "|| sigungu ||NVL2(sigungu,' ', '')\r\n" + 
                "|| eupmyun ||NVL2(eupmyun,' ', '')\r\n" + 
                "|| doro ||' ' \r\n" + 
                "|| building1\r\n" + 
                "|| DECODE(building2,'0', '', '-'||building2) ||' ' \r\n" + 
                "|| '('|| dong || ri || DECODE(building, '', '', ',' ||building) ||')'" + 
                ","+
                "sido ||' ' \r\n" + 
                "|| sigungu ||NVL2(sigungu,' ', '')\r\n" + 
                "|| eupmyun ||NVL2(eupmyun,' ', '')\r\n" + 
                "|| dong || ri ||' ' ||  zibun1 || DECODE(zibun2, '0', '',  '-'|| zibun2)    || DECODE(building, '', '', ' (' ||building ||')') " +
                ","+
                "buildingno \r\n" +
                "FROM post\r\n" + 
                "WHERE (doro || ' ' || building1 || DECODE(building2,'0', '', '-'||building2)) LIKE ?";
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
            conn = DriverManager.getConnection(url,    user, pw);
            pstmt =  conn.prepareStatement(doroname);
            pstmt.setString(1"%" + doro + "%");
            rs = pstmt.executeQuery();
            
            String zipcode ="";
            String doroaddr="";
            String buildingaddr="";
            String buildingno="";
        
            while(rs.next()) {
                zipcode = rs.getString(1);
                doroaddr = rs.getString(2);
                buildingaddr = rs.getString(3);
                buildingno = rs.getString(4);
                
                Map<StringString> resultMap = new HashMap<StringString>();
                resultMap.put("zipcode", zipcode);
                resultMap.put("doroaddr", doroaddr);
                resultMap.put("buildingaddr", buildingaddr);
                resultMap.put("buildingno", buildingno);
                addrlist.add(resultMap);
            }
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(rs != null) {
                try {
                    rs.close();
                }
                catch (SQLException e) {}
            }
            if(pstmt != null) {
                try {
                    pstmt.close();
                }
                catch (SQLException e) {}
            }
            if(conn != null) {
                try {
                    conn.close();
                }
            catch (SQLException e) {}
            }
        }
        return addrlist;
    }
}
cs

 

 

 

NotFoundException, vo (Customer, Post)

NotFoundException

1
2
3
4
5
6
7
8
9
10
11
12
13
package my.exception;
 
public class NotFoundException extends Exception{
 
    // 예외 전송용 에러 클래스
    public NotFoundException() {
        super();
    }
 
    public NotFoundException(String message) {
        super(message);
    }
}
cs

Customer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package my.vo;
 
public class Customer {
    // 고객에 대한 정보가 담겨있다
    // 오라클의 customer table의 한행의 자료를 표현하기위해 
    // JVM에서 일할 클래스를 만든다
    private String id;
    private String pwd;
    private String name;
    private String buildingno;
    // 객체와 객체사이에서도 관계를 맺을 필요가 있다
    // 현재 customer table과  post table 과 일대다 관계이므로 이를 표현할 필요가 있다
    // 다시 말해 테이블간의 관계가 있다면 클래스간의 관계로 표현해줘야 한다
    private Post post;
    // has a 관계
    private String addr;
    // is a 관계
    private int status;
    // 기본생성자
    public Customer() {
        super();
    }
    
    // 모든 인스턴스 변수 초기화 생성자
    public Customer(String id, String pwd, String name, String buildingno, Post post, String addr, int status) {
        super();
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.buildingno = buildingno;
        this.post = post;
        this.addr = addr;
        this.status = status;
    }
    
    // Setter & Getter
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBuildingno() {
        return buildingno;
    }
    public void setBuildingno(String buildingno) {
        this.buildingno = buildingno;
    }
    public Post getPost() {
        return post;
    }
    public void setPost(Post post) {
        this.post = post;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
}
cs

Post

package my.vo;

public class Post {
	// Post 테이블의 자료를 JVM 자료로 만든다
	private String zipcode;
	private String sido;
	private String sidoe;
	private String sigungu;
	private String sigungue;
	private String eupmyun;
	private String eupmyune;
	private String dorocode;
	private String doro;
	private String doroe;
	private String jiha;
	private String building1;
	private String building2;
	private String buildingno;
	private String daryang;
	private String building;
	private String dongcode;
	private String dong;
	private String ri;
	private String dongadmin;
	private String san;
	private String zibun1;
	private String zibunserial;
	private String zibun2;
	private String zipoldcode;
	private String zipcodeserial;

	// 기본 생성자
	public Post() {
		super();
	}

	// 모든 매개변수 생성자
	public Post(String zipcode, String sido, String sidoe, String sigungu, String sigungue, String eupmyun,
			String eupmyune, String dorocode, String doro, String doroe, String jiha, String building1,
			String building2, String buildingno, String daryang, String building, String dongcode, String dong,
			String ri, String dongadmin, String san, String zibun1, String zibunserial, String zibun2,
			String zipoldcode, String zipcodeserial) {
		super();
		this.zipcode = zipcode;
		this.sido = sido;
		this.sidoe = sidoe;
		this.sigungu = sigungu;
		this.sigungue = sigungue;
		this.eupmyun = eupmyun;
		this.eupmyune = eupmyune;
		this.dorocode = dorocode;
		this.doro = doro;
		this.doroe = doroe;
		this.jiha = jiha;
		this.building1 = building1;
		this.building2 = building2;
		this.buildingno = buildingno;
		this.daryang = daryang;
		this.building = building;
		this.dongcode = dongcode;
		this.dong = dong;
		this.ri = ri;
		this.dongadmin = dongadmin;
		this.san = san;
		this.zibun1 = zibun1;
		this.zibunserial = zibunserial;
		this.zibun2 = zibun2;
		this.zipoldcode = zipoldcode;
		this.zipcodeserial = zipcodeserial;
	}

	// Setter & Getter
	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getSido() {
		return sido;
	}

	public void setSido(String sido) {
		this.sido = sido;
	}

	public String getSidoe() {
		return sidoe;
	}

	public void setSidoe(String sidoe) {
		this.sidoe = sidoe;
	}

	public String getSigungu() {
		return sigungu;
	}

	public void setSigungu(String sigungu) {
		this.sigungu = sigungu;
	}

	public String getSigungue() {
		return sigungue;
	}

	public void setSigungue(String sigungue) {
		this.sigungue = sigungue;
	}

	public String getEupmyun() {
		return eupmyun;
	}

	public void setEupmyun(String eupmyun) {
		this.eupmyun = eupmyun;
	}

	public String getEupmyune() {
		return eupmyune;
	}

	public void setEupmyune(String eupmyune) {
		this.eupmyune = eupmyune;
	}

	public String getDorocode() {
		return dorocode;
	}

	public void setDorocode(String dorocode) {
		this.dorocode = dorocode;
	}

	public String getDoro() {
		return doro;
	}

	public void setDoro(String doro) {
		this.doro = doro;
	}

	public String getDoroe() {
		return doroe;
	}

	public void setDoroe(String doroe) {
		this.doroe = doroe;
	}

	public String getJiha() {
		return jiha;
	}

	public void setJiha(String jiha) {
		this.jiha = jiha;
	}

	public String getBuilding1() {
		return building1;
	}

	public void setBuilding1(String building1) {
		this.building1 = building1;
	}

	public String getBuilding2() {
		return building2;
	}

	public void setBuilding2(String building2) {
		this.building2 = building2;
	}

	public String getBuildingno() {
		return buildingno;
	}

	public void setBuildingno(String buildingno) {
		this.buildingno = buildingno;
	}

	public String getDaryang() {
		return daryang;
	}

	public void setDaryang(String daryang) {
		this.daryang = daryang;
	}

	public String getBuilding() {
		return building;
	}

	public void setBuilding(String building) {
		this.building = building;
	}

	public String getDongcode() {
		return dongcode;
	}

	public void setDongcode(String dongcode) {
		this.dongcode = dongcode;
	}

	public String getDong() {
		return dong;
	}

	public void setDong(String dong) {
		this.dong = dong;
	}

	public String getRi() {
		return ri;
	}

	public void setRi(String ri) {
		this.ri = ri;
	}

	public String getDongadmin() {
		return dongadmin;
	}

	public void setDongadmin(String dongadmin) {
		this.dongadmin = dongadmin;
	}

	public String getSan() {
		return san;
	}

	public void setSan(String san) {
		this.san = san;
	}

	public String getZibun1() {
		return zibun1;
	}

	public void setZibun1(String zibun1) {
		this.zibun1 = zibun1;
	}

	public String getZibunserial() {
		return zibunserial;
	}

	public void setZibunserial(String zibunserial) {
		this.zibunserial = zibunserial;
	}

	public String getZibun2() {
		return zibun2;
	}

	public void setZibun2(String zibun2) {
		this.zibun2 = zibun2;
	}

	public String getZipoldcode() {
		return zipoldcode;
	}

	public void setZipoldcode(String zipoldcode) {
		this.zipoldcode = zipoldcode;
	}

	public String getZipcodeserial() {
		return zipcodeserial;
	}

	public void setZipcodeserial(String zipcodeserial) {
		this.zipcodeserial = zipcodeserial;
	}
}

 

HomeEx1.war
4.10MB

 

오늘은 여기까지입니다 감사합니다 !

 

안녕들 하시죠!

이번 시간에도 '사내 DB테이블'을 이용한 문제풀이를 통해 ORACLE SQL 쿼리문을 복습해보겠습니다.

 

언어 및 툴

ORACLE DATABASE, SQLDEVELOPER

 

테이블 생성 참고

2019/09/28 - [Database] - ORACLE SQL 쿼리 복습을 위한 '사내 DB테이블' 세팅

 

쿼리 실행 순서

5 SELECT 
1 FROM 
2 WHERE
3 GROUP BY
4 HAVING
6 ORDER BY

 

문제

1. 직책이 SALESMAN, ANALYST인 사람의 모든 정보를 출력하시오. ( or, like, in, any, some )
1
2
3
4
select *
from emp
where job = 'SALESMAN' 
or job = 'ANALYST';
cs
 
1
2
3
4
select *
from emp
where job like 'S%' 
or job like 'A%';
cs

 

1
2
3
4
5
6
7
8
9
10
11
select *
from emp
where job in ('SALESMAN''ANALYST');
 
select *
from emp
where job = any ('SALESMAN''ANALYST');
 
select *
from emp
where job = some ('SALESMAN''ANALYST');
cs

 

2. 1981년 5월 1일 ~ 1982년 2월 사이에 입사한 사원들의 모든 정보를 부서번호순(오름차순)으로 검색하시오. ( TO_DATE )
1
2
3
4
5
select *
from emp
where hiredate >= TO_DATE('19810501''yyyymmdd'
and hiredate < TO_DATE('19820228''yyyymmdd')
order by deptno;
cs

 

3. 1981년에 입사한 사원의 이름과 사원번호를 출력하는데 사원번호가 내림차순으로 정렬하시오. ( TO_CHAR )
1
2
3
4
5
6
select ename
     , empno
from emp
where hiredate >= '19810101'
and hiredate <= '19811231'
order by empno desc;
cs
1
2
3
4
5
select ename
     , empno
from emp
where to_char(hiredate,'YYYY'= '1981'
order by empno desc;
cs

 

4. 직급이 SALESMAN 일 경우 급여 * 1.1, CLERK 일 경우 급여 * 1.3, MANAGER 일 경우 급여 * 1.5 를 하고 모든 정보를 출력하시오. ( DECODE )

DECODE 함수 = ( IF-ELSE )

ex) DECODE(컬럼, 조건1, 결과1, 조건2, 결과2....)

1
2
3
4
5
6
7
select empno
     , job
     , ename
     , sal
     , decode(job, 'SALESMAN', sal*1.1'CLERK', sal*1.3'MANAGER', sal*1.5, sal) as 인상된급여 
from emp;
 
cs

 

 

 

 

 

 

 

5. 모든 사원들에게 커미션을 200씩 추가하여 사원이름, 커미션 값을 출력하시오. ( nvl )

NVL 함수 = 값이 NULL인 경우 지정값을 출력한다. NVL("값", "지정값")

NVL2 함수 = 값이 NULL이 아닌 경우 지정값1을 출력하고 NULL인 경우 지정값2를 출력한다. NVL2("값", "지정값1", "지정값2")

1
2
3
select ename
     , nvl(comm,0+ 200 
from emp;
cs

 

6.  커미션을 가지고 있는 사원은 Y, 커미션이 NULL값인 사원은 N을 포함하여 사원이름과 커미션 값을 출력하시오.( nvl2 )
1
2
3
select ename
     , nvl2(comm, 'Y''N'
from emp;
cs

 

7. 1981년 입사자들의 평균 임금을 출력하시오.
1
2
3
select AVG(sal)
from emp
where TO_CHAR(hiredate,'YYYY'= '1981';
cs

 

8. 사원번호, 사원이름, 총 급여(SAL+COMM)을 출력하시오. 
1
2
3
4
select empno
     , ename
     , sal+nvl(comm,0)
from emp;
cs

 

9. SALESMAN 의 커미션 평균을 출력하시오. ( group by )

 

GROUP BY 함수 = 특정 컬럼을 기준으로 집계를 내는데에 사용한다.

SELECT [그룹으로 묶은 컬럼명]
     , [집계할 컬럼명]
FROM [테이블명]
GROUP BY [그룹으로 묶을 컬럼명]
1
2
3
4
5
select job
     , AVG(nvl(comm,0))
from emp
where job='SALESMAN'
group by job;
cs

 

오늘은 여기까지입니다 감사합니다 !

+ Recent posts