44일차 DML 등/ Set과 map

쿠우·2022년 5월 30일
0

DB

(1)DELETE 문

테이블에 저장된 데이터 삭제.

 가. 테이블에 저장된 데이터 삭제.
 나. 한번에 여러 행들을 삭제가능.
 다. WHERE 절은 *생략가능* (**주의**)
     생략하면, 지정 테이블의 모든 데이터(행)가 삭제됨.
BEGIN       -- To start a transaction.

    DELETE FROM mydept
    WHERE deptno = 30;


    -- TCL: Transaction Control Language.
    ROLLBACK;       -- To roll back all changes.
    -- COMMIT;      -- To save all changes permenantly.

END;        -- To end a transaction.

(1-1) 서브쿼리(=부속질의)를 이용한 DELETE 문

 가. DELETE 문의 WHERE 절에서, 서브쿼리 사용.
 나. 서브쿼리의 실행 결과값으로, 테이블의 데이터 삭제가능.
 다. 이 방법을 사용하면, 기존 테이블에 저장된 데이터를 사용하여,
     현재 테이블의 특정 데이터 삭제가능.
 라. 서브쿼리의 실행결과 값의 개수와 타입이, 메인쿼리의 WHERE절
     에 지정된 조건식의 컬럼의 개수와 타입이 반드시 동일해야 함.

ex) 서브쿼리 이용한 DELETE문 예시

 DELETE FROM 테이블명        -- 데이터를 삭제할 테이블 지정
 [ WHERE <**Sub-query**> ]; -- 조건이 참인 행들만 삭제

-사용


BEGIN       -- To start a transaction.

    DELETE FROM mydept
    WHERE loc = (

        SELECT
            loc
        FROM
            dept
        WHERE
            deptno = 20

    );
    
    -- 다중컬럼 조건식 지정 (Pairwise 방식)
    -- WHERE (loc, dname) = (

    --     SELECT
    --         loc,
    --         dname
    --     FROM
    --         dept
    --     WHERE
    --         deptno = 20

    -- );


    ROLLBACK;

END;        -- To end a transaction.


SELECT
    *
FROM
    mydept;

DELETE MYDEPT2; -- 삭제한 행의 로그(TX로그)를 남기면서 삭제 (DML문장)

TRUNCATE TABLE MYDEPT2; -- 복구 불가능하게, TX로그를 남기지 않고 바로 절삭 / 복구할 필요가 없는 데이터를 빠르게 지울때 사용  (DDL문장)

(2) MERGE 문

설명)

 가. 스키마(구조)가 같은 두 개의 테이블을 비교하여,
 나. 하나의 테이블로 합침.
 다. INTO 절 -> 병합결과가 저장될 테이블명 지정.
 라. USING 절 -> 병합할 대상 테이블/뷰/서브쿼리 지정.
 마. ON 절 -> INTO 절의 테이블1과 USING 절의 테이블2 간의
              조인조건 지정.
    
 바. WHERE 절로 조건지정 가능.
 사. DELETE 문도 사용가능.
 아. ** 앞의 INSERT/UPDATE/DELETE문과의 차이점:
     저장 또는 수정 대상 테이블을 INTO 절에 지정.
 자. 응용분야:
     대표적인 경우, 전자상거래의 물품판매회사가,
     월별로 판매현황관리, 연말에 월별판매현황 데이터 병합

예시)

--  MERGE INTO 테이블1 별칭    --(최종 결과를 담는 타겟 테이블)
--      USING (테이블명2 | 뷰 | 서브쿼리) 별칭     --조인에서 공통컬럼지정이 주였지만 여기서는 합칠 두번 째 테이블을 적어줌
--      ON (조인조건)     --조인의 조건을 적어준다
--
--      --------------------------------------
--      (1) 조인 조건식이 일치(참이면)하면...
--      --------------------------------------
--      WHEN MATCHED THEN
--          --------------------------------------
--          -- (1-1). MERGE 테이블의 기존 데이터 변경(갱신).
--          --------------------------------------
--          UPDATE SET
--              컬럼명1 = 값1,
--              ...
--              컬럼명n = 값n
--          [WHERE 조건식]
--
--          --------------------------------------
--          -- (1-2). MERGE 테이블의 기존 데이터 삭제.
--          --------------------------------------
--          [DELETE WHERE 조건식]
--
--      --------------------------------------
--      (2) 조인 조건식이 비일치(거짓이면)하면 ...
--      --------------------------------------
--      WHEN NOT MATCHED THEN
--          --------------------------------------
--          -- (2-1). MERGE 테이블에 새로운 데이터 생성.
--          --------------------------------------
--          INSERT (컬럼목록)
--          VALUES (값목록)
--          [WHERE 조건식];

