개발/대덕인재개발원

대덕240913-자바: 메서드/DB:등위,NULL처리 함수

월은 2024. 9. 13. 17:47

 

<1~4교시 자바>

메서드 

package kr.or.ddit.study10;

/*
 	- 메서드 ==> 특정 기능을 수행하기 위한 명령어들(코드들)의 집합
 		- 특정 기능 수행 ==> 데이터를 입력받아 해당 데이터를 일련의 처리 과정으로 
 						 처리한 후 만들어진 결과값을 반환하는 것
 	- 메서드의 구조 또는 정의
 	  접근제한자 정적(static) 여부 반환값의 자료형 메서드 이름( 매개변수들...){
 	       처리할 내용들;
 	       ...
 	       
 	       return 반환값;
 	  }
 	  
 	  - 접근제한자 ==> public, protected, private, 생략하면(default)
 	  - 정적여부 ==> static 키워드가 있으면 '정적(static)메서드' 또는 '클래스메서드',
 	   							없으면 '인스턴스메서드'라고 한다.
      - 반환값의 자료형과 return명령에 사용된 반환값은 자료형이 서로 맞아야 한다.
      	반환값이 없을 때는 '반환값의 자료형'에 void'라고 한다.
      - 메서드이름 ==> 변수명 만드는 규칙과 같이 만든다. (보통 첫글자는 소문자로 한다.)
      - 매개변수들 ==> '자료형이름 변수명'과 같이 작성하는데 0개 이상 사용할 수 있다.
      
    - 메서드 사용 ==> 메서드를 호출하는 것을 말한다.
         - 메서드를 호출하면 제어가 해당 메서드 영역으로 들어가서 차례로 실행을 하고
         - 메서드의 처리가 모두 끝났거나 return 명령을 만나면 자기를 호출했던 곳으로
           되돌아감
         호출형식) 객체변수.메서드명(인수들...);
            ==> '인수들'은 메서드를 호출할 때 매개변수에 저장될 값들을 말한다.
       
    - static 메서드에서 다른 static 메서드를 호출할 때는 '객체변수'를 생략할 수 있다.
    - 인스턴스 메서드에서 다른 인스턴스 메서드를 호출할 때도 '객체변수'를 생략할 수 있다.
    - 인스턴스 메서드에서 다은 static 메서드를 호출할 때는 
    	'객체변수' 자리에 '객체변수' 또는 '클래스이름'을 사용해서 호출헤애 한다.        
                                         	   					
 */

public class MethodTest01 {

	public static void main(String[] args) {
		MethodTest01 test = new MethodTest01();

		// ---------------------------------------------
		// 정적 메서드에서 정적 메서드를 호출하는 방법
		MethodTest01.hi(); // 클래스 이름을 사용해서 호출(정적 메서드일 경우에만 가능)
		hi(); // 클래스 이름 또는 객체변수를 생략하여 호출
		test.hi(); // 객체변수를 이용하여 호출
		// ---------------------------------------------

		// 정적 메서드에서 인스턴스 메서드를 호출하는 방법
		String namee = "John von Neumann";
		test.hi2(namee); // 반드시 객체변수를 이용해서 출력해야 한다.

		test.hi2("하이");

		// ---------------------------
		test.methodCallTest();
	}

	// 메서드 호출 연습을 위한 메서드
	public void methodCallTest() {
		MethodTest01 ts = new MethodTest01();
		
		//-------------------------------
		//인스턴스 메서드에서 정적 메서드 호출하기
		MethodTest01.add(10, 20); //클래스 이름을 사용해서 호출(정적 메서드일 경우에만 가능)
		int k = 100, m = 200;
		add(k,m); 				 // 클래스 이름 또는 객체변수를 생략하여 호출
		ts.add(1000,m);			 // 객체변수를 이용해서 호출
		
		//-------------------------------
		// 인스턴스 메서드에서 인스턴스 메서드 호출하기
		// 반환값이 있을 경우에는 반환값을 받아서 변수에 저장할 수 있다
		int r = sub(100, 30);	// 객체변수를 생략하여 호출
		System.out.println("100 - 30 = " + r);
		
		int x = 200, y = 40;
		// 출력문에서 반환값이 있는 메서드를 호출하면 반환값이 바로 출력된다.
		System.out.println(x + " - " + y + " = " + sub(x,y));
		
	}
	
	// 정수형 데이터 2개를 받아서 뺄셈의 결과를 반환하는 인스턴스 메서드를 작성하시오.
	public int sub(int a, int b) {
		int result = a - b;
		
		return result;
	}
		

