모도리는 공부중

20.11.10. 오후 - 데이터베이스 연습문제, DDL, DCL 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/SQL

20.11.10. 오후 - 데이터베이스 연습문제, DDL, DCL

공부하는 모도리 2020. 11. 10. 17:51
728x90
반응형

28. 시애틀에 근무하는 사람 중 커미션을 받지 않는 모든 사람들의 이름, 부서명, 지역ID를 출력하시오.

 

 

29. 이름이 DAVIES인 사람보다 후에 고용된 사원들의 이름 및 고용일자를 출력하시오. 고용일자를 역순으로 출력하시오.

정말 이름이 대문자일까?
역시나 없다. 그러면..?
찾았다! 역시.. 다시 해보자.

 

30. King을 매니저로 두고 있는 모든 사원들의 이름 및 급여를 출력하시오.

 

 

31. 회사 전체 평균 급여보다 더 많이 받는 사원들 중 / 이름에 u가 있는 사원들이 근무하는 부서에서 / 근무하는 사원들의 사번, 이름 및 급여를 출력하시오.

 

 


select 끝!

 

vol1, p317

8장 데이터 조작

 

셀렉처럼 이제 고민 안하셔도 됩니다.

 

DML연산 삽입, 수정, 삭제

데이터 작업을 모아놓은 단위를 우리는 트랜잭션이라고 했었다.

 

롤백과 커밋.

commit 정상작업종료됐을때 물리적으로 영구히 저장하는 것.

rollback 취소시키는 행위.

 

ddl과 dcl => 문장 하나가 하나의 트랜잭션. 즉시 저장(commit)이 되어버린다.

insert
insert
트랜잭션1
create 트랜잭션2
insert 트랜잭션3

db에 저장된 트랜잭션은?

insert 1
insert 2
create  
insert 3

 - 1, 2번이 저장된 상태이다.

 

insert 1
insert 2
commit  
rolback  
insert 3
commit  

commit된 데이터는 현재 진행중인 것만 rolback이 가능한거지, commit된 데이터는 절대로 되돌릴 수 없다.

고로, 1,2,3 모두 저장된 상태다.

 

 

p320

dml은 select에 영향을 주지 않는다.

 

데이터들은 항상 행단위로 관리된다.

insert와 delete는 행단위 작업을 진행,

새롭게 데이터가 추가되면 항상 맨 마지막 라인에 저장이 된다.

 

p321

insert into table_name

values (values);

 

insert into에 테이블 이름만 쓴다는 것 = 이 테이블의 모든 컬럼을 추가하겠다.

insert into test(a, b, c)

values (10, 10, 'a')

 

values 규칙

1. column의 개수, 순서, type을 반드시 1:1로 맞춰줘라.

2. 하나의 행만 삽입 (←이런 문제로 현업이 가장 싫어하는 작업..)

3. 무결성 검증

 3-1. column 무결성 - column 구조에 맞는 데이터만 들어와라. 그러니 반드시 테이블 구조 확인을 먼저.

 3-2. 제약조건 무결성 - pk, fk를 통틀어 제약조건이라고 한다.

 

insert into departments

values ( 300, 'ITIT', 100, 1700 );

를 추가해보자.

 

p323

암시적인 방법은 자동으로 null값을 추가

명시적인 방법은 null이라는 키워드를 우리가 직접 입력해서 추가해준다.

 

여러분이 이런 실수를 잘한다.

values ( 'null', 0, 10 )

뭐가 잘못된 걸까? - 싱글포테이션을 찍었잖아! 덕분에 문자 null이 추가되는 경험을 하게 될 것이야..

 

그럼 rollback을 해보면 어떻게 될까?

우리가 방금까지 작업한 것들이 전부 삭제된 것을 확인할 수 있다.

 

 

쉬는 시간 끄읕~

캐치마인드로 잠도 깨웠겠다. 시작합시다.

 

p324

dual테이블은 값을 가지고 있지는 않지만 뭔가를 돌려주는 작업을 할 때 꽤 많이 사용되는 가상의 데이터.

sysdate는 현재 컴퓨터의 시스템날짜를 보여주는 역할.

 

p336

where절을 넣고 안 넣고의 차이가 꽤 크다.

특정 행만 할 것이냐, 아니면 모든 행을 할 것이냐.

 

where을 넣지 않고 한 번 해보자.

이 상태에서 바꿔보자.

전부 바뀐 것을 볼 수 있다. 자, 이제 commit하지말고 되돌리자.

복구완료-.

 

dept (부모테이블)
did (pk) dname
10 a
20 b
30 c
emp (자식테이블)
eid (pk) did (fk)
100 10
101 20
102 10

자식테이블에

① insert를 해보자.

103, 10 ← o

104, 40 ← 참조하고 있는 부모테이블에 40이 없으므로 x.

② update를 해보자.

10 -> 20 ← o

10 -> 40 ← x 역시 마찬가지.

③ delete 또한 마찬가지.

 

부모테이블 가볼까요?

① insert

10 ← 이미 있는 값이라 x

40 ← 무결성 조건만 지켜주면 o

② update

10 -> 20 ←x

10 -> 40 ←x

 └ 아니 왜 ?? 왜 안돼요? : 참조하고 있는 자식 있는데 부모를 바꿔? 무결성 깨?!

30 -> 40 ← O일수도 X일수도. 참조하고 있는 자식이 없기에 시스템상 가능하나 안될 수 있다.

③ delete 도 마찬가지.

