DB/Oracle 48

DB 47강. 트랜잭션

트랜잭션(Transaction) : 일의 처리 단위(서비스) COMMIT이 일어난 시점부터 다음의 COMMIT 전까지의 작업이 하나의 트랜잭션 일의 단위가 상대적이다. 입금(서비스) * 계좌의 돈을 UPDATE(+) 하는 일 * 홍길동 : 기존 3000 (2000 입금) => 5000 * 하나의 UPDATE => 트랜잭션 송금(서비스) * 홍길동 : 기존 3000 (2000 송금) => 1000 * 장보고 : 0 => 2000 * 업데이트 + 업데이트 => 트랜잭션 하나의 서비스를 처리하는 것을 트랜잭션 트랜잭션을 처리하는데 DML(INSERT, UPDATE, DELETE)이 한번 일어날 수도 있고, 여러 번 일어날 수도 있다. 트랜잭션이 중요한 이유! TCL(Transaction Control Lang..

DB/Oracle 2022.02.16

DB 46강. 조인 - 외부 조인(OUTER JOIN) ★

게시글 3건을 보고 싶은데 누가 적었는지 나와있지 않고 1, 2라고 Id만 나와있다. 이때 1이 누구고 2가 누군지 확인하기 위해 INNER JOIN을 사용했다. 그러면 UserTbl의 id와 PostTbl의 UserId를 비교해 같은 컬럼을 INNER JOIN 하여 합쳐진 테이블을 출력해줬다. INNER JOIN을 하면 User의 id가 같은 데이터만 JOIN 하여 합쳐서 출력해주는데 동일 조인을 하게 되면 love의 데이터는 절대 출력되지 않는다. 회원정보를 모두 출력하고, 회원이 쓴 글들을 보여달라는 요청에 동일 조인으로 해결할 수 없다. love가 나오지 않기 때문이다. 모든 User의 데이터를 합쳐서 보여주기 위해서는 OUTER JOIN을 해준다. OUTER JOIN을 사용하는 방법을 알아보자...

DB/Oracle 2022.02.15

DB 45강. 시퀀스

시퀀스(Sequence) : 유일(UNIQUE)한 값을 생성해주는 오라클 객체 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동으로 생성할 수 있다. 보통 PK(PRIMARY KEY) 값을 생성하기 위해 사용한다. 시퀀스를 만들어보자. 왼쪽 목록에 시퀀스에서 우클릭하고 새 시퀀스를 클릭해준다. 최솟값과 최댓값은 적지 않으면 디폴트 값으로 정해져 있다. 우리는 DDL을 복사해서 붙여 넣자 데이터베이스 종류마다 가지고 있는 전략이 다르다. MySQL = mariaDB -> Auto Increment 전략 null값이 들어오면 이전 값을 확인해서 데이터를 집어넣는다. INSERT 하기 전에 번호를 미리 확인할 수 없다. MSSQL -> table 전략 Oracle -> 시퀀스 전략 [출처] ht..

DB/Oracle 2022.02.15

DB 44강. 외래키 제약조건

EMP의 DETPNO 컬럼에는 SCOTT이 가진 DEPT 테이블의 PK 값이 아닌 것은 넣을 수 없게 제약조건이 걸려있다. 50이라는 DETPNO가 없는데 50을 넣으면 오류가 발생한다. 무결성을 해친 것이다. 하지만 우리가 만들었던 postTbl 테이블에는 userId(FK) 자리에 55를 넣어도 INSERT가 잘 된다. INSERT INTO posttbl(id, title, content, userId) VALUES(SEQ_POSTTBL.nextval, '제목4', '내용4', 55); USERID가 아닌 다른 값이 들어갈 수 없게 제약조건을 걸어주자. 우선 postTbl테이블을 DROP 하고 시작한다. DROP TABLE postTbl; 그리고 CREATE TABLE에 한 문장을 추가해 외래키 제약..

DB/Oracle 2022.02.15

DB 43강. 연관관계

관계에 대해 먼저 알아보자. 하나의 타입으로 설명이 되지 않을 때 오브젝트로 쪼개 준다. User와 Post의 관계를 살펴보자. 사용자 한 명당 게시글을 하나만 올릴 수 있는 게 아니다. 사용자와 게시글은 1 : N의 관계를 가진다. 반대로 게시글은 사용자에게 어떤 관계를 가질까? 하나의 게시글은 한 사람만 작성이 가능하다. 따라서 게시글과 사용자는 1 : 1의 관계를 가진다. 둘 중 더 큰 수로 생각하면 된다. 즉, 사용자와 게시글은 1 : N의 관계이다. 외래키는 어디 테이블에 걸어줘야 할까? 결론부터 말하자면 외래키는 N의 테이블에 있어야 한다. 1의 테이블에 외래키가 있다면 postId가 중복되어 콤마로 구분해서 넣어주든가 User의 데이터가 중복되어야 한다. 원자성이 깨지는 것이다. 이를 이해한..

DB/Oracle 2022.02.15

DB 42강. 조인 - 동일 조인(INNER JOIN) ★

동일 조인 : 동일한 것만 뽑을게! JOIN 앞뒤로 적어주는 테이블의 순서도 중요하다. -- 뭘로 JOIN할건지 ON에서 지정 SELECT e.ename, e.deptno, d.dname, d.loc FROM emp e INNER JOIN dept d ON e.deptno = d.deptno; 연산 수행 순서는 JOIN의 왼쪽에 적은 테이블에서 우선 1행을 보고, 맨 끝 DEPTNO의 20을 보고 오른쪽 테이블로 가서 DEPTNO가 20인 행을 찾는다. 같은 값을 찾는 게 동일 조인이기 때문이다. 총 3번의 연산을 했다. 20이라는 값을 찾고 난 이후에 아래에 20이 더 있는지 확인을 할까, 20을 찾았으니 연산을 멈출까? 멈추게 된다. DEPTNO는 DEPT 테이블의 PK(기본키)이기 때문이다. 아래에..

DB/Oracle 2022.02.14

DB 41강. 정규화

5 정규화 : 테이블 설계 규칙 정규화 과정을 거치면 테이블 설계가 예뻐지는 것이다. 테이블 설계 규칙 1. 원자성(Automicity) 테이블 하나의 컬럼은 오브젝트를 저장할 수 없다. 하나의 컬럼에는 하나의 데이터만 들어갈 수 있다. 콤마를 이용해 여러 개의 데이터를 넣는 것은 원자성을 위배한 것이다. 그렇다면 왜 콤마를 사용해 여러 개의 값을 넣지 못할까? 데이터베이스에서 테이블은 하나의 오브젝트인데 이는 하나의 상태만 가져야 한다. 만약 emp 사원 테이블에는 사원에 관한 데이터만 있으면 되는데 dept 부서의 데이터는 필요가 없기 때문이다. 사원 테이블에 부서 테이블의 데이터까지 가지고 있다면 데이터의 중복이 엄청나게 발생하게 된다. 하나의 상태만 저장해야 데이터 중복을 피할 수 있다. => 1..

DB/Oracle 2022.02.14

DB 40강. UPDATE

행에있는 컬럼을 하나 집어서 수정을 진행한다. -- UPDATE UPDATE usertbl SET password = 'love5678' 이대로 실행해버리면 모든 테이블의 password 데이터가 love5678로 바뀌어버린다. 아주 위험하다!! UPDATE문인데 WHERE문이 포함되어 있지 않으면 동작자체를 하지않도록 미리 막아둬야한다. -- UPDATE UPDATE usertbl SET password = 'love5678' WHERE no = 3; 2개 이상의 값을 변경할 때는 콤마(,)로 구분지어 사용해준다. UPDATE usertbl SET password = 'love1234', gender = '여' WHERE no = 3; [출처] https://cafe.naver.com/metacodin..

DB/Oracle 2022.02.14

DB 39강. DELETE

DELETE는 행을 날리는 것이기 때문에 프로젝션이 필요없다. WHERE로 행을 하나 잡아서 지워버린다. -- DELETE DELETE FROM usertbl WHERE username = 'ssar'; 보통 DELETE의 WHERE절에는 PK의 값이 들어가는 경우가 많다. [출처] https://cafe.naver.com/metacoding 메타코딩 : 네이버 카페 코린이들의 궁금증 cafe.naver.com 메타 코딩 유튜브 https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9 메타코딩 문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://githu..

DB/Oracle 2022.02.14

DB 38강. INSERT

데이터베이스마다 대소문자를 구별하는 것도 있으니 주의하자. 우리가 사용하는 오라클은 구별하지 않는다! -- INSERT INSERT INTO usertbl(no, username, password, gender) VALUES(1, 'ssar', 'ssar1234', '여'); SELECT * FROM usertbl; 똑같은 행을 INSERT 하면 오류가 난다. PRIMARY KEY로 지정해준 no의 값이 중복되기 때문이다. INSERT INTO usertbl(no, username, password) VALUES(3, 'love', 'love1234'); gender는 null값을 허용하기 때문에 이렇게도 INSERT가 가능하다. INSERT INTO usertbl(no, username) VALUES(..

DB/Oracle 2022.02.14