	// 정수형 데이터 2개를 받아서 두 값의 덧셈 결과를 출력하는 정적 메서드를 작성하시오.
	public static void add(int x, int y) {
		int result = x + y;
		System.out.println(x + " + " + y + " = " + result);
	}

	// 사람이름을 매개변수로 받아서 '~님 안녕하세요'를 출력하는 인스턴스 메서드를 호출하시오.
	public void hi2(String name) {
		System.out.println(name + "님 안녕하세요");
	}

	// '안녕하세요'라는 문자열을 출력하는 메서드를 작성하시오.
	public static void hi() {
		System.out.println("안녕하세요");
	}

}

 

 

어려워요 메서드...

 

<5~8교시 DB>

CASE 문 

CASE WHEN THEN  표현식)

-셀렉트 절에서만 사용

 

  - CASE WHEN THEN, DECODE
  - SELECT 절에서만 사용
  
  1) CASE WHEN THEN
  - 개발언어의 IF 또는 다중분기와 비슷한 기능을 제공(SWITCH와 유사)
  (사용형식 1)
    CASE expr WHEN 값1 THEN 명령1  --단일값
              WHEN 값2 THEN 명령2
                  :
              [ELSE 명령n]  --(SWITCH의 default와 유사)
    END   
    
    
(사용형식 2)
    CASE WHEN 조건식1 THEN 명령1  --범위, 조건
         WHEN 조건식2 THEN 명령2
                  :
              [ELSE 명령n]
    END

 

사용예) 상품테이블에서 매입가가 30만원 이상인 상품 중
        분류코드가 'P100'대는 '가전상품',
                'P200'대는 '의류상품'
                'P300'대는 '잡화상품'
                그 외는 '분류코드 오류'를 상품구분란에 출력하시오
  Alias는 상품명,분류코드,매입가격,상품구분
  
  SELECT PROD_NAME AS 상품명,
         LPROD_GU AS 분류코드,
         PROD_COST AS 매입가격,
         CASE SUBSTR(LPROD_GU,2,1) WHEN '1' THEN '가전상품'
                                   WHEN '2' THEN '의류상품'
                                   WHEN '3' THEN '잡화상품'
                                   ELSE '분류코드 오류'
         END AS 상품구분                                  
    FROM MJY.PROD
   WHERE PROD_COST>=100000;

 

NULL처리 함수 

 

2024-0913-01)NULL 처리함수
 - NULL처리 연산자
    . NULL값비교에 사용('='으로 NULL값을 비교할 수 없음)
    . IS NULL, IS NOT NULL
사용예) 상품테이블에서 상품의 색상이 NULL인 상품의 상품코드, 상품명, 색상을 조회하시오.
    SELECT PROD_ID AS 상품코드,
           PROD_NAME AS 상품명,
           PROD_COLOR AS 색상
      FROM MJY.PROD
     --WHERE PROD_COROR=NULL;  -- '='부호를 가지고 NULL값 비교는 불가하다
     WHERE PROD_COLOR IS NULL; -- 만약 IS NOT NULL 이라면 NULL이 아닌 나머지가 전부 표기됨

2. NVL(expr, value)
    . expr의 값이 NULL이면 value를 반환하고 NULL이 아니면 expr 자신을 반환
    . expr과 value는 같은 타입이거나 같은 타입으로 자동 형 변환 가능해야 함
    사용예)사원테이블에서 COMMISSION_PCT 컬럼을 조회하여 그 값이 NULL이면
          '영업실적없음'을 출력하시오.
    SELECT EMPLOYEE_ID AS 사원번호,
           EMP_NAME AS 사원명,
           COMMISSION_PCT AS 영업실적,
           NVL(TO_CHAR(COMMISSION_PCT),'영업실적없음') AS 비고  
           --TO_CHAR으로 COMMISSION_PCT를 문자열로 타입 맞추기     
      FROM HR.EMPLOYEES;

사용예) 사원테이블에서 영업실적코드에 따른 보너스를 계산하고 지급액을 조회하시오
       보너스 = 영업실적코드 * 급여 의 50%
       지급액 = 급여 +보너스. 단, 영업실적코드가 null 이면 0으로 계산할 것
       Alias는 사원번호,사원명,급여,영업실적코드,보너스,지급액
       
   SELECT EMPLOYEE_ID AS 사원번호,
          EMP_NAME AS 사원명,
          SALARY AS 급여,
          NVL(TO_CHAR(COMMISSION_PCT,'0.99'),LPAD('없음',5)) AS 영업실적코드,
          NVL(ROUND(COMMISSION_PCT*SALARY*0.5),0) AS 보너스,
          SALARY+ NVL(ROUND(COMMISSION_PCT*SALARY*0.5),0) AS 지급액
     FROM HR.EMPLOYEES;

 