ㄱ)실습용 테이블 및 데이터 생성

-- 1월 판매현황 테이블 생성
CREATE TABLE pt_01 (
    판매번호    VARCHAR2(8),
    제품번호    NUMBER,
    수량       NUMBER,
    금액       NUMBER
);  -- pt_01

-- 2월 판매현황 테이블 생성
CREATE TABLE pt_02 (
    판매번호    VARCHAR2(8),
    제품번호    NUMBER,
    수량       NUMBER,
    금액       NUMBER
);  -- pt_02


--최종 병합(merged)된 데이터를 저장할 테이블 생성
CREATE TABLE p_total (
    판매번호 VARCHAR2(8),
    제품번호 NUMBER,
    수량 NUMBER,
    금액 NUMBER
);  -- p_total
BEGIN       -- To start a transaction.  백만개의 인서트문이 있으면 하나하나 오토커밋해주면 과부하걸린다. 묶음으로 진행 
    -- 1월달 판매현황 테이블 데이터 생성
    INSERT INTO pt_01 VALUES ( '20170101', 1000, 10, 500 );
    INSERT INTO pt_01 VALUES ( '20170102', 1001, 10, 400 );
    INSERT INTO pt_01 VALUES ( '20170103', 1002, 10, 300 );

    -- 2월달 판매현황 테이블 데이터 생성
    INSERT INTO pt_02 VALUES ( '20170201', 1003,  5, 500 );
    INSERT INTO pt_02 VALUES ( '20170202', 1004,  5, 400 );
    INSERT INTO pt_02 VALUES ( '20170203', 1005,  5, 300 );

    COMMIT;

END;        -- To end a transaction.

ㄴ)4-2. MERGE 문 수행 #1

MERGE INTO p_total total    -- MERGE 결과 저장 테이블 지정.

    -- MERGE 대상 테이블 지정(Alias 가능, 이때, **AS 키워드 사용불가**)
    USING pt_01 p01 
    ON (total.판매번호 = p01.판매번호)    -- 동등 조인조건/

1)JOIN 조건에 일치하는 행들은....
(기존 행에 추가할 행이 중복이면 거기에 대한 중복을 제하고 추가하기위해 WHEN이 있다. )

    WHEN MATCHED THEN

        -- MERGE 대상테이블(p01)의 데이터를 이용하여,
        -- MERGE 저장테이블(total)의 데이터 변경(갱신).
        UPDATE SET
            total.제품번호 = p01.제품번호
    

2)JOIN 조건에 일차하지 않는 행들은...
(머지문안에서의 인서트에는 머지시작때 INTO가 선언되어서 두번 지정하지 않아도 된다. )
(밸류안에는 별칭을 통해 소속을 적어주고 병합할 행들을 적어준다. )
(오리지날 테이블에 대해서는 건들지말고 토탈테이블만 변경해야한다.)

    WHEN NOT MATCHED THEN

        -- MERGE 대상테이블(p01)의 데이터를 이용하여,
        -- MERGE 저장테이블(total)의 데이터 신규 생성.
        INSERT
        VALUES (p01.판매번호, p01.제품번호, p01.수량, p01.금액);

ㄷ)MERGE 문 수행 #2 (2월달 데이터 병합)

TRUNCATE TABLE p_total;


MERGE INTO p_total total    -- MERGE 결과 저장 테이블 지정.

    -- MERGE 대상 테이블 지정(Alias 가능, 이때, **AS 키워드 사용불가**)
    USING pt_02 p02
    ON ( total.판매번호 = p02.판매번호)    -- 동등 조인조건

    -- --------------------------------------
    -- (1) JOIN 조건에 일치하는 행들은....
    -- --------------------------------------
    WHEN MATCHED THEN

        -- MERGE 대상테이블(p02)의 데이터를 이용하여,
        -- MERGE 저장테이블(total)의 데이터 변경(갱신).
        UPDATE SET 
            total.제품번호 = p02.제품번호

    -- --------------------------------------
    -- (2) JOIN 조건에 일차하지 않는 행들은...
    -- --------------------------------------
    WHEN NOT MATCHED THEN

        -- MERGE 대상테이블(p02)의 데이터를 이용하여,
        -- MERGE 저장테이블(total)의 데이터 신규 생성.
        INSERT
        VALUES ( p02.판매번호, p02.제품번호, p02.수량, p02.금액);
        
-- ------------------------------------------------------

