Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-03-07(월) 027일차 [Oracle] DAO(Data Acess Object), DESC, DISTINCT, DUAL, ROWNUM, IS NULL, IS NOT NULL, NVL(), LIKE 연산자 %, _ 검색, 날짜 데이터 조회

옌炎 2022. 5. 10. 22:07
728x90

수업내용


1교시 (09:30-10:20)

  • 지난 시간 복습
  • 웹 어플리케이션
    1. 컴퓨터
        localhost 127.0.0.1
        ip : 고정, 수동
        컴퓨터 이름 : NET BIOS NAME
    2. 3-Tier
        프리젠테이션 레이어
        비즈니스 레이어
        데이터베이스 레이어
    3. 스키마 (테이블, 로우, 컬럼, 피케이, 포린키, 널)
        SELECT 하면 컬럼단위로 로우로 조회해준다.
    4. 질의문 작성하는 규칙

2교시 (10:30-11:20)

  • Oracle 연결 설명

3교시 (11:30-12:20)

  • EmpVO
package a.b.c.oracle.vo;

public class EmpVO {
	
	/*
	사원번호		EMPNO		NUMBER
	사원이름		ENAME		VARCHAR2
	사원직책		JOB			VARCHAR2
	상관사원번호	MGR			VARCHAR2
	입사일		HIREDATE	DATE
	급여			SAL			NUMBER
	수당			COMM		NUMBER
	부서번호		DEPTNO		NUMBER
	*/
	
	// 컬럼명 --> 변수명 : 소문자
	// 데이터타입 NUMBER, VARCHAR2, DATE -> 전부 다 문자열로 한다. String
	
	// empno : 멤버 변수, 스트링, 인포메이션 하이딩
	private String empno;
	private String ename;
	private String job;
	private String mgr;
	private String hiredate;
	private String sal;
	private String comm;
	private String deptno;
	
	// constructor
	public EmpVO() {
		
	}
	
	public EmpVO(	String empno, String ename, 
					String job, String mgr, 
					String hiredate, String sal, 
					String comm, String deptno) {
		this.empno = empno;
		this.ename = ename;
		this.job = job;
		this.mgr = mgr;
		this.hiredate = hiredate;
		this.sal = sal;
		this.comm = comm;
		this.deptno = deptno;
	}
	
	// getter
	public String getEmpno() {
		return empno;
	}
	public String getEname() {
		return ename;
	}
	public String getJob() {
		return job;
	}
	public String getMgr() {
		return mgr;
	}
	public String getHiredate() {
		return hiredate;
	}
	public String getSal() {
		return sal;
	}
	public String getComm() {
		return comm;
	}
	public String getDeptno() {
		return deptno;
	}
	
	// setter
	public void setEmpno(String empno) {
		this.empno = empno;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public void setMgr(String mgr) {
		this.mgr = mgr;
	}
	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}
	public void setSal(String sal) {
		this.sal = sal;
	}
	public void setComm(String comm) {
		this.comm = comm;
	}
	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}
}
  • OracleTest_2
package a.b.c.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import a.b.c.oracle.vo.EmpVO;

public class OracleTest_2 {

	// DataSource 정보 : 데이터베이스 연결 정보
	public static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:orclKSY00";
	public static final String JDBC_USER = "scott";
	public static final String JDBC_PASSWORD = "tiger";
	
	// sql Query
	public static String sqlQuery = "SELECT EMPNO AS EA_1, ENAME EA_2, JOB EA_3, MGR EA_4 FROM EMP ORDER BY 1 DESC";
//	public static String sqlQuery = "SELECT EMPNO, ENAME, JOB, MGR FROM EMP ORDER BY 1 DESC";
	
	// 생성자
	public OracleTest_2() {
		
		try {
			Class.forName(JDBC_DRIVER);
		} catch (Exception e) {
			System.out.println("JDBC 드라이버를 찾지 못했어요 >>> : " + e.getMessage());
		}
	}
	
