ResultSet 

- select의 조회결과를 자바에서 얻기 위해 cursor의 제어권을 저장한 객체

- 자바에서는 ResultSet을 써서 cursor가 위치한 행(record)의 컬럼값을 얻음 

-  !! 하는 일!!

1) cursor를 이동시키는 일

 * cursor : 조회 결과를 얻기 위해 움직이는 pointer

      > DB에서 테이블이 조회되면 inline view가 생성되는데, inline view 앞에 cursor가 존재

      >  cursor 이용하는 경우에는 previous() 쓰지 말자. 부하가 엄청 크다. 쿼리로 해결하자

  - 커서가 있는 위치에서 다음 레코드가 존재하는지? : rs.next()

     > 커서가 있는 위치에서 다음 레코드가 존재하면 true가 반환되고 커서의 위치가 아래로 이동함

     > 무조건 처음에 next()를 먼저 수행해야 커서가 컬럼의 값이 존재하는 레코드의 첫 행으로 내려갈 수 있음!

 

2) Oracle의 데이터형을 Java에 저장하기 위해 형변환을 수행

  - 오라클의 데이터형을 자바로 저장하기 위해 자바의 데이터형으로 변환하여 얻는 일

형식 Oracle Java ResultSet method
숫자 Number

정수 : byte, short, int, long getByte(), getShort(), getInt(), getLong()

실수 : float, double getFloat(), getDouble()
문자열 char / varchar2 String getString()
날짜 date Date getDate() 
// 반환형은 java.sql.Date (java.util.Date의 자식class)

   -  get method의 () 안에는 컬럼명 or 인덱스를 넣어서 값을 가져온다 

       > 인덱스는 1번부터 시작! cursor가 0번

      > 인덱스를 사용하면 가독성이 떨어지므로 되도록 컬럼명을 사용하여 코딩하자

   - Java API에서 ResultSet의 method 참고하여 골라 사용하자

 

 


# 오늘의 코딩 #

- Statement를 사용해보자!

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

import com.sun.net.httpserver.Authenticator.Result;

/**
 * Statement 사용한 DBMS 연동
 * @author user
 */
public class UseStatement {

	/**
	 * CP_DEPT 테이블의 모든 레코드 조회
	 * @throws SQLException
	 */
	public void selectAllCpDept() throws SQLException {
		
		//1. 드라이버 로딩
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}//end catch
		
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String id = "scott";
		String pass = "tiger";
		
		Connection con = null; // DB연동 유지, transaction, 쿼리문 생성객체 얻기
		Statement stmt = null; // 쿼리문 실행
		ResultSet rs = null ; // 조회(Cursor의 제어권), 데이터형 변환
				
		try {
		//2. Connection 얻기
			con = DriverManager.getConnection(url, id, pass);
		//3. 쿼리문 생성객체 얻기
			stmt=con.createStatement();
		//4. 쿼리문 수행 후 결과 얻기
			String selectCpDept = "select deptno,dname,loc from cp_dept";
			rs = stmt.executeQuery(selectCpDept); 
            // DB조회 결과로 인라인뷰가 만들어지고 커서 제어권 가져옴
			
			int deptno = 0;
			String dname = "";
			String loc = "";
			// 조회결과에서 커서의 첫 위치는 컬럼명이 있는 곳이므로 무조건 한번은 내려야 값이있는 행에 위치할 수 있음
			while(rs.next()) { // 포인터가 존재하는 위치 아래에 레코드가 존재하는지?
				//컬럼명으로 얻기 => 가독성이 높음
				deptno = rs.getInt("deptno");
				dname = rs.getString("dname");
		    	loc = rs.getString("loc");
		
				System.out.println(deptno + " / " + dname + " / " + loc);
			}//end while
			
		} finally {
		//5. 연결 끊기
			if(rs != null) {rs.close();}
			if(stmt != null) {stmt.close();}
			if(con != null) {con.close();}
		}//end finally
		
	}//selectAllCpDept
	
	public static void main(String[] args) {
		UseStatement us = new UseStatement();

		try {
			us.selectAllCpDept();
		} catch (SQLException e) {
			e.printStackTrace();
		}//end catch
		
	}// main

}// class

 