(3)TCL (Transaction Control Language)

 가. Transaction (트랜잭션):
     a. DB의 논리적인 작업단위
     b. 분리될 수 없는, 한개 이상의 DB조작을 의미
     c. 하나의 트랜잭션에는, 한 개 이상의 SQL문장이 포함가능
     d. 트랜잭션 대상 SQL문장은, "DML" 문임(****)
 나. 오라클에서 발생되는, 여러 개의 작업들을, 하나의 작업처럼
     처리해야 하는 경우에, 트랜잭션이 필요!!! (예: 계좌이체)
 다. 트랜잭션 제어 명령어(TCL) 제공: (** All or Nothing **)(모든 관계형 데이터베이스의 표준임)
     (1) COMMIT (All)
         - DML문에 의해 실행되었으나, 아직 저장되지 않은 모든 데이터를
         - 데이터베이스에 저장하고, 현재의 트랜잭션 종료시킴.
     (2) ROLLBACK [TO SAVEPOINT savepoint] (Nothing)
         - 저장되지 않은 모든 DB변경사항 취소하고, 현재의 트랜잭션을
           종료시킴. 트랜잭션 시작 이전의 상태로 복구.
         - TO SAVEPOINT 키워드 사용하면, 지정된 SAVEPOINT까지만
           DB변경사항 취소가능 (Partial Rollback)
     (3) SAVEPOINT --부분적 롤백을 제공할 때 사용/
         - 진행중인 트랜잭션을, 특정이름으로 지정(like 책갈피)
         - 지정된 이름의 상태로, 실행된 DML 작업의 취소가능
           (Partial Rollback)
 라. 락 경합(Race Condition)으로 인한, 데드락(Dead Lock) 발생가능
     - 락 경합으로 인한 무한대기는, 오라클의 성능을 대폭 감소시키는 원인
     - 매우 주의해야 함 (***)

(ㄱ)락 경합(Race Condition)으로 인한, 데드락(Dead Lock) 발생 /데드락은 아니지만 비슷한 상황

-- ----------------------
-- (1) A 사용자 DML 수행
-- ----------------------
update dept
set 
    loc = '부산'
where
    deptno = 40;
-- ----------------------
-- (2) B 사용자 DML 수행 (A 사용자 DML 수행 후에, 수행)
-- ----------------------
--  A 사용자가 자신의 트랜잭션을 종료(Commit/Rollback)하기 전까지,
--  무한 대기 수행(Infinite awaiting) --> 락 경합(Lock Contention)
-- ----------------------
delete from dept
where
    deptno = 40;

자바

-HashSet

외부반복자 (Iterator)
내부반복자 (STREAMS API) 살짝 설명하심

어제에 이어서 이것만했음

	public static void main(String[] args) {
		@Cleanup("clear")
		Set<String> set = new HashSet<>();	
		
		set.add("Java");
		set.add("JDBC");
		set.add("Servlet/JSP");
		set.add("Java");
		set.add("iBATIS");

		System.out.println(set);
//		결과:[Java, JDBC, Servlet/JSP, iBATIS] --> 중복이 제거되었다.
		
		int size = set.size();
		System.out.println("총 객체수: " + size);
		
//		-----
		
		// 저장된 것을 보여주고 삭제하고 확인하는 인터페이스 
		Iterator<String> iterator = set.iterator();  
		
		// 저장된 것을 하나씩 다 꺼내서 보기 
		while(iterator.hasNext()) {
			String element = iterator.next();
			System.out.println("\t" + element);
		}// while 
		
//		
		//삭제 해보기 
		set.remove("JDBC");
		set.remove("iBATIS");
		System.out.println("총 객체수: " + set.size());
		
		
//		// 자원객체 해제 
//		set.clear(); -> 롬복의 CleanUp 으로 해결가능 
//		if(set.isEmpty()) {
//			System.out.println("비어있음");
//		}// if
		
		
	}// main

}// end class

-Map.Entry

==> Key/Value 가지고 있는 객체
key에 대한 구별은 hashcode로 구별하는 비즈니스적 알고리즘 을 사용한다.

ㄱ)hashmap

  • 키를 통해 관리한다! / 요소를 꺼내는건 외부반복자보다 향상된 for문 쓰기
public class HashMapEx {