	public ArrayList<EmpVO> empSelect() {
		
		ArrayList<EmpVO> aList = null;
		
		try {
			
			Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
			Statement stmt = conn.createStatement();
			ResultSet rsRs = stmt.executeQuery(sqlQuery);
			
			if (rsRs != null) {
				aList = new ArrayList<EmpVO>();
				
				while (rsRs.next()) {
					
					EmpVO evo = new EmpVO();
					
					evo.setEmpno(rsRs.getNString("EMPNO"));
					evo.setEname(rsRs.getNString("ENAME"));
					evo.setJob(rsRs.getNString("JOB"));
					evo.setMgr(rsRs.getNString("MGR"));
					
					aList.add(evo);
				}
			}
		} catch (Exception e) {
			System.out.println(e);
		}
		
		return aList;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		OracleTest_2 ot2 = new OracleTest_2();
		
		ArrayList<EmpVO> aList = ot2.empSelect();
		
		if (aList != null && aList.size() > 0) {
			
			for (int i=0; i < aList.size(); i++) {
				EmpVO _evo = aList.get(i);
				System.out.print(_evo.getEmpno() + " : ");
				System.out.print(_evo.getEname() + " : ");
				System.out.print(_evo.getJob() + " : ");
				System.out.println(_evo.getMgr());
			}
		}
	}
}

4교시 (12:30-13:20)

  • 요청사항
    • DEPT 테이블 조회하기 JDBC 연동하기
      DeptTest 자바에서 deptSelect() 함수를 사용해서
      Dept 테이블에 있는 컬럼 전체를 조회해서 main 함수에서 콘솔에 출력하시오
      단, DeptVO 클래스를 사용하기

      DeptTest.java
          public ArrayList<DeptVO> deptSelect();
      DeptVO.java

      작업해보기
      ------------

      A. 데이터베이스 단 처리
      ------------------------
      1. 테이블 정의서 또는 ERD를 찾아서 DEPT 테이블 내역을 조사한다.
      2. 테이블에서 조회할 컬럼을 찾는다.
      3. sqlplus에서 해당 테이블을 쿼리문으로 만들어서 조회해 본다.
          전체 건수 확인하기
              SELECT COUNT(*) FROM DEPT;
          전체 건수가 많으면 ROWNUM으로 몇 건만 조회해서
          테이블의 컬럼 명과 데이터의 포맷을 확인한다.
              SELECT * FROM DEPT WHERE ROWNUM <= 3;
            SELECT * FROM DEPT;

      SELECT
              A.DEPTNO AS DEPTNO -- 부서번호
             ,A.DNAME AS DNAME -- 부서 이름
             ,A.LOC AS LOC -- 지역
      FROM DEPT A;

      B. 비즈니스 단 처리
      ------------------------
      패키지 구성
      클래스 구성
      함수 구성
      변수 구성
      a.b.c.oracle.DeptTest
          public ArraList<DeptVO> deptSelect();

      부서 번호 DEPTNO NUMBER
      부서 이름 DNAME VARCHAR2
      지역 LOC VARCHAR2
      a.b.c.oracle.vo.DeptVO
          private String deptno;
          private String dname;
          private String loc;

      1. VO 클래스 만들기 : 테이블 정의서 이용
      2. DeptTest 클래스 만들기

5교시 (14:30-15:20)

  • DeptVO
package a.b.c.oracle.vo;

public class DeptVO {
	
	private String deptno;
	private String dname;
	private String loc;
	
	// constructor
	public DeptVO() {

	}

	public DeptVO(String deptno, String dname, String loc) {
		super();
		this.deptno = deptno;
		this.dname = dname;
		this.loc = loc;
	}

	// getter
	public String getDeptno() {
		return deptno;
	}

	public String getDname() {
		return dname;
	}

	public String getLoc() {
		return loc;
	}

	// setter
	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}
}
  • DeptTest
package a.b.c.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import a.b.c.oracle.vo.DeptVO;

public class DeptTest {

