오늘의 노래!!!
- 아티스트
- 윤하 (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');
--서브쿼리 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 연동 !!!
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;
}
}
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 |