그럼 부모테이블은 다 안돼요? - 무자식이 상팔자!

 └ 서로가 독립된 테이블이면 논리적무결성이 깨져서 넣을 수 있겠지.

 └ 하지만 그렇게 되면 문제가 있을 때 우리가 캐치할 수가 없잖아.

 └ 연결된 상태에서는 결국 안된다는 말. 자식이 없으면 지우든 업뎃하든 다 부모맘이지!

 

 

듀얼로 하면 서로 간섭하겠지?

한 번 봐봅시다.

이렇게 동시에 실행을 시켜놓고 해보자구요.

지금은 둘 다 똑같습니다. 그럼 업데이트해볼까요?

업데이트 진행중 -.. 자 옆에 화면에서 봐봅시다.

분명 바꿨는데, 안 바뀌었죠? 이상하다~~??

 └ 데이터 일관성이라고 합니다!

 

그럼~ 나는 모르고 두번째 화면에서 바꿔버리면 어떻게 되나요?

???? 뭐죠? 두번째 화면 왜 저러죠?

 └ 병행제어 : 트랜잭션이 실행되면 내부에 락이라는 매커니즘이 실행된다. 작업중인 해당 행에 락을 걸어서 첫번째 창의 작업이 끝날 때까지 기다리게 만든다.

이럴땐 왼쪽에서 작업을 끝내주면,

오른쪽에서 엔터를 치자마자 실행된 것을 볼 수 있다.

우리는 저장할 생각이 없기 때문에 rollback한 것이지, 작업을 했으면 꼭 commit해줘야 저장이 된다!


그럼 142번을 손대볼까요?

옆에도 작업중인 행과 다른 행이므로 잘 업데이트된다.

진행중인 142번행을 오른쪽에서 건드리면 어떻게 될까?

deadlock 등장..

rollback으로 되돌려주면 오른쪽에서 업데이트가 된다.

 

insert 자체가 등록하기 위해서 하는거지 연습하려고 하는게 아니므로 rollback을 한다는 것은 실제로 데이터가 손실을 입었다고 생각해야한다. 트랜잭션의 사이즈는 크면 클수록 한 방에 모든 데이터를 잃어버린다. 고로, 트랜잭션의 사이즈는 작을수록 좋다. 데이터를 짧게 짧게 해서 저장하는 것이 동시성, 데이터손실이나 트랜잭션을 작게 관리함으로써 효율적으로 관리할 수 있다.

 

이 뒤쪽은 자유롭게 읽어보셔도 됩니다.

 

p369

9장 테이블 생성 및 관리

객체를 생성하고 삭제하고... 하는 언어 DDL

 

p371

테이블 풀스캔은 모든 데이터를 불러들여서 하는것..

인덱스는 검색속도가 빨라진다.

 

p372

규칙!

테이블 이름 및 열 이름은 반드시

  • 문자로 시작해야한다
  • 최대 30자까지
  • 대소문자, 숫자 가능하며, _, $, #만 가능
  • 하나의 테이블에 똑같은 이름의 컬럼 존재할 수 x. 테이블 이름이 다르다면 o.
  • 오라클 서버의 예약어가 아니어야 한다

p376

테이블생성

creat table table_name

(column_name  datatype(longth))

2, 14, 13자리가 지정되어있다라..

 

직접 만들어봅시다.

생성했죠? 확인해봅시다.

잘 됐군요, 그럼 데이터를 봐볼까요?

아직 없는게 맞겠죠. 추가해줘봅시다.

추가 완료-. 확인해보죠.

아주 잘 됐네요~

 

p377

이것은 우리가 건들 수 없는 영역이에요. 볼 수만 있죠..

 

p379

개념만 알아두시면 되고.. 현업에서는 1gb 이상 되면 솔직히 안 쓰고 다 분산시킵니다.

 

varchar. 바차라고 읽지 마세요 ㅋㅋ 현업에서는 주로 바캐릭터라고 읽습니다.

char는 미리 공간을 할당해서 집어넣는다면, (성능 우선시)

varchar는 데이터가 들어오면 그 사이즈에 맞게끔 저장공간을 할당해준다. (저장공간 활용도 우선시)

그럼 어떨때 써요? - 돈 많으면 char, 없으면 varchar. 실제로. 진짜에요.

 

char를 사용한다면 원래 들어갈 데이터 사이즈보다 20~30% 늘려서 지정하는게 좋습니다.

(ex- 주민번호는 13자리, -까지 넣는다고 했을 때 14자리라면 여유롭게 더 넣으라는 뜻)

number는 최대 256자까지 쓸 수 있으며 음,제로,양수를 모두 쓸 수 있다. 그러나 잘 쓰지 않는다.

number(p,s)는 소숫점을 사용할 때 가장 많이 사용한다.

date는 말 그대로 날짜 저장. 우리나라 정확한 날짜 표시 형식은 2020년 01월 07일 처럼 0을 모두 사용해서 표기한다.

 

밀레니엄버그 - 1999년에서 2000년으로 바뀌던 시기.

세기가 바뀔 때 1901년과 2001년을 구분할 수 있을까?라는 이슈가 발생.

전세계의 데이터베이스 회사들이 걱정이 많아서 실제로 열심히 구축했지만 2000년이 된 1월 1일, 아무 문제없이 잘 적용되었다고..

 

잠 안오시는 분들? p381부터 있는 DateTime 읽으세요 ^^.. 정말 잠 잘 옵니다.. ㅎㅎ

아! timestamp는 알아두세요. 실제로 많이 사용하는 데이터타입이에요~

 

내일은 테이블 관련된 내용만 진행하겠습니다.

마지막날 뷰, 시퀀스 등등 다 나갈거에요~

728x90
반응형
Comments