	// DataSource 정보 : 데이터베이스 연결 정보
	public static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:orclKSY00";
	public static final String JDBC_USER = "scott";
	public static final String JDBC_PASSWORD = "tiger";
		
	// sql Query 
	public static String sqlQuery = "SELECT DEPTNO, DNAME, LOC FROM DEPT";	
		
	// 생성자 
	public DeptTest() {

		try {
			Class.forName(JDBC_DRIVER);
		} catch (Exception e) {
			System.out.println("JDBC 드라이버를 찾지 못했어요 >>> : " + e.getMessage());
		}
	}
	
	// deptSelect() 함수
	public ArrayList<DeptVO> deptSelect() {
		
		ArrayList<DeptVO> aList = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rsRs = null;
		
		try {
			
			// 커넥션 연결
			conn = DriverManager.getConnection(DeptTest.JDBC_URL,
											   DeptTest.JDBC_USER,
											   DeptTest.JDBC_PASSWORD);
			
			// 쿼리문전달통로 만들기
			stmt = conn.createStatement();
			
			// 쿼리문 전달 및 질의결과 받아오기
			rsRs = stmt.executeQuery(DeptTest.sqlQuery);
			
			// 데이터 베이스에 받아온 질의결과 DeptVO와 ArrayList에 넣기
			
			// 데이터가 있으면 수행하기
			if (rsRs != null) {
				//DeptVO 클래스 담은 배열객체 ArrayList를 인스턴스한다.
				aList = new ArrayList<DeptVO>();
				
				// rsRs에서 데이터 추출해서 DeptVO에 넣고 ArrayList에 담기
				// 1. while 구문으로 next() 함수 리절트셋에서 레코드 추출하기
				while (rsRs.next()) {
					// DeptVO 클래스 선언 및 인스턴스 : 데이터베이스에서 가져온 데이터 담기 위해서
					DeptVO dvo = new DeptVO();
					dvo.setDeptno(rsRs.getNString(1));
					dvo.setDname(rsRs.getNString(2));
					dvo.setLoc(rsRs.getNString(3));
					
					// ArrayList에 DeptVO 클래스 담기
					aList.add(dvo);
				}
			} else {
				System.out.println("데이터베이스에서 가져온 데이터가 없습니다. >>> : ");
			}
		} catch (Exception e) {
			System.out.println("에러가 >>> : " + e.getMessage());
		}
		
		return aList;
	}
		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DeptTest dt = new DeptTest();
		
		ArrayList<DeptVO> aList = dt.deptSelect();
		
		if (aList != null && aList.size() > 0) {
			System.out.println("몇 건인가 >>> : " + aList.size());
			
			for (int i=0; i < aList.size(); i++) {
				DeptVO _dvo = aList.get(i);
				System.out.print(_dvo.getDeptno() + " : ");
				System.out.print(_dvo.getDname() + " : ");
				System.out.println(_dvo.getLoc());
			}
		}
	}
}

6교시 (15:30-16:20)

  • DESC, DISTINCT
-- DESC: DESCRIBE : 테이블의 구조 확인
-- 테이블 컬럼명, NULL 여부, 데이터 타입 & 사이즈
DESC DEPT;
DESC EMP;
DESC TAB;

-- DISTINCT : 중복 제거하는 키워드
SELECT DEPTNO FROM EMP;
SELECT DISTINCT DEPTNO FROM EMP;

SELECT DEPTNO FROM EMP WHERE DEPTNO = 10;
SELECT COUNT(DEPTNO) FROM EMP WHERE DEPTNO = 10;
SELECT DEPTNO FROM EMP WHERE DEPTNO = 20;
SELECT COUNT(DEPTNO) FROM EMP WHERE DEPTNO = 20;
SELECT DEPTNO FROM EMP WHERE DEPTNO = 30;
SELECT COUNT(DEPTNO) FROM EMP WHERE DEPTNO = 30;

-- EMP 테이블에서 사원번호를 전체 조회하시오
DESC EMP;

