(1) 가입
: 두 개 이상의 테이블을 연결하여 하나의 테이블로 사용


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();
}
}