본문 바로가기

IT코딩공부!

#17 DB (JOIN) OR 인텔리제이+ORACLE 연동

오늘의 노래!!!

 
사건의 지평선
아티스트
윤하 (YOUNHA)
앨범
YOUNHA 6th Album Repackage 'END THEORY : Final Edition'
발매일
2022.03.30

 

조인 : 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 사용
(1) INNER 조인(등가조인) : 두개의 테이블이 열 값이 같을때(FK KEY)

ex) 예시

SELECT *
FROM SELLER, GOODS
WHERE SELLER.GD_CODE = GOODS.GS_CODE; -- 같다라는 (=) 부호 사용해주기

--별칭(ALIAS) 이용해보기
SELECT *
FROM SELLER S, GOODS G
WHERE S.GD_CODE = G.GS_CODE;
--Q. DEPT테이블과 EMP 테이블을 JOIN
--사원이름, 부서번호, 부서이름, 부서위치 조회
SELECT E.ENAME, E.DEPTNO, D.DNAME, D.LOC
FROM DEPT D, EMP E
WHERE E.DEPTNO = D.DEPTNO;

출력값

설명 : SELECT에 각 출력할 컬럼을 넣어주고 FROM에 출력할 테이블!! 그리고 WHERE에는 출력할 조건물을 줘서

같아고 표시를 해주면은 JOIN인 된다.

(2) 비등가조인 : 자주 사용하는 편은 아님, 조건이 특정 열의 일치 여부를 검사하는 방식

--테이블 생성을 눈을 다 확인 가능
SELECT  * FROM TAB;

-- SALFRADE 테이블 내용 - 1급 : 700 - 1200등등
SELECT * FROM SALGRADE;

SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

(3) 자체조인(SELF JOIN) : 하나의 테이블을 여러개 테이블처럼 사용하는 방석
                                               크게 많이 사용안함!

SELECT E1.ENAME AS 직원이름, E2.ENAME AS 상사이름
FROM EMP E1,EMP E2
WHERE E1.MGR = E2.EMPNO;

 

출력값!!

(4)   외부조인(OUTER JOIN) : 조인 조건을 만족하지 않은 데이터를 처리하기 위한 것
        내부조인(INNER JOIN) : 두 테이블에 있는 일치하는 것만 가져오지만 

        OUTER JOIN은  한쪽의 데이터를 모두 가져옴
        JOIN기준 열의 NULL을 처리하는 목적으로 사용
        LEFT, RIGTH, FULL OUTER JOIN등이 있다!!

// OUTER JOIN 사용 방법

-- LEFT OUTER JOIN
/*
    SELECT[테이블이름1].[컬럼이름1], [테이블 이름2].[컬럼이름2]
    FROM [테이블 이름1] LEFT OUTER JOIN[테이블이름2]
    ON [테이블 이름1].[컬럼이름1] = [테이블이름2].[컬럼이름2]
*/

--INNER 조인
SELECT *
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;

 

--LEFT OUTER JOIN 
SELECT *
FROM EMP E1 LEFT OUTER JOIN EMP E2
ON E1.MGR = E2.EMPNO;

 

--RIGHT OUTER JOIN 
SELECT *
FROM EMP E1 RIGHT OUTER JOIN EMP E2
ON E1.MGR = E2.EMPNO;

 

--FULL OUTER JOIN 
SELECT *
FROM EMP E1 FULL OUTER JOIN EMP E2
ON E1.MGR = E2.EMPNO;

(5)  서브쿼리 : SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 

                          SQL문 내부에서 SELECT문을 사용 

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

서브쿼리 : SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 서로 WHERE과 SELECT 컬럼이 같아야 한다
출력값

--서브쿼리 IN 연산자 : 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치하는 데이터가 있다면 TRUE
--각 부서별 최고급여와 동일한 급여를 받는 사원정보 출력

SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
                FROM EMP
                GROUP BY DEPTNO);

출력값

--다중컬럼 서브쿼리  -- 부서별 최고 급여

SELECT * FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
                        FROM EMP
                        GROUP BY DEPTNO);

출력값

// 서브쿼리를 통해서 출력값이 같다는걸 볼 수 있다.

 

/*
    서브쿼리 특징
    (1) 서브쿼리는 연사자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호()로 묶어서 사용한다
    (2) 특정한 몇몇 경우를 제외하고 서브쿼리는 ORDER BY절을 사용할 수 없다.
    (3) 서브쿼리의 SELECT절에 명시한 컬럼(오르쪽 SAL)은 메인쿼리의 비교대상(왼쪽 SAL)과
        같은 자료형과 같은 갯수로 지정해야 한다.

    (4) 서브쿼리는 함수를 할 수 있다.
*/


인텔리제이+ORACLE 연동 !!!

1. 만든 프로젝트에서 F4를 눌러서 오라클 연결을 위한 설정 진행
2. 설정에 들어가 라이브러리에서 +를 눌러줘 Java을 선택해준다
3. 자신이 저장해둔 오라클위치를 찾아서
4. 창에 경로를 넣어줘서 자신의 오라클을 확인해준다.
최종 결과..
인텔리제이랑 연동 되었는지 폴더에 추가 되었는지 확인!!!

 

패키지를 만들어서 각각의 클래스 생성

DB_Connection Class 

// 먼저 오라클 연동을 위한 기본 설정 ( 자신의 오라클 테이블과 비번 확인!!!)

public class DB_Connection {

    public  static Connection DBConnect(){

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

        //DB에 접속할 계정정보(아이디, 비밀번호)
        String user = "PC1";
        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;
    }
}

con의 정보를 불러온다(url,user,pw)
실행 결과는 INT타입 !  (1행이라는 숫자는 RESULT에 들어감)

CRUD Class

// 메소드 DB_Connection 불러옴

public class CRUD {

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


    // SQL문을 DB로 전달하기 위한 Statement 객체 stmt
    Statement stmt;

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

    public  void connect(){
        con = DB_Connection.DBConnect();  //DB

    }

    // 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를 실행하는 stmt.executeUpdate(sql)
            int result = stmt.executeUpdate(sql); //INT 리절트로 다시 돌아간다

            // 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에 담을때는 tmt.executeQuery(sql)을 사용
            // rs에 담을때는 tmt.executeQuery(sql)을 사용
            rs = stmt.executeQuery(sql);

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

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

    }

CRUD_Main Class

// 출력을 위한 결과값

public class CRUD_Main {
    public static void main(String[] args) {

        CRUD crud = new CRUD();

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

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

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


    }

 

'IT코딩공부!' 카테고리의 다른 글

#19 (은행) DB+인텔리제이  (0) 2023.04.14
#18 DB+인텔리제이 작업  (0) 2023.04.13
#16 !CONSTRAINT(제약조건)!  (0) 2023.04.11
#15 집합  (0) 2023.04.10
#14 DB공부 3일차!! (예제문제)및 문법공부  (0) 2023.04.07