-- SELECT * FROM EMP WHERE JOB = SALESMAN;
-- SELECT * FROM EMP WHERE JOB = "SALESMAN";
SELECT * FROM EMP WHERE JOB = 'SALESMAN';

-- 7521 SALESMAN 이름은?
SELECT ENAME FROM EMP WHERE JOB = 'SALESMAN' AND EMPNO = 7521;
SELECT ENAME FROM EMP WHERE JOB = 'SALESMAN' AND EMPNO = '7521';

-- 30 부서 사원 번호가 7499인 사원의 직책?
SELECT JOB FROM EMP WHERE DEPTNO = 30 AND EMPNO = 7499;
SELECT JOB FROM EMP WHERE DEPTNO = 30 AND EMPNO = '7499';

-- 스미스 사원의 사원 번호, 직책, 입사일을 조회하시오
-- SELECT * FROM EMP WHERE ENAME = smith;
-- SELECT * FROM EMP WHERE ENAME = 'smith';
SELECT EMPNO, JOB, HIREDATE FROM EMP WHERE ENAME = UPPER('smith');
SELECT * FROM EMP WHERE ENAME = 'SMITH';
-- SELECT * FROM EMP WHERE ENAME = LOWER('SMITH');
SELECT EMPNO, JOB, TO_CHAR(HIREDATE, 'YYYY-MM-DD') FROM EMP WHERE ENAME = UPPER('smith'); 
SELECT EMPNO, JOB, TO_CHAR(HIREDATE, 'YYYY-MM-DD') AS HIREDATE FROM EMP WHERE ENAME = UPPER('smith'); 

-- 부서번호 20번 사원들의 입사일을 조회하시오. 입사일 형식은 YYYY.MM.DD
SELECT * FROM EMP WHERE DEPTNO = 20;
SELECT HIREDATE FROM EMP WHERE DEPTNO = 20;
SELECT TO_CHAR(HIREDATE, 'YYYY.MM.DD') FROM EMP WHERE DEPTNO = 20;

7교시 (16:30-17:20)

  • DUAL, ROWNUM, IS NULL, IS NOT NULL, NVL()
-- 오라클에서만 제공하는 DUMMY TABLE : DUAL
DESC DUAL;

SELECT * FROM DUAL;
SELECT 1 FROM DUAL;
SELECT 1 + 2 FROM DUAL;

-- TO_DATE : 날짜 형식으로 바꾸는 함수
-- TO_CHAR : 날짜 형식을 바꾸는 함수
SELECT TO_CHAR(TO_DATE('80/12/17'), 'YYYY.MM.DD') FROM DUAL;
-- SYSDATE 오늘 날짜를 추출하는 키워드
SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY.MM.DD') FROM DUAL;

SELECT UPPER('smith') FROM DUAL;
SELECT LOWER('SMITH') FROM DUAL;

SELECT 3 * 4 FROM DUAL;
SELECT 3 / 4 FROM DUAL;
SELECT 3 - 4 FROM DUAL;
SELECT 3 + 4 FROM DUAL;

--================================
SELECT NULL FROM DUAL;
SELECT '' FROM DUAL;
SELECT ' ' FROM DUAL;

SELECT DUMP(NULL) FROM DUAL;
SELECT DUMP('') FROM DUAL;
SELECT DUMP(' ') FROM DUAL;
SELECT DUMP('  황 병 현 ') FROM DUAL;
--================================

-- 사원 테이블에서 5건만 조회하시오
SELECT * FROM EMP;
SELECT * FROM EMP WHERE ROWNUM <=5;

-- NULL 데이터 처리하기
SELECT COMM FROM EMP;
SELECT COUNT(COMM) FROM EMP;

SELECT COUNT(NULL) FROM DUAL;
SELECT COUNT(0) FROM DUAL;

-- 오라클에서 NULL 데이터는
-- IS NULL 또는 IS NOT NULL로 비교해야 한다.
SELECT COMM FROM EMP WHERE COMM IS NULL;
SELECT COMM FROM EMP WHERE COMM IS NOT NULL;
-- 오라클에서 NULL은 = 연산자로 비교하지 않는다.
SELECT COMM FROM EMP WHERE COMM = NULL;

-- NULL 있는 컬럼 카운트 함수 사용하기
SELECT COUNT(COMM) FROM EMP WHERE COMM IS NOT NULL;

-- NULL 값을 처리하는 함수
-- NVL() 함수
SELECT NVL(NULL, 0) FROM DUAL;

-- EMP 테이블의 전체 건수는? 단 COMM 컬럼을 사용하세요
SELECT COMM FROM EMP WHERE COMM IS NULL;
SELECT COMM FROM EMP WHERE COMM IS NOT NULL;

SELECT NVL(COMM, 0) AS COMM FROM EMP;
SELECT COUNT(NVL(COMM,0)) AS COMM FROM EMP;

8교시 (17:30-18:30)

  • LIKE 연산자 %, _ 검색, 날짜 데이터 조회
-- LIKE 연산자 %(와일드 카드) 검색
-- 사원테이블에서 사원 이름이 S로 시작하는 사원을 검색하시오
SELECT * FROM EMP WHERE ENAME LIKE 'S%';
-- 사원테이블에서 사원 이름이 S로 끝나는 사원을 검색하시오
SELECT * FROM EMP WHERE ENAME LIKE '%S';
-- 사원테이블에서 사원 이름에 S가 포함되어 있는 사원을 검색하시오
SELECT * FROM EMP WHERE ENAME LIKE '%S%';

-- 사원테이블에서 사원 번호가 7로 시작하는 사웡ㄴ들을 검색하시오
SELECT ENAME, EMPNO FROM EMP WHERE EMPNO LIKE '7%';

-- 사원 테이블에서 사원 번호가 9로 끝나는 사원들을 검색하시오
SELECT * FROM EMP WHERE EMPNO LIKE '%9';

SELECT * FROM EMP WHERE ENAME LIKE 's%';
SELECT * FROM EMP WHERE ENAME LIKE UPPER('s%');

-- LIKE 연산자와 _(와일드카드) 검색, 조회
SELECT * FROM EMP;
-- 두 번째 문자가 A
SELECT * FROM EMP WHERE ENAME LIKE '_A%';
-- 세 번째 문자가 A
SELECT * FROM EMP WHERE ENAME LIKE '__A%';
-- 중간에 A가 포함되지 않은
SELECT * FROM EMP WHERE ENAME NOT LIKE '%A%';

-- 날짜 데이터 조회
-- 1981년 1월 1일 이전에 입사한 사원을 출력하시오
SELECT HIREDATE FROM EMP;

SELECT * FROM EMP WHERE HIREDATE <= '81/01/01';
SELECT * FROM EMP WHERE HIREDATE <= '1981/01/01';
SELECT * FROM EMP WHERE HIREDATE <= '1981-01-01';
SELECT * FROM EMP WHERE HIREDATE <= '1981.01.01';
SELECT * FROM EMP WHERE HIREDATE <= '81/1/1';

-- ##############################################
SELECT * FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY-MM-DD')
        <= TO_CHAR(TO_DATE('81/01/01'), 'YYYY-MM-DD');
-- ##############################################

/*
SELECT TO_CHAR(첫번째 변수, 두 번째 변수) FROM DUAL
첫번째 변수는 항상 DATE 타입이어야 한다.
두번쨰 변수는 날짜 형식이어야 한다.
*/
SELECT TO_CHAR(HIREDATE, 'YYYY-MM-DD') FROM EMP;
SELECT TO_CHAR(TO_DATE(HIREDATE), 'YYYY-MM-DD') FROM EMP;
--SELECT TO_CHAR('81/01/01', 'YYYY-MM-DD') FROM DUAL;
SELECT TO_CHAR(TO_DATE('81/01/01'), 'YYYY-MM-DD') FROM DUAL;

Notes


728x90