1. 트랜잭션 (A.C.I.D) ex) 은행 업무를 예시로 들어 봅시다
원자성(Atomicity) : 하나라도 실패시 모두 실패
ex) A거래처에 1억 입금하는 도중에 서버 에러로 1억이 입금이 안되면 취소 되야겠죠??
지속성(Consistency) : 트랜잭션 성공 후 일관된 DB 상태 보존
ex) A거래처에 1억을 입금하면 내 계좌에는 1억이 없어지고 상대편 계좌에는 1억이 생성되야하는것
고립성(Isolation) : 작업도중 다른 트랜잭션이 들어와 업무 방해 못함
ex)A거래처에 1억 먼저 입금하고 B거래처에 2억 입금하면 3억이 합계가되서 보여지는 경우가 생기면 안되겠죠?
영속성(Durability) : 트랜잭션이 성공하면 영구적으로 DB에 반영
ex)A거래처에 1억 입금한 내역은 절대 사라지면 안됩니다.
2. TCL 언어
Commit : 트랜잭션을 메모리에 영구 저장 / Rollback : 트랜잭션 내역 무효화
Checkpoint : Rollback을 위한 시점 지정
※ 예를들어서 insert 업무를 진행하고 commit을 하면 rollback해도 insert 전으로 돌아가지 않습니다.
3. DDL (create, alter, truncate, drop)
● CREATE TABLE 문법
CREATE TABLE 사원 (
사번 VARCHAR(10) PRIMARY KEY, // 기본키 생성 (사번은 유일값만족, null값이 못들어옴)
업무 VARCHAR(20) Foregin key References 부서(부서코드), // 부서 테이블의 부서코드를 참조하는 외래키 생성
이름 VARCAHR(20) UNIQUE, //테이블내 유일값을 가진다
생년월일 CHAR(8) NOT NULL, //NULL값이 들어가면 안된다.
성별 CHAR(1) CHECK(성별='M' OR 성별 = 'F'), //M과 F만 들어가게 체크인 성질 부여
입사일 DATE DEFAULT SYSDATE //기본값을 서버날짜로 설정
);
● CREATE VIEW 문법
사원 테이블의 이름과, 사번을 조회하는 VIEW를 생성하되 뷰 이름은 '사원뷰'로 할것
CREATE VIEW 사원뷰 AS SELECT 이름,사번 FROM 사원;
● CREATE INDEX 문법
인덱스명 : 사원인덱스 , 사원테이블의 사번컬럼 참조
CREATE INDEX 사원인덱스 ON 사원(사번)
● ALTER TABLE 문법
사원 테이블에 전화번호 열 추가 (크기 : VARCHAR(10), 조건 : 테이블내 유일값)
ALTER TABLE 사원 ADD 전화번호 VARCHAR(10) UNIQUE;
사원 테이블에 전화번호 열 변경 (크기 : VARCHAR(20), 조건 : NULL값 들어가면 안됨)
ALTER TABLE 사원 MODIFY 전화번호 VARCHAR2(20) NOT NULL;
사원 테이블에 전화번호 열 삭제
ALTER TABLE 사원 DROP 전화번호;
● DROP 문법
DROP TABLE 사원 : 사원 TABLE 삭제
DROP TABLE 사원 CASCADE : 사원 테이블을 참조하는 테이블도 모두 삭제
DROP TABLE 사원 RESTRICT : 삭제시 다른 테이블은 참조하면서 제거하지 않는 옵션
● TRUNCATE 문법
TRUNCATE TABLE 사원 = 사원안에 있는 모든 데이터 삭제, 사원테이블이 없어지는건 아님
4. DML(SELECT, INSERT, UPDATE, DELETE)
● SELECT GROUP BY 예제
직책, 부서별 기준으로 급여합계가 900만원 이상인 직원을 조회
SELECT 직책, 부서, SUM(급여) AS 급여합계 FROM 급여
GROUP BY 직책, 부서 // 직책, 부서 기준 그룹핑
HAVING SUM(급여) >= 900 // GROUP BY 절에 조건식
ORDER BY 직책 DESC, SUM(급여합계) OR 급여합계 ASC // 직책기준 DESC(내림차순) 급여합계기준 ASC(오름차순)
● JOIN문 예제
A(테이블명 : 도서, 튜플수 : 3개) / B(테이블명 : 가격, 튜플수 : 5개) / 도서코드가 같은 개수 : 2개
SELECT A.책번호, A.책이름, B.도서가격 FROM 도서 A
(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN) 가격 B
ON A.도서코드 = B.도서코드 // 조건식
INNER JOIN 튜플 수 : 2
LEFT JOIN 튜플 수 : 3
RIGHT JOIN 튜플 수 : 5
FULL JOIN 튜플 수 : ( 3 + 5 ) - 2 = 6
CROSS JOIN 튜플 수 : 3 X 5 = 15
● SUBQUERY 예제 (스칼라뷰, 인라인뷰)
단일행 리턴 (스칼라뷰 1개의 컬럼에 1개의 행만 리턴)
SELECT (SELECT MAX(도서가격) FROM 도서 A WHERE A.책번호 = B.책번호 AND A.책이름 = '정보처리기사')
FROM 가격B
인라인뷰 (여러개 리턴 가능)
SELECT MAX(도서가격) FROM 가격 A, (SELECT 책번호 FROM 도서 WHERE 책이람 = '정보처리기사') B
WHERE A.책번호 = B.책번호
중첩서브 쿼리
SELECT MAX(가격) FROM 가격 WHERE 책번호 IN (SELECT 책번호 FROM 도서 WHERE 책번호 = '정보처리기사')
● 집합연산자 (UNION, UNION ALL, INTERSECT, MINUS)
EX) A 테이블 튜플수 10개 / B 테이블 튜플수 8개 / 중첩데이터수 = 3개
SELECT * FROM A UNION SELECT * FROM B = 튜플수 : (10+8) - 3 = 15 (중첩제외)
SELECT * FROM A UNION ALL SELECT * FROM B = 튜플수 : 10+8 = 18 (중첩포함)
SELECT * FROM A INTERSECT SELECT * FROM B = 튜플수 : 3 (중첩수)
SELECT * FROM A MUINUS SELECT * FROM B = 튜플수 : 10-3 = 7 (왼쪽 튜플수 - 중첩수)
● COUNT(*)와 COUNT(열값) 차이
사원 테이블의 사번 튜플수 = 5개 중에 3개는 값이 있고 2개는 NULL값이 있을때
SELECT COUNT(*) FROM 사원 = 튜플수 : 5개 (NULL 포함 카운트)
SELECT COUNT(사번) FROM 사원 = 튜플수 : 3개 (NULL 제외 카운트)
● INSERT 예제
EX) 학생 테이블에 학번:123, 성명:김길동, 학년:1, 수강과목:정보처리기사 데이터를 삽입하시오.
INSERT INTO 학생(학번, 성명, 학년, 과목) VALUES (123, '김길동', 1, '정보처리기사);
● UPADATE 예제
EX) 학번이 123 이고 이름이 김길동인 학년을 2로 고치시오
UPDATE 학생 SET 학년 = 2 WHERE 학번 = 123 AND 이름 = '김길동'
● ROWNUM(), DENS_RANK, RANK 차이
학생점수
이름 | 점수 |
일길동 | 80 |
이길동 | 90 |
삼길동 | 100 |
사길동 | 100 |
SELECT 이름, 점수,
RANK() OVER (ORDER BY DESC) A,
DENSE_RANK() OVER (ORDER BY 점수 DESC) B,
ROW_NUMBER() OVER (ORDER BY 점수 DESC) C
FROM 학생점수
이름 | 점수 | A | B | C |
사길동 | 100 | 1 | 1 | 1 |
삼길동 | 100 | 1 | 1 | 2 |
이길동 | 90 | 3 | 2 | 3 |
일길동 | 80 | 4 | 3 | 4 |
'공부중인것' 카테고리의 다른 글
정보처리기사 중요도 & 공부흐름 스토리텔링 (2) | 2022.06.24 |
---|---|
정보처리기사 실기 (12과목 제품 소프트웨어 패키징) (0) | 2022.06.24 |
정보처리기사 실기 (10과목 애플리케이션 테스트 관리) (0) | 2022.06.22 |
정보처리기사 실기(9과목 소프트웨어 개발 보안 구축) (0) | 2022.06.21 |
정보처리기사 실기(8과목 서버프로그램 구현) (0) | 2022.06.20 |