사용예) 2020년 6월 모든 회원별 구매정보를 조회하시오      -- ~별:GROUP BY  모든:외부조인
       Alias는 회원번호,회원명,구매금액합계이며 구매정보가 없는 회원은 “구매없음'을 출력하시오 --총회원은 24, 6명만 구매했다고 해도 조인을 사용 나머지 18명까지 포함 
       
       SELECT B.MEM_ID AS 회원번호,
              B.MEM_NAME AS 회원명,
              NVL(SUM(A.CART_QTY*C.PROD_PRICE),0) AS 구매금액합계  --구매금액합계(3개 테이블의 조합)
         FROM MJY.CART A 
        RIGHT OUTER JOIN MJY.MEMBER B ON(A.MEM_ID=B.MEM_ID)
         LEFT OUTER JOIN MJY.PROD C ON(A.PROD_ID=C.PROD_ID AND 
              A.CART_NO LIKE '202006%')
        GROUP BY B.MEM_ID, B.MEM_NAME   
        ORDER BY 3 DESC;

사용예 전 선행사항) 
** 상품테이블에서 분류코드 'P301'에 속한 상품의 판매가를 매입가로 변경하시오.
  UPDATE MJY.PROD
       SET PROD_PRICE=PROD_COST
       WHERE UPPER (LPROD_GU)='P301';--대문자인지 소문자인지 헷갈린다면 'UPPER'사용하면 고민 끝!
      
      COMMIT;


사용예) 상품테이블에서 매입가와 매출가가 동일한 제품을 찾아 조회하되 비고난에 '단종예정상품'을
       동일하지 않으면 '정상판매상품'을 출력하시오.
       Alias는 상품코드,상품명,매입가,매출가,비고
  SELECT PROD_ID AS 상품코드,
         PROD_NAME AS 상품명,
         PROD_COST AS 매입가,
         PROD_PRICE AS 매출가,
         NVL2(NULLIF(PROD_COST,PROD_PRICE),'정상판매상품','단종예정상품')AS 비고
     FROM MJY.PROD;

 

 

 

등위함수 

2024-0913-02)등위함수
 - RANK() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
 - DENSE_RANK() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
 - ROW_NUMBER() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
 - SELECT절에서만 사용 가능
 - 그룹 내에서 등위 부여
   RANK() OVER(PARTITION BY 컬럼명[,컬럼명,...]
                   ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])

 

사용예) 사원테이블에서 급여순으로 등위를 부여하시오(급여가 많은 사원 -> 적은사원순)
    SELECT EMPLOYEE_ID AS 사원번호,
           EMP_NAME AS 사원명,
           SALARY AS 급여,
           
           RANK() OVER (ORDER BY SALARY DESC) AS "순위(RANK)",
           DENSE_RANK() OVER (ORDER BY SALARY DESC) AS "순위(DENSE_RANK)",
           ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS "순위(ROW_NUMBER)"
      FROM HR.EMPLOYEES;

사용예) 사원테이블의 부서로 그룹을 급여순으로 등위를 부여하시오
SELECT EMPLOYEE_ID AS 사원번호,
           EMP_NAME AS 사원명,
           DEPARTMENT_ID AS 부서번호,
           SALARY AS 급여,
           RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS "순위(RANK)"
          
      FROM HR.EMPLOYEES;

사용예) 사원테이블에서 근속기간이 긴 순으로 등위를 부여하시오

 SELECT EMPLOYEE_ID AS 사원번호,
           EMP_NAME AS 사원명,
           HIRE_DATE AS 입사일,
           SALARY AS 급여,
           RANK() OVER (ORDER BY HIRE_DATE) AS "순위(RANK)"
      FROM HR.EMPLOYEES;

사용예) 회원테이블에서 마일리지 순으로 등위를 부여하시오
    SELECT MEM_ID AS 회원번호,
           MEM_NAME AS 이름 ,
           MEM_MILEAGE AS 마일리지,
           RANK() OVER (ORDER BY MEM_MILEAGE DESC) AS "순위(RANK)"
      FROM MJY.MEMBER;

사용예) 회원테이블에서 연령별 마일리지 순으로 등위를 부여하시오

    SELECT MEM_ID AS 회원번호,
           MEM_NAME AS 이름 ,
           MEM_MILEAGE AS 마일리지,
           TRUNC(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM MEM_BIR), -1)||'대' AS 연령대,
           RANK() OVER (PARTITION BY TRUNC (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM MEM_BIR), -1)  ORDER BY MEM_MILEAGE DESC) AS 순위
      FROM MJY.MEMBER;