DML(데이터 조작어)
:
DDL을 언제 배움. 데이터 정의 언어임.
CREATE ALTER DROP 명령어는 DDL임.
INSERT UPDATE DELETE는 DML임.
데이터를 뭔가 바꿀 때 DML을 사용함.
행 추가는 데이터가 추가되는 것임.
테이블에 새 행 추가
테이블의 기존 행 수정
테이블에서 기존 행 제거
트랜잭션 중에서 오라클이 가장 정확함. 이는
금융회사에서 오라클을 가장 많이 쓴느 이유임.
언두? 라는 것 때문에 가장 정확함.
변경 전 변경 후 정보를 오라클이 가지고 있음.
아직 오라클을 따라올 DB가 아직 없음.
INSERT 문 구문
:
테이블 전체 로우에 넣거나
VALUES 는 그 값을 의미함.
컬럼이 세 개면, 지정하면 값도 3개여야함
컬럼 순서와 데이터 타입이 동일해야 함.
만약 VARCHAR(2)타입에 숫자를 넣으면
숫자 문자 타입을 할 때 자동으로 해주지만
초반에는 잘 넣어주자. ‘’ 싱글 쿼테이션
VALUES 는 한 행씩 넣자.
데이터를 확인하는 방법으로 확인하자.
Null값을 가진 행 삽입
hire_date에 입사 일자를 넣는 것임.
이것을 커런트 데이트 함수를 사용하거나
sysdate 써도 됨.
함수를 쓸 때 날짜 데이터를 넣을 때, 영어권 기준
국내 기준이 있음.
INSERT 문을 subquery로 작성하기.
sales_reps 테이블이 있어야 가능한 작업임.
시타스는 없는 상태에서 어제 만들었음.
빈 껍질만 만들고 싶을 경우
씨타스에서WHERE 1=0 으로 생성 후 인서트 하자.
굉장히 많이 쓰는 방법임.
데이터 마이그레이션에서 가장 많이 씀.
ss를 눌러도 가능한 이유는.
Alias를 걸어 놓았음. 별칭
쉘 스크립트를 잘 배우자. 많이 사용함.
다른 창에서 안 나오는 이유는?
commit을 안해서 그럼. 데이터를 변경하면 커밋을
찍어줘야 트랜잭션이 변경된 것임. 트랜잭션 로그가
끝나야 함.
롤백은 원래 값으로 되돌리겠다는 의미.
commit
롤백하고 트랜잭션 끊것 같은데 나오는 이유는
인서트는 SQL 디벨로퍼에 날렸기 때문에 해당
섹션의 트랜잭션이기 때문에 인서트 끊은 곳에서
롤백 등 인서트를 하거나 데이터를 변경하거나
커밋을 해야지만 완료가 됨.
UPDATE 문 구문
:
조건절을 줘야 함. 조건을 안 주면 안 바뀜.
바뀌고 싶은 것만 바꾼느 것이 UPDATE임
조건절 없이 사용하는 경우는 없음.
데이터 바꾸기 전에는 백업을 해야함.
백업 조건절과 업데이트한 조건절은 동일함
같은 조건절이어야 백업하고 데이터를 받을 수 있음.
INSERT는 상관없지만, UPDATE는 DELETE는
데이터를 변경하면 반드시 백업을 받아놓고 작업하자.
테이블의 행 갱신
:
업데이트는 조건절에서 쓰자.
UPDATE는 원래 것을 삭제하고 INSERT 하는 개념임.
UPDATE 후 두 개의 값을 바꾸는 것임.
반드시 데이터 타입이 같아야 함. 넘버 타임이면 같은 것으로
들어가야 함.
조건절 없이 DELETE 문 쓰면 다 날아감. 조심해야 함.
DELETE도 조건절을 반드시 줘야 함. DELETE하기전에
백업해야 함.
TRUNCATE 문
:
DELETE 문과 어떤 것이 다를까?
TRUNCATE는 조건 없이 다 날리는 것임. 데이터를 모두 삭제함.
안에 있는 데이터만 날릴 때 사용함, 지우는 속도가 제일 빠름.
대량의 데이터를 지우거나 할 때 사용함.
예를 들어, 50억 건의 데이터의 용량이 800GB라고 가정하자.
여기서 나는 25억건을 삭제할 것임. 년도는 1994년부터 2003년
까지 있음. 2013년 까지의 데이터를 삭제하고 13년부터 23년 데이터
를 갖고 있고 싶음. 이런 상황에서 어떤 문을 사용하는 것이 빠를까?
DELETE 할 경우에는 언두라는 곳에 쌓아야 하므로 오래 걸림.
너무 큰 테이블에 빠른 작업을 할 경우에는
2023년 2003년을 다른 데이터에 보내놓고 트런케이트를 사용하여
빠르게 지움. 드롭보다 훨씬 빠름. 블록이 쌓다 지움.
트랜잭션이 발생하지 않음. TRUNCATE는 조건없이 데이터를
날리는 것이기 때문에 반드시 조치를 해야함.
만일 로그성 테이블일 경우 년도별...로 갖고 있다면,
1994년부터 갖고 있었음. 로그를 1년치만 갖고있자고
정책이 생기면, 지우는 속도가 제일 빠르다.
UPDATE – OS에서 서버에서 작업을 증가시킴.
INSERT - OS에서 서버에서 작업을 증가시킴.
삭제 전, 변경 전 이미지를 언두에 넣어둠. 복제하는 시간이
걸리고 변경되고 갱신하는데 오래 걸리기 때문에 CPU부하가
생김. 부하가 가장 많이 발생함. DML작업을 할 때 조심해야 함.
은행 영업시간 변경 시 이 작업을 함.
DML 작업은 밤에 주로 함. 테이블 건수를 변경할 때 주로 밤에 함.
은행 데이터는 금융결제원에 모두 갖고 있음.
-100만원 +50만원이 트랜젝션 1임
트랜잭션 정보, 이체 로그 서버가 따로 있는데, 이 작업할 때가
밤에 은행어플 사용 못할 경우임.
DML의 핵심은 트랜잭션임. 내가 걸어놓은 섹션에서 끝내야 함.
롤백이나 커밋을 하는 것이 중요함.
위 3개 하면 트랜젝션 생성함.
DROP은 테이블도 삭제됨.
트랜잭션은 DML이다. 자동으로 롤백됨. 이것이 오라클의 장점임.
commit 및 rollback 문의 이점은 데이터 일관성
COMMIT 과 ROLLBACK만 알자
커밋 때리면 롤백은 안 됨. 커밋 치기 전에 확인하자.
롤백 하고 나서 커밋이 안 됨. 이 둘은 치는 순간 트랜잭션 종료임.
잘못 했을 경우 다시 해야함. 백업의 중요성임.
auto commit은 비추임.
잘못하면 데이터가 틀어짐 사용을 지양하자.
save point를 안 쓰는 이유는?
이것 하는 것보다 트랜잭션 증가하니까 잘 안 씀.
그냥 롤백하면 트랜잭션 전 시점으로 돌아감.
직전으로 돌아감.
커밋은 영구적임. 오라클은 트랙션임. 다른 DB와 오라클의
차이임. 다른 DB는 락을 걸음. 트랜잭션을 락을 걸지만
오라클은 언두로 걸음. A섹션 작업 시작하면 메모리에
넣고 변경 전에 언두에 이미지를 카피함.
데이터 블록이 실제 데이터를 넣는 곳임.
변경하면은 변경할게 하면서 언두를 만듦(변경전 이미지)
언두가 갖고 있는 것을 다른 얘가 봤을떄는 언두를
보기 때문에 락으로 처리를 하지 않음.
트랜잭션과 언두의 사용. 동시에 막 해도 하드웨어가
잘 받쳐주면 부하가 크게 발생하지 않음.
락을 건다는 것은 해당 일을 못하게 우선 순위를 주듯이
번호표 주듯이, 순서대로 해야하기 때문에 기다려야 함.
오라클은 동시에 처리할 수 있음. 다른 DB는 트랜잭션을
구현하지 못함. 오라클은 중복을 안 생기게 해줌.
일관성은 오라클이 가장 제대로 구현함.
동시에 했을 때 지연이 발생하지 않음.
커밋 롤백 안 하면 잠깐 자리 비웠다가 시간 많이 경과 시
어떻게 될까? 다른 사람이 하게 됨.
보관시간이 있음. 시스 유저로 변경 가능.
purge; 는 영구삭제임.
SQL 함수
:
함수를 거쳐서 결과값을 보여줌.
SQL에서 사용하는 함수는 당일 행 함수와 여러 행 함수가 있음.
문자나 숫자
문자열에는 ‘’ single quotation을 반드시 넣자.
만약 VARCHAR2에서
TO_NUMBER
문자를 날짜형으로 바꿀 때 TO_DATE를 사용함.
대신에 날짜 데이터를 문자데이터로 바꿀 때는 TO_CHAR를
사용함. BETWEEN AND 기간 검색할 때 많이 사용함.
to_char 는 모두 문자열로 바꿀 때 많이 사용함.
그룹함수 사용
:
그룹함수란? 기존에는 한 행이였지만 그룹행을 통해 그룹의
토탈값이 얼마인지 데이터가 총 얼마인지 더하기를 해서
샐러리의 연봉을 구하거나 최고로 큰 값, 작은 값을 구할 때
많이씀.
그룹함수를 쓸 때는 끝에 GROUP BY를 꼭 써야함을 기억하자.
컬럼의 개수를 그대로 그룹 바이에 넣고 함수를 그대로 넘어옴
select owner,segment_name,segment_type,tablespace_name,bytes
from dba_segments;
실제로 파일 블록안에 들어있는 것이 세크먼트인데 종류와 사이즈 볼 때 많이
사용함.
세그먼트 타입은 테이블과 인덱스가 있는데 저장공간을 차지하는데 이를 통해
저장공간을 확인할 수 있음. 실제로 저장할 수 있는 공간임.
OS 안에 오라클 계정을 만듦.
이 안에 데이터베이스가 있음.
ora19c라고 있음. 우리는 그동안 hr라는 유저로 테스트 했음.
HR유저:
유저를 스키마라고 함. 스키마 안에 table과 index, 나머지 기타
객체가 있음. 스키마에는 대표적으로 sys라는 유저가 있음
OS의 유저와 비슷한게 sys임. 시스템이라는 유저는 시스와 유사하지만
한 단계 아랫단계임. 둘 다 OS의 루트같은 존재임.
일반 사용자는 유저를 생성해야 하지만, 연습 할 때 이미 hr이 있었음.
유저 생성 시 create user T1 indetified by paw ; + enter
grant(권한) connect, resource to user명 T1; + enter
T1이 쓸 수 있는 스키마가 생성됨. 보는 방법은 dbausers를 조회
하면 됨. 보통 dba
user
v$
은 모두 뷰라고 부름. 데이터 딕셔너리 뷰라고 부름.
이 안에 DB유저 정보가 모두 들어있음.
컬럼했을 때 봤던 뷰는 user_tab_columns 한단계 위의 역할이
dba_tab_columns
일반 유저가 로그인 한 것은 user 나머지 뷰는 모두 동일함.
v 시작하는 것 역시 sys system관련 것임.
v$로 시작하는 건 sys아니면 시스템 계정에서만 조회가 가능함.
일반유저는 권한을 주어야 볼 수 있음.
이 안에 메타정보가 들어있음. 데이터 타입 랭스(length) 등등.
데이터 딕셔너리는 많음. 외우지 말자.
v$ instance; 메모리 관련.
화면을 통해 동작하는 것은 메모리임. 절대 디스크가 아님
사용자 눈에 보이지 않음. 디스크에 다이렉트는 없음.
OS에서 프로세스란?
실행중인 프로그램임.
데몬이란?
백그라운드에서 동작중인 프로세스임.
대부분 조회할 때는 메모리 관련해서 보자.
v$로 시작하는 것을 볼 때
섹션, 인스턴스 상태 정보 등...
메타정보를 보겠다.
테이블의 상태, 테이블명, 컬럼명, 데이터 타입, 랭스, 제약조건 컬럼 어떤
것 걸렸는지, 인덱스, 인덱스가 걸려있는 컬럼 정보, 유저정보, 유저의 권한
정보, 테이블의 권한정보, 오브젝트들의 정보, 기타 등등...
봐야 하는 DB가 엄청 많음.
dba로 시작하는 딕셔너리 뷰는 끝에 대부분 s로 끝남.
제약조건이 걸려있는 select * from dba_constraints;
로 보면 컨스트레인트 타입, 테이블 네임 확인 가능
그런데 어떤 컬럼이 걸려있는지 확인이 불가능함.
어떤 컬럼 컨스트런트 타입 등 다 나오지 않음.
두 개를 join해서 내가 원하는 방식의 데이터를 보겠다는 의미임
두 개의 키 값을 서로 맞춰야 함. equal join으로 맞추자.
두 개의 owner를 = 조건으로 맞추자.
두 개의 맞춘 것을 통해 교집합을 만들자. and 전산자로
교집합을 만들고 owner가 hr인 것을 뽑겠다.
테이블명이 employee인 것을 찾는 것임.
join은 여러 가지 테이블 뷰 원하는 데이터를 뽑아내는 것임.
하나의 뷰에 모든 것을 볼 수 없기 때문에 join해서 보는 것임.
이런식으로 사용하는 것이 대부분임. A테이블 B테이블을 join으로
테이블명 다음에 별칭 하나 주고 table2 별칭 2하나주고
a.column명
DB오브젝트를 통해 명렁어를 파악하자.
owner, group by
desc를 통해 먼저 전부 확인하자.
집합 연산자 사용
:
UNION
UNION ALL
INSERSECT
MINUS – 빼고 나머지 중복되는 것 없음.
privilege – 권한에 관한 문제임. 권한을 확인할 때 사용.
서브 쿼리로 빼서 두 개를 union all로 합치고
sys roll 권한을 합쳐서 한 번에 보여줌.
grantee는 권한을 받은 사람.
privs는 권한 으로 두 개는 같아야 함.
|| 합산연산자
권한 여러개를 합친 것을 role이라고 함.
권한 받을 유저명을 grantee에 적음.
UNION ALL을 더 많이 사용함. 특히 개발자 분야에서.
중복은 여러분이 찾으세요. ^^
권한은 sys에서 한 번에 주는 것이 좋음.
다만, 권한을 주는 것은 상당히 조심해야 함.
hr은 조회 권한만 줬지 변경할 수 있는 권한을 주지 않았음.
데이터를 받을 수 있는곳이 있음.
SI 기업
DB에도 SI 회사 인지?
중견기업 이상의 SI 기업으로 입사하면 괜찮음.