#17. 클래스 저널 _JOIN, 쿼리, ORACLE -JAVA 연결 (23.04.12)

(1) 가입

: 두 개 이상의 테이블을 연결하여 하나의 테이블로 사용


INNER JOIN(등가 조인)


JOIN 예 GOODS 테이블의 GS_CODE는 SELLER 테이블 GD_CODE에서 참조됩니다. 이때 두 컬럼의 값이 같으면 두 테이블이 연결된다.

-- (1) INNER 조인(등가 조인) : 두개의 테이블의 열 값이 같을 때
SELECT  SE_CODE, SE_NAME , SE_PHONE, SE_ADDR, GD_CODE, GS_NAME, GS_PRICE, GS_STOCK
FROM SELLER, GOODS
WHERE SELLER.GD_CODE = GOODS.GS_CODE;


— (2) Non-equijoin: 자주 사용되지는 않지만 특정 컬럼이 일치하는지 확인하는 조건이다.
— BIN$ 테이블 삭제
퍼지 재활용품;

탭에서 * 선택; — 생성된 모든 테이블을 보여주는 기능

SALGRADE에서 * 선택;
— 레벨 1 : 700 – 1200
— 레벨 2: 1201 – 1400
— 레벨 3: 1401 – 2000
— 레벨 4: 2001 – 3000
— 레벨 5: 3001 – 9999

선택하다 *
EMP E에서, SALGRADE S
S.LOSAL과 S.HISAL 사이의 E.SAL

— (3) SELF JOIN: 하나의 테이블을 여러 개의 테이블처럼 사용하는 방식.
SELECT E1.ENAME AS 직원 이름, E2.ENAME AS 감독자 이름
EMP E1, EMP E2에서
여기서 E1.MGR = E2.EMPNO;

— (4) 외부 조인
— : 조인 조건을 만족하지 않는 데이터 처리
— : INNER JOIN – 두 테이블 모두에서 일치 항목만 가져오는 것과 비교
— OUTER JOIN은 양쪽에서 모든 데이터를 가져옵니다.
— : JOIN 기반 컬럼에서 NULL을 처리하기 위해 사용
— : LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN

— 왼쪽 외부 조인
/*
(TABLE1_NAME).(COL_NAME), (TABLE2_NAME).(COL_NAME) 선택
FROM (TABLE1_NAME) LEFT OUTER JOIN (TABLE2_NAME)
ON (TABLE1_NAME).(COL_NAME) = (TABLE2_NAME).(COL_NAME)
*/


LEFT OUTER JOIN의 예

— 내부 조인
선택하다 *
EMP E1, EMP E2에서
여기서 E1.MGR = E2.EMPNO;

— 왼쪽 외부 조인
선택하다 *
EMP E1에서 왼쪽 바깥쪽에서 EMP E2에 가입
ON E1.MGR = E2.EMPNO;

— 오른쪽 외부 조인
선택하다 *
EMP E1 오른쪽 바깥쪽에서 EMP E2 가입
ON E1.MGR = E2.EMPNO;

— 완전 아우터 조인
선택하다 *
EMP E1 전체 외부에서 EMP E2 가입
ON E1.MGR = E2.EMPNO;


(2) 하위 쿼리

Subquery : SQL문 실행에 필요한 추가 데이터 조회
— SQL 문 내에서 SELECT 문 사용

– 서브쿼리의 특징
(1) 부질의는 연산자 등의 비교 대상이나 탐색 대상의 우측에 위치하며 괄호( )로 묶어서 사용한다.
(2) 일부 특수한 경우를 제외하고 서브 쿼리는 ORDER BY 절을 사용할 수 없습니다.
(3) 서브쿼리의 SELECT절에 지정된 컬럼(우측 SAL)은 메인쿼리의 비교 대상(좌측 SAL)과 동일하다.
동일한 데이터 유형과 동일한 번호를 지정해야 합니다.
(4) 하위 쿼리는 함수가 될 수 있습니다.


– 서브쿼리를 사용하지 않는 방법



– 서브쿼리 예시



SAL이 WHERE에 쓰여졌다면, SAL은 SELECT에도 같은 방식으로 쓰여져야 한다.

-- Q3. JONES 보다 높은 급여를 받는 사원정보(*)를 출력하시오
SELECT *
FROM EMP
WHERE SAL  > ( SELECT SAL 
            FROM EMP
            WHERE ENAME = 'JONES');



(3) 오라클 – 자바 연결

(1) 연결 클래스 생성

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

public class DBConnection {

