웹개발 (2023.06.12.~2023.11.07.) 강의에서 공부한 Oracle 내용입니다.
readme 파일에 목차 및 내용 정리해두었으니 참고 부탁드립니다.
감사합니다.🥰
데이터가 모여있는 기지
DB를 관리할 수 있는 구체적인 시스템
예) 오라클, (마리아DB, MySQL,) MS-SQL, MongoDB - 몽구스, ...
📌 MongoDB: noSQL
- 스키마가 없다. 표가 없다.
- K,V 형태로만 짜여져 있다.
- 따라서 속도가 빠르다.
sqlplus system/1234
SQL> @C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
SQL> show user
USER is "SCOTT" SQL> conn system/1234
SQL> alter user scott identified by 1234;
SQL> conn scott/1234
SQL> show user
USER is "SCOTT"
DBMS의 소통 방식 |
---|
사용자 |
↕ |
응용프로그램 |
↕ |
DBMS |
테이블끼리 서로 관계를 맺는다.
Table A (USER, INFOMATION, CUSTOMER)
Table B (ORDER)
번호(PK) 이름 나이 아이디(UK) 주문번호(PK) 번호(FK) 날짜 상품수량
1 이도은 20 lde1234 20230705001 3 2023-07-05 5
2 제우스 21 zeus6666 20230705002 4 2023-07-05 100
3 에로스 22 love7777 20230703001 1 2023-07-03 35
4 프시케 18 beauty1234 20230703002 1 2023-07-03 15
5 하데스 19 hades7878 20230703003 1 2023-07-03 25
- 하나의 정보를 행, 하나의 집합을 열
- PK: primary Key: 구분점, 중복이 있으면 안된다.
- 고유한 값
- 각 행의 구분점으로 사용된다.
- 중복이 없고 NULL을 허용하지 않는다.
- NULL: 아직 어떤 값을 넣을지 모르겠다는 의미로 넣는 값
- FK: Foreigner Key: 외부 테이블 구분점
- 다른 테이블의 PK를 참조해서 쓰는 것(PK(일반적으로 번호)만 가지고 그 테이블의 정보를 다 가지고 올 수 있게 된다.)
- 보통 테이블끼리 관계를 맺을 때 사용한다.
- 중복이 가능하고 NULL도 허용한다.
- UK: UNIQUE KEY
- NULL은 허용하지만 중복은 허용하지 않는다.
- COLUMN(열, 속성, 필드): 공통된 값들의 주제
- ROW(행, 레코드, 튜플): 하나의 정보
📌 Schema
- 위와 같은 구조를 가지는 것을 Schema, Table, Relation(Oracle), Class 라고 부른다.
- No Schema: 스키마가 없는
📌 컴파일 언어와 인터프리트 언어
- 한번에(한페이지): 웹개발(java, python)
- 파일 단위로 해석한다.(일괄처리)
- 수정이 거의 없을 때 효율적이다.
- 한줄씩: AI(잦은 수정 -> python)
- 한 줄 단위로 해석한다.(개별처리)
- 빈번한 수정 또는 부분 실행시 효율적이다.
Python: 인터프리터 안에 컴파일러가 있다.
DBMS와 소통하는 언어
- 테이블 만드는 것(명령어들)
- 테이블 조작, 제어 관련 쿼리문
- 복구가 안됨
1. CREATE : 테이블 생성
CREATE TABLE [테이블명]( [컬럼명] [자료형(용량)] [제약조건], ... );
2. DROP : 테이블 삭제
DROP TABLE [테이블명]
3. ALTER : 테이블 수정
- 테이블명 수정 : RENAME TO [새로운 테이블명]
- 컬럼 추가 : ADD([새로운 컬럼명] [자료형(용량)])
- 컬럼명 변경 : RENAME COLUMN [기존 컬럼명] TO [새로운 컬럼명]
- 컬럼 삭제 : DROP COLUMN [기존 컬럼명]
- 컬럼 수정 : MODIFY([기존 컬럼명] [자료형(용량)])
-- 제약조건 추가(PK)
ALTER TABLE 테이블명 ADD CONSTRAINT PK_테이블명 PRIMARY KEY(ID);
-- 제약조건 추가(NOT NULL)
ALTER TABLE 테이블명 MODIFY 컬럼명 자료형 NOT NULL;
-- 제약조건 삭제(PK)
ALTER TABLE 테이블명 CONSTRAINT 제약조건명;
-- 컬럼 추가(성별)
ALTER TABLE 테이블명 ADD(컬럼명 자료형);
-- 컬럼 이름 수정
ALTER TABLE 테이블명 RENAME COLUMN 컬럼명 TO 새로운컬럼명;
-- 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
-- 컬럼 수정(자료형)
ALTER TABLE 테이블명 MODIFY(컬럼명 바꿀자료형(혹은 자료형, 추가 제약조건));
4. TRUNCATE : 테이블 내용 전체 삭제
TRUNCATE TABLE [테이블명]
✨ 용량은 항상 넉넉하게 주도록 한다.
- 숫자
- NUMBER(precision) : 정수
- NUMBER(precision, 소수점 자리수) : 실수
- 문자열
- CHAR(용량) : 고정형 - CHAR(4)에 'A'를 넣으면 A^^^ 빈 자리가 공백으로 채워진다. - 형식을 정한 날짜, 주민등록번호처럼 글자 수가 절대 변하지 않는 값을 넣는다.
- VARCHAR(용량), VARCHAR2(용량) : 가변형
- 값의 길이 만큼 공간이 배정된다.
- 글자 수에 변화가 있는 값 넣는다.
- 날짜
- DATE : FORMAT에 맞춰서 날짜를 저장하는 타입
Script: ctrl + ]
이름 변경: F2
글자크기 변경: fn + C + +
ctrl + enter: 실행
테이블 명이 ORACLE 에서 사용하는 KEYWORD 일 수도 있기 때문에 앞에 TBL(TABLE)을 붙여준다.
데이터의 정확성, 일관성, 유효성이 유지되는 것
- 정확성: 데이터는 애매하지 않아야 한다.
- 일관성: 각 사용자가 일관된 데이터를 볼 수 있도록 해야 한다.
- 유효성: 데이터가 실제 존재하는 데이터여야 한다.
추상적인 주제를 db에 맞게 설계하는 것
- 요구사항 분석
- 회원, 주문, 상품 : 3가지를 관리하고자 한다.
- 개념적 설계(개념 모델링)
회원 주문 상품
----------------------------------
번호 주문번호 상품번호
----------------------------------
비밀번호 주문날짜 상품명
이름 회원번호 가격
주소 상품번호 재고량
이메일
생일
아이디
- 논리적 설계(논리 모델링)
회원 주문 상품
----------------------------------------
번호PK 주문번호PK 상품번호PK
----------------------------------------
비밀번호 주문날짜 상품명
이름 회원번호FK 가격
주소 상품번호FK 재고량
이메일
생일
아이디UK
- 물리적 설계(물리 모델링)
TBL_USER
-----------------------
id : NUMBER PRIMARY KEY
-----------------------
user_id : VARCHAR2(1000)
user_pw : VARCHAR2(1000)
user_address : VARCHAR2(2000)
user_email : VARCHAR2(2000) : UNIQUE
user_birth : DATE
TBL_ORDER
TBL_PRODUCT
- 구현
- 삽입/수정/삭제의 이상현상(중복된 데이터때문)을 제거하기 위한 작업
- 데이터의 중복을 최소화하는 데에 목적이 있다.
- 5차 정규화까지 있으나(테이블이 너무 많이 쪼개진다.) 보통은 3차 정규화까지만 진행한다.
같은 성격과 내용의 컬럼이 연속적으로 나타날 경우.
상품명
와이셔츠1, 와이셔츠, 와이셔츠3
상품명1 상품명2 상품명3
와이셔츠1 와이셔츠2 와이셔츠3
상품명
와이셔츠1
와이셔츠2
와이셔츠3
조합키(복합키)로 구성되었을 경우 조합키의 일부분에만 종속되는 속성이 있을 경우(부분 종속)
- 하나만 있어도 다른 컬럼 내용을 알 수 있으면 안된다.
- 그것은 다른 테이블로 빼준다.(분리)
- 후에 연결해줘야 한다. FK 설정
- 분리해준 테이블이 PK, 원래 테이블이 FK
꽃
이름 색상 꽃말 과
해바라기 노란색 행운 국화
장미 빨간색 사랑 장미
⬇️ 2차 정규화 진행: 조합키 + 조합키가 모두 있어야 알 수 있는 컬럼만 둔다.
꽃
이름 색상 꽃말
해바라기 노란색 행운
장미 빨간색 사랑
과
이름 과
해바라기 국화
장미 장미
PK가 아닌 컬럼이 다른 컬럼을 결정하는 경우
- PK 말고 다른 컬럼이 다른 컬럼을 결정하면 안된다.
- 이행함수 종속 제거
- 다른 컬럼을 다른 테이블의 PK로!
- 너무 자주 조회되는 테이블은 반정규화로 다시 합친다.
회원번호 이름 우편번호
1 이도은 12345
2 오라클 56466
우편번호 시 구 동
12345 서울 서초 서초
56466 서울 강남 역삼
📌 데이터베이스에서 정규화가 필요한 이유 데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 인해 공간이 낭비된다.
이런 현상을 이상(Anomaly)현상이라고 한다.
회원번호와 프로젝트코드 두 컬럼의 조합키로 설정되어 있는 테이블이고 한 사람은 하나의 부서만 가질 수 있다.
회원번호 이름 부서 프로젝트코드 급여 부서인원
22080101 이도은 개발팀 ABC0001 3000 4
22080101 이도은 개발팀 DEF1112 2000 4
22080101 이도은 개발팀 CBA9474 4000 4
22080104 제우스 기획팀 EFG0881 5000 2
22081106 하데스 디자인팀 GHI9991 6000 3
✔️ 삽입 이상
- 새 데이터를 삽입하기 위해 불필요한 데이터도 삽입해야하는 문제
- 담당 프로젝트가 정해지지 않은 사원이 있다면,
프로젝트 코드에 NULL을 작성할 수 없으므로 이 사원은 테이블에 추가될 수 없다.
따라서 '미정'이라는 프로젝트 코드를 따로 만들어서 삽입해야 한다.
- 담당 프로젝트가 정해지지 않은 사원이 있다면,
✔️ 갱신 이상
- 중복 행 중에서 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
- 한 명의 사원은 반드시 하나의 부서에만 속할 수 있다.
만약 "이도은"이 보안팀으로 부서를 옮길 시 3개 모두 갱신해주지 않는다면 개발팀인지 보안팀인지 알 수 없다.
- 한 명의 사원은 반드시 하나의 부서에만 속할 수 있다.
✔️ 삭제 이상
- 행을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제
- "하데스"가 담당한 프로젝트를 박살내서 드랍된다면 "하데" 행을 모두 삭제하게 된다.
따라서 프로젝트에서 드랍되면 회원정보를 모두 드랍하게 된다.
- "하데스"가 담당한 프로젝트를 박살내서 드랍된다면 "하데" 행을 모두 삭제하게 된다.
회원번호 프로젝트코드 급여
22080101 ABC0001 3000
22080101 DEF1112 2000
22080101 CBA9474 4000
22080104 EFG0881 5000
22081106 GHI9991 6000
회원번호 이름 부서 부서인원
22080101 이도은 개발팀 4
22080104 제우스 기획팀 2
22081106 하데스 디자인팀 3
회원번호 이름 부서
22080101 이도은 개발팀
22080104 제우스 기획팀
22081106 하데스 디자인팀
22080103 에로스 개발팀
부서 부서인원
개발팀 4
기획팀 2
디자인팀 3
1. SELECT: 조회(검색)
SELECT [컬럼명1, 컬럼명2, ...]
FROM [테이블명]
WHERE [조건식]
2. INSERT: 추가
① 컬럼명을 생략할 수 있으며, 이 경우 DEFAULT 제약조건이 발생된다.
(항상 똑같은 값은 DEFAULT 설정해두고 컬럼 생략해주면 DEFAULT 값이 들어간다.)
INSERT INTO [테이블명] ([컬럼명1, 컬럼명2, ...])
VALUES ([값1, 값2, ...])
② 모든 값을 전부 작성해야 되며, 컬럼명은 직접 작성하지 않는다.
INSERT INTO [테이블명]
VALUES([값1, 값2, ...])
3. UPDATE: 수정
UPDATE [테이블명]
SET [기존 컬럼명1] = [새로운 값1], [기존 컬럼명2] = [새로운 값2], ...
WHERE [조건식]
4. DELETE: 삭제
DELETE FROM [테이블명]
WHERE [조건식]
>, < : 초과, 미만
>=, <= : 이상, 이하
= : 같다
<>, !=, ^= : 같지 않다
AND : 둘 다 참이면 참
OR : 둘 중 하나라도 참이면 참
📌 위 연산자들은 WHERE 절에서 사용 가능하다.
여러 테이블에 흩어져 있는 정보 중
사용자가 필요한 정보만 가져와서 가상의 테이블처럼 만들고 결과를 보여주는 것
정규화를 통해 조회 테이블이 너무 많이 쪼개져 있으면
작업이 불편하기 때문에 조회의 성능을 향상시키기 위해서 JOIN을 통해 합친 후 사용한다.
조건이 일치하는 값만 합쳐서 조회
(FALSE 면 합쳐지지 않음)
FROM [테이블명]
INNER JOIN [테이블명]
ON 조건식
INNER JOIN [테이블명]
ON 조건식
...
- 세타조인(막조인) ➡️ 사용지양
FROM [테이블명], [테이블명], [테이블명]
WHERE 조건식
- 등가조인
- ON절에 등호가 있을 때, 서로 관계를 맺고 있는 테이블끼리 JOIN할 때 자주 사용된다. (PK = FK)
- 비등가조인
- ON절에 등호가 없을 때
OUTER JOIN 은 조건식이 FALSE라도 무조건 나와야하는 정보가 있는 테이블이 있을 때 사용
ON절에 작성된 조건식이 FALSE 일지라도 모든 정보를 조회해야 할 때 사용한다.
(INNER JOIN 은 ON 절에 있는 조건이 TRUE 일 때만 합친다. )
- LEFT OUTER JOIN
- 선행 테이블의 모든 정보를 가져오고 싶을 때 사용한다.
- RIGHT OUTER JOIN
- 후행 테이블의 모든 정보를 가져오고 싶을 때 사용한다.
(패턴 이름): 설계의 약속 = 패턴 = 소프트웨어 디자인 설계 패턴
- DB 에 있는 컬럼을 받을 준비를 한다.
- 컬럼의 개수만큼 필드를 만든다.
- 화면에서는 메소드밖에 쓰지 못하니까, 값에 접근하고 세팅할 수 있는 메소드를 만들어라는 의미해서 필드에 private 을 붙여준다.
필드에 private 붙이고
getter, setter 만들기
object toString 재정의
hashcode 재정의
VO: Value Object
- Java 에는 없다.
- 서버가 있어야 한다.
- Java 에 "쿼리" 작성
- 실제 데이터에 접근할 수 있는 쿼리를 모아놓은 파일
- Data Access Object(DAO)
- 화면에서 DAO 를 실행
- select 절에 결과가 나오면 메소드
📌 TCL: Transaction: 하나의 서비스를 구현하기 위해 필요한 쿼리의 묶음
📌 Commit: 반영을 fix하는 것
📌 Rollback: 이전 commit 시점으로 돌아가는 것
📌 NVL: null 이면 앞의 값 적용, null 이 아니면 0 적용하는 메소