# 출력 결과 #

무사히 출력완료!

~ select 에서 사용할 수 있는 다양한 절에 대해 알아보자 ~

 

일단 select의 기본 문법은 아래와 같다!

 

(필수)

select ~ from ~ : 테이블의 모든 레코드를 검색

(선택)

 where절 : 연산자를 사용하여 조건에 맞는 레코드만 검색

 group by : 조회 결과를 그룹으로 묶어서 하나만 검색 (중복값이 조회되지 않음)

 having절 : 그룹으로 묶을 조건 명시

 order by절 : 조회 결과를 정렬하여 검색

 

* 절은 필요한 것만 사용할 수 있으나, 순서를 꼭 지키자 *

 

 

 1. where절 

- 조건에 맞는 레코드만 검색됨 (결과가 참인 것!)
 
* 1=1이면 항상 참으로 모든 행이 조회되고, 1=0은 항상 거짓으로 아무것도 조회되지 않음

- 연산자를 사용하여 조건을 부여하고 검색할 때 사용

- 컬럼을 full-scan하여 일치 레코드만 검색함

- 문법) select 컬럼명, 컬럼명 alias, 컬럼명 연산자, 함수명(컬럼명)

             from 테이블명

             where 컬럼명 연산자 검색할값;

 

* 이상,이하 범위 비교시 between 사용 가능 (아래 2개 다 같은 뜻)

    where sal >= 100 and sal <=200;

    where sal between 100 and 200;

 

* 여러 값을 포함하는 레코드를 조회할 때에는 or 사용하는데, in도 사용 가능 (포함하지 않는 건 not in)

    where job = 'CLERK' or job = 'SALESMAN' or job = 'MANAGER';

    where job in ('CLERK', 'SALESMAN', 'MANAGER');

 

* null은 관계연산자로 비교되지 않음 : null 비교는 컬럼명 is null / is not null

 

* 문자열 연산자

- 문자열의 일부분만 알아도 검색 가능

- %, _ 특수문자와 같이 사용할 수 있음

- like : 특수문자와 같이 사용하지 않으면 완전히 같은 문자열 검색 (=사용과 동일하나 속도 느림)

           where 컬럼명 like ‘찾을 문자열’

           where job = 'CLERK';

           where job like 'CLERK';

- 특수문자 : % - 글자수에 상관없이 모든 글자에 매핑

- 특수문자 : _ - 한 글자로 매핑 (_하나는 한글자)

   5글자이면서 3번째에 A가 들어가는 이름을 찾는다면, where name like ' __A__'

 

 

 2.  group by~having절 

- 컬럼의 값이 중복된다면 그룹으로 묶어 하나만 조회할 때 사용

   (중복 배제 / distinct와 결과는 같으나 error 발생한다는 점과 집계함수를 쓴다는 점이 차이점!)

- 집계함수(그룹함수)와 같이 사용하면 그룹별 집계를 구할 수 있음

- group by 절에 기술되지 않은 컬럼이 조회되면 error 발생

 > 집계함수에 입력되는 컬럼은 group by절에 포함되지 않아도 됨

- 문법) select 컬럼명 (<- group by에 나온 컬럼명만 select에 쓸 수 있음)

           from 테이블명

           group by 컬럼명,,, (<- 정의한 컬럼이 그룹으로 묶여 중복 배제가 됨)

           having 그룹으로 묶일 조건

 

* distinct

- 컬럼의 값이 중복될 때 중복 배제하는 경우 사용

- 중복되지 않는 컬럼과 같이 사용하면 중복 배제가 되지 않음 (같은 값이 조회될 수 있음)

- error가 발생하지 않음

- 집계함수와 같이 사용되더라도 그룹별 집계를 얻을 수 없음

       Ex) select distinct job, mgr

       => 한 직무에서 여러 개의 mgr번호가 가지고 있으면 mgr은 중복 배제되나, 직무는 여러 개 나올 수 있음

