포스트

02. SELECT

1) 조건 SELECT, 비교값(정수)

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
package edu.kh.jdbc1;

import java.util.Scanner;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCExample2{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
        
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
        
    try{
      Class.forName("oracle.jdbc.driver.OracleDriver");
      String url = "jdbc:oracle:thin:@localhost:1521:XE";
      String user = "kh";
      String pw = "kh1234";
        
      conn = DriverManager.getConnection(url, user, pw);
      
      stmt = conn.createStatement();
        
      System.out.println("< 입력 받은 급여보다 많이 받는(초과) 직원만 조회 >");
      System.out.print("급여 입력 : ");
      int input = sc.nextInt();
      sc.nextLine();
      
      String sql = "SELECT EMP_ID, EMP_NAME, SALARY FROM EMPLOYEE"
                 + " WHERE SALARY > " + input;
                      
      rs = stmt.executeQuery(sql);
            
      while(rs.next()){
        String empId = rs.getString("EMP_ID");
        String empName = rs.getString("EMP_NAME");
        int salary = rs.getInt("SALARY");
          
        System.out.printf("사번 : %s / 이름 : %s / 급여 : %d\n", empId, empName, salary);
      }
    }    
    catch(Exception e){
      e.printStackTrace();
    } finally {
      try{
        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(conn != null) conn.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }    
    }    
  }
}

2) 조건 SELECT, 비교값(문자열)

  • 조회된 데이터를 다른 클래스(Emp)에 저장
    ➡️ Emp 클래스에 필드 및 생성자, getter/setter, toString 작성
  • 부서명을 입력받아 같은 부서에 있는 사원의 사원명, 부서명, 급여 조회
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
package edu.kh.jdbc1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import edu.kh.jdbc1.model.vo.Emp;

public class JDBCExample3{
  public static void main(String[] args){
      
    Scanner sc = new Scanner(System.in);
    
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
        
    try{
      Class.forName("oracle.jdbc.driver.OracleDriver");
        
      String url = "jdbc:oracle:thin:@localhost:1521:XE";
      String user = "kh";
      String pw = "kh1234";
        
      conn = DriverManager.getConnection(url, user, pw);
      
      stmt = conn.createStatement();
      
      System.out.print("부서명 입력 : ");
      String input = sc.nextLine();
      
      String sql = "SELECT EMP_NAME, "
                 + "NVL(DEPT_TITLE, '부서없음') AS DEPT_TITLE, SALARY "
                 + "FROM EMPLOYEE "
                 + "LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) "
                 + "WHERE DEPT_TITLE = '" + input + "'";
      // (중요!!)
      // Java에서 작성되는 SQL에 문자열(String) 변수를 추가(이어쓰기)할 경우
      // ''(DB 문자열 리터럴)이 누락되지 않도록 신경써야 한다
                        
      rs = stmt.executeQuery(sql);
            
      List<Emp> list = new ArrayList<>();
      
      while(rs.next()){
        String empName = rs.getString("EMP_NAME");
        String deptTitle = rs.getString("DEPT_TITLE");
        int salary = rs.getInt("SALARY");
          
        // Emp 객체 생성하여 컬럼값 담기
        Emp emp = new Emp(empName, deptTitle, salary);
        // 생성된 Emp 객체를 List에 추가
        list.add(emp);
      }    
            
      // List에 추가된 Emp 객체가 만약 없다면 "조회 결과가 없습니다"
      // 있다면 순차적 출력
      
      if(list.isEmpty()) {
        System.out.println("조회 결과가 없습니다");
      } else {
        for(Emp emp : list){
          System.out.println(emp);
        }    
      }        
    } catch(Exception e){
      e.printStackTrace();
    } finally{
      try{
        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(conn != null) conn.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }    
    }
  }
}

3) 복수 조건 SELECT

  • 조회된 데이터를 다른 클래스(Employee)에 저장
    ➡️ Employee 클래스에 필드 및 생성자, getter/setter, toString 작성
  • 직급명, 급여를 입력받아 해당 직급에서 입력 받은 급여보다 많이 받는 사원의 이름, 직급명, 급여, 연봉을 조회하여 출력. 단, 조회 결과가 없으면 “조회 결과 없음” 출력
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
package edu.kh.jdbc1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import edu.kh.jdbc1.model.vo.Employee;