    // static을 사용하면 객체를 모두 공용으로 사용하기 때문에
    public static Connection DBConnect(){

        // DB에 접속정보를 저장하기 위한 Connection타입의 객체 con 선언
        Connection con = null;

        // DB에 접속할 계정정보(아이디, 비밀번호)
        String user = "PA";
        String password = "1111";

        // 접속할 DB의 주소 정보
        String url = "jdbc:oracle:thin:@localhost:1521:xe";


        try {
            // 예상되는 오류가 발생하지 않는다면 try문 실행

            // ojdbc8파일을 현재 프로젝트에 적용
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // 오라클에 접속하는 계정정보 등록
            con = DriverManager.getConnection(url, user, password);

            System.out.println("DB접속 성공!");

        } catch (ClassNotFoundException e) {
            // ojdbc8 파일이 존재하지 않을 경우(오라클 드라이버를 찾지 못할 경우)
            System.out.println("DB접속 실패 : 드라이버 로딩 실패!");

            throw new RuntimeException(e);


        } catch (SQLException e) {
            // 오라클 접속정보가 틀렸을 경우(url, user, password 확인)
            System.out.println("DB접속 실패 : 접속정보 오류!");

            throw new RuntimeException(e);
        }


        return con;
    }
}



(2) 오라클 CRUD 작성

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

public class CRUD {

    // 접속하기 위한 Connection 객체 con
    Connection con;

    // SQL문을 DB로 전달하기 위한 Statement 객체 stmt
    Statement stmt;     //SQL 에디터의 화면

    // 조회된 SQL문 결과를 저장하는 ResultSet 객체 rs
    ResultSet rs;


    public void connect(){
        con = DBConnection.DBConnect();
    }

    // CRUD
    // CUD (int타입), R(ResultSet타입)의 결과를 갖는다.
    // C : 생성(CREATE)
    // R : 조회(READ)
    // U : 수정(UPDATE)
    // D : 삭제(DELETE)

    public void insert(){

        try {
            // SQL문을 작성하기 위한 화면 준비
            stmt = con.createStatement();

            // 화면에 SQL문 작성
            String sql = "INSERT INTO JDBCT VALUES('ORACLE', 21)";


            // 결과를 담기 위한 변수 result와
            // 실제 DB를 실행하는 executeUpdate(sql)
            int result = stmt.executeUpdate(sql);
            //1 행 이(가) 삽입되었습니다.

            System.out.println("result : " + result);

            // 입력성공을 확인하기 위한 if문
            if(result > 0){
                System.out.println("입력 성공!");
            }else {
                System.out.println("입력 실패!");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }


    public void update(){

        try {
            // SQL문을 작성하기 위한 화면 준비
            stmt = con.createStatement();

            // 화면에 SQL문 작성
            String sql = "UPDATE JDBCT SET DATA2 = 19 WHERE DATA1 = 'ORACLE' ";


            int result = stmt.executeUpdate(sql);
            System.out.println("result : " + result);

            // 수정성공을 확인하기 위한 if문
            if(result > 0){
                System.out.println("수정 성공!");
            }else {
                System.out.println("수정 실패!");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    public void delete(){

        try {
            // SQL문을 작성하기 위한 화면 준비
            stmt = con.createStatement();

            // 화면에 SQL문 작성
            String sql = "DELETE FROM JDBCT WHERE DATA1 = 'ORACLE' ";


            int result = stmt.executeUpdate(sql);
            System.out.println("result : " + result);

            // 수정성공을 확인하기 위한 if문
            if(result > 0){
                System.out.println("삭제 성공!");
            }else {
                System.out.println("삭제 실패!");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    public void select(){
            // (1) 화면준비
        try {
            stmt = con.createStatement();

            // (2) sql문 작성
            String sql = "SELECT * FROM JDBCT";

            // (3) 검색결과 담기
            // int result가 아니라 rs에 담기
            // result에 담을때는 stmt.executeUpdate(sql)을 사용했고
            // rs에 담을때는 stmt.executeQuery(sql)을 사용한다.
            rs = stmt.executeQuery(sql);

            // rs.next() : 데이터의 갯수만큼 반복문 실행
            // 데이터가 존재하면 true, 존재하지 않으면 false
            // rs의 갯수가 14개면 14번 반복(true), 0번이 되면 false가 된다.
            while (rs.next()){
                System.out.println("Data1 : " + rs.getString(1));
                System.out.println("Data1 : " + rs.getString(2));
            }


        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}


stmt

행 수 1이 결과에 포함됩니다.


stmt의 유형은 int입니다.


(3) 메인 실행 클래스 생성

package JDBC0412;

public class CRUDMain {

    public static void main(String() args) {

        CRUD crud = new CRUD();

        // 접속을 먼저 실행하지 않으면 오류가 발생
        crud.connect();

        crud.insert();
        crud.select();

        crud.update();
        crud.select();

        crud.delete();
        crud.select();
    }
}