	public static void main(String[] args) {
		// 1. Map 컬렉션 생성
		Map<String,Integer> map = new HashMap<String,Integer>();

		
		
//		2. 요소객체를 (키, 값)쌍으로 저장
		map.put("신용권", 85);
		map.put("홍길동", 90);
		map.put("동장군", 80);
		map.put("홍길동", 95);

		System.out.println("2번: 총 Entry 수: " + map.size() );
		System.out.println(map);
		
//		3. 원하는 요소객체 얻기 
		System.out.println("3번: \t홍길동 : " + map.get("홍길동"));
		System.out.println();
		
		
// 		4. 객체를 하나씩 보내기  
		Set<String> keySet = map.keySet();

		for(String key : keySet ) {
			int value = map.get(key);
			System.out.println("4번: \t" + key +  ":" + value);
		}// enhanced for
		
		
		
		
//		Iterator<String> keyIterator = keySet.iterator();
//		
//		while(keyIterator.hasNext()){
//			String key= keyIterator.next();
//			Integer value = map.get(key);
//			System.out.println("\t" + key +  ":" + value);
//		}// while 
		
		
//		5. 요소객체 삭제 
		map.remove("홍길동");
		System.out.println("5번: 총 Entry 수: " + map.size() );
		System.out.println(map);
		
		
//		6. 요소객체를 하나씩 처리 
		
		
		for(String key:map.keySet()) {
			Integer values = map.get(key);
			
			System.out.println("6번: \t" + key +  ":" + values);
			
		} //enhanced for 
		
//		Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
//		
//		Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
		
//		while(entryIterator.hasNext()){
//			Map.Entry<String, Integer> entry = entryIterator.next();
//			
//			String key = entry.getKey();
//			Integer value = entry.getValue();
//			
//			System.out.println("6번: \t" + key +  ":" + value);
//			
//		}//while
		
		
		
//		7. 요소객체 전체 삭제
		
		
		
//		8. 요소객체의 값만 반환 받아서 출력 
		Collection<Integer> values = map.values();
		
		for(int value: values) {
			System.out.println("8번: " + value);
		}// enhanced for
				
	}// main

} // end class

ㄴ)hashtable

HashMap과 Hashtable 클래스의 차이점

  • Hashtable은 Thread-safe하고, HashMap은 Thread-safe하지 않다는 특징을 가지고 있습니다. 그렇기에 멀티스레드 환경이 아니라면 Hashtable은 HashMap 보다 성능이 떨어진다는 단점을 가지고 있다고 검색해서 알아냈다.
  • Hashtable은 key에 null을 허용하지 않지만, HashMap은 key에 null을 허용한다
  • 최근까지 Hashtable은 구현에 거의 변화가 없지만, HashMap은 현재까지도 지속적으로 개선되고 있다하여 HashMap을 사랑하면 된다는 거.
    이 정도로 요점을 잡고 아래는 맵을 이용해 이런 기능을 만들 수 있다 정도의 예제
 public class HashtableExample {

	public static void main(String[] args) {
		// 1. Map 컬렉션 생성
		Map<String,String> map = new Hashtable<>();

		
		
//		2. 요소객체를 (키, 값)쌍으로 저장
		map.put("Spring", "12");
		map.put("summer", "123");
		map.put("fall", "1234");
		map.put("winter", "12345");

		Scanner scanner = new Scanner(System.in);
		
		
		while(true) {
			System.out.println("아이디와 비밀번호를 입력해주세요 ");
			
			
			System.out.print("아이디: ");
			String id = scanner.nextLine(); 
					
			System.out.print("비밀번호 : ");
			String password = scanner.nextLine(); 

			
			System.out.println();
			
			if(map.containsKey(id)) {
				
				if(map.get(id).equals(password)) {
					System.out.println("로그인 되었습니다.");
					
					break;
				} else {
					System.out.println("비밀번호가 일치하지 않습니다. ");
				} // inner if - else 
				
				
			} else {
				
				System.out.println("입력하신 아이디가 존재하지 않습니다");
			} // if - else 
			
		}//while 
		
		
		
	}// main 

} // end class

ㄷ)Properties(하다가 끝남)

  • .properties = sql의 정보를 담을 수있다.
  • 고로 sql의 정보로 들어가기위한 과정을 아는 것이 중요 내일한다.
public class PropertiesExample {
	public static void main(String[] args) throws Exception {
		Properties properties  = new Properties();
		String path = PropertiesExample.class.getResource("database.properties").getPath();
		path = URLDecoder.decode(path, "utf-8");
		properties.load(new FileReader(path));
		
		String driver = properties.getProperty("driver");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password"); 
		
		System.out.println("driver : " + driver);
		System.out.println("url : " + url);
		System.out.println("username : " + username);
		System.out.println("password : " + password);
	}

.properties 파일안에 코드

driver=oracle.jdbc.OracleDirver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
profile
일단 흐자

0개의 댓글