테이블에 저장된 데이터 삭제.
가. 테이블에 저장된 데이터 삭제.
나. 한번에 여러 행들을 삭제가능.
다. 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.
가. 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문장)
설명)
가. 스키마(구조)가 같은 두 개의 테이블을 비교하여,
나. 하나의 테이블로 합침.
다. 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.금액);
-- ------------------------------------------------------
가. 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;
외부반복자 (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
==> Key/Value 가지고 있는 객체
key에 대한 구별은 hashcode로 구별하는 비즈니스적 알고리즘 을 사용한다.
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
HashMap과 Hashtable 클래스의 차이점
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
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