- 문법) select distinct 컬럼명

 

** group by ~ having절과 where절의 차이

 - 조회 결과는 같으나 과정이 다름

 - group by ~ having절 : 그룹으로 묶고 난 후 조건에 따라 추려냄 (그래서 집계 가능한 것)

 - where절 : full-scan으로 조건을 추리고 난 후 묶어서 보여줌

 

 

 3. order by절 

- 조회 결과를 정렬할 때 사용 (=> 조회한 레코드는 insert한 순서대로 조회)

- 오름차순 정렬, 내림차순 정렬을 할 수 있음

 > (기본) 오름차순 : asc

                내림차순 : desc

- 정렬종류를 생략하면 asc가 기본 설정됨

- 숫자가 문자열 형식으로 저장되어 있을 때에는 자릿수의 정렬을 수행

- 모든 데이터형 정렬 가능

- order by를 사용하면 속도가 느려짐

- 문법) order by 정렬할컬럼명 정렬종류, 정렬할컬럼명 정렬종류(앞에 정렬된 컬럼의 값이 같을 때 두 번째 정렬조건),,,,

 

'Development > Oracle' 카테고리의 다른 글

[Oracle] subquery / Scalar subquery / inline view  (0) 2021.09.24
[Oracle] function(함수)  (0) 2021.09.20
[Oracle] delete / truncate / drop  (0) 2021.09.18
[Oracle] 산술연산자  (0) 2021.09.16
[Oracle] transaction / commit / rollback  (0) 2021.09.14

 1. select 

- DML

- 테이블의 모든 레코드에서 필요한 컬럼만 조회할 때 사용

- 문법)

  (필수) select 컬럼명 ,,,

              from 테이블명

  (선택) where 검색조건

              group by 그룹화할 컬럼명

              having 그룹으로 묶일 조건

              order by 정렬할 컬럼명

 

* select 컬럼의 사용 구문 :

  - select 컬럼명, 컬럼명 alias명 (as 붙여도 되고 안 붙여도 됨), 컬럼명 연산자 값, 함수(컬럼)

  - * 기입 시 전체 컬럼 조회

 

** alias

- 컬럼명, 테이블명을 변경하여 사용할 때

- 컬럼명이나 테이블명이 긴 경우 가독성이 떨어지므로, 가독성 향상을 위해 사용

- alias를 대소문자 구분하여 설정하려면, 컬럼명 as “컬럼명”

- 문법) select 컬럼명 alias명 (또는 as alias명) // as 생략가능

             from 테이블명;

 

 2. update 

- DML

- 컬럼의 값을 변경할 때 사용

- where절에 해당되는 모든 레코드의 컬럼 값을 변경 (0~n건 변경)

- transaction 대상 쿼리 (commit / rollback)

- 문법)

  update 테이블

  set 컬럼명 = 변경할 값, 컬럼명 = 변경할 값 ,,, // = : 대입, 컬럼의 값을 변경함

  where 컬럼명 = 기준값; // = : 관계연산자 // where절에는 관계연산자와 논리연산자 사용됨


# 오늘의 코딩 #

- 기존 학생 데이터를 update하고 alias를 사용하여 select 해보자!

--김동동의 성별을 여자로 변경
update test_student
set    gender ='여'
where  name ='김동동';

-- 전체 레코드 조회
select * from test_student;

 

- alias 사용한 조회

-- 성별이 남자인 학생의 이름, 성별, 주소(addr을 address로), 전화번호 조회
select name, gender, addr address, phone_no
from 	 test_student
where  gender = '남';

 

 

'Development > Oracle' 카테고리의 다른 글

[Oracle] 산술연산자  (0) 2021.09.16
[Oracle] transaction / commit / rollback  (0) 2021.09.14
[Oracle] create / insert  (0) 2021.09.11
[Oracle] Data Type / 주석  (0) 2021.09.10
[Oracle] DBMS / RDBMS  (0) 2021.09.09

+ Recent posts