public class JDBCExample4 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
        
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      
      String url = "jdbc:oracle:thin:@localhost:1521:XE";
      String user = "kh";
      String pw = "kh1234";
      
      conn = DriverManager.getConnection(url, user, pw);
      
      stmt = conn.createStatement();
      
      System.out.print("직급명 입력 : ");
      String input1 = sc.nextLine();
      System.out.print("급여 입력 : ");
      int input2 = sc.nextInt();
      sc.nextLine();
            
      String sql = "SELECT EMP_NAME, JOB_NAME, "
                 + "SALARY, SALARY * 12 AS ANNUAL_INCOME "
                 + "FROM EMPLOYEE "
                 + "JOIN JOB USING (JOB_CODE) "
                 + "WHERE JOB_NAME = '" + input1 + "'"
                 + "AND SALARY > " + input2;
      
      rs = stmt.executeQuery(sql);
      
      List<Employee> list = new ArrayList<>();
      
      while(rs.next()){
        String empName = rs.getString("EMP_NAME");
        String jobName = rs.getString("JOB_NAME");
        int salary = rs.getInt("SALARY");
        int annualIncome = rs.getInt("ANNUAL_INCOME");
        
        list.add(new Employee(empName, jobName, salary, annualIncome));
      }
            
      if(list.isEmpty()){
        System.out.println("조회 결과 없음");
      } else {
        for(Employee emp : list){
            System.out.println(emp);
          }
      }          
    } catch(Exception e){
      e.printStackTrace();
    } finally{
      try {
        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(conn != null) conn.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

4) 조건 SELECT, 비교값(날짜형)

  • 조회된 데이터를 다른 클래스(Employee)에 저장
    ➡️ Employee 클래스에 필드 및 생성자, getter/setter, toString 작성
  • 입사일을 입력(“2022-09-06”) 받아서 입력 받은 값보다 먼저 입사한 사람의 이름, 입사일, 성별(M, F) 조회
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
package edu.kh.jdbc1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import edu.kh.jdbc1.model.vo.Employee;

public class JDBCExample5 {

  public static void main(String[] args) {
    
    // 입사일을 입력("2022-09-06") 받아
    // 입력 받은 값보다 먼저 입사한 사람의
    // 이름, 입사일, 성별(M, F) 조회
    
    Scanner sc = new Scanner(System.in);
    
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      
      String url = "jdbc:oracle:thin:@localhost:1521:XE";
      String user = "kh";
      String pw = "kh1234";
      
      conn = DriverManager.getConnection(url, user, pw);
      
      stmt = conn.createStatement();
      
      System.out.print("입사일 입력 : ");
      String input = sc.nextLine();
            
      String sql = "SELECT EMP_NAME 이름, "
                 + "TO_CHAR(HIRE_DATE, 'YYYY\"년\" MM\"월\" DD\"일\"') 입사일, "
                 + "DECODE(SUBSTR(EMP_NO, 8, 1), '1', 'M', 'F') 성별 "
                 + "FROM EMPLOYEE "
                 + "WHERE HIRE_DATE < TO_DATE('" + input + "')";
      
      // 문자열 내부에 쌍따옴표 작성 시 \"로 작성해야 한다(Escape) 문자
      
      rs = stmt.executeQuery(sql);
      
      List<Employee> list = new ArrayList<>();
            
      while(rs.next()){
        //String empName = rs.getString("이름");
        //String hireDate = rs.getString("입사일");
        //String gender = rs.getString("성별");
                
        //Employee emp = new Employee(empName, hireDate, gender.charAt(0));
        
        //list.add(emp); 
                
        // 생성자 안 쓰고
        Employee emp = new Employee();
        // 기본 생성자로 Employee 객체 생성
        // 필드 초기화 X
        // setter를 이용하여 하나씩 세팅
        
        emp.setEmpName(rs.getString("이름"));
        // 컬럼명이 별칭으로 지정한 이름
        emp.setHireDate(rs.getString("입사일"));
        emp.setGender(rs.getString("성별").charAt(0));
        // -> char 자료형 매개변수 필요
        // Java의 char : 문자 1개
        // DB의 CHAR : 고정길이 문자열(==String)
        // DB의 컬럼 값을 char 자료형에 저장하고 싶으면 
        // String.charAt(index) 이용
        
        list.add(emp);
      }
            
      if(list.size() == 0){
        System.out.println("조회 결과 없음");
      } else{
        for(int i = 0; i < list.size(); i++){
          System.out.printf("%02d) %s / %s / %c\n", i+1, list.get(i).getEmpName(), list.get(i).getHireDate(), list.get(i).getGender());
        }
      }
    } catch(Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(conn != null) conn.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }
  }
}