[SQLD] SQL기본
관계형 데이터베이스
데이터 베이스란 여러 사람이 공유해 사용할 목적으로 체계화하여 통합, 관리하는 데이터의 집합이며 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다.
그중 관계형 데이터 베이스는 릴레이션 형태의 자료구조를 갖고있는 데이터베이스로 릴레이션을 사용해 집합 연산과 관계 연산이 가능하다.
릴레이션 = 테이블 = 엔티티
튜플 = ROW
집합 연산
집합 연산 | 설명 |
합집합(Union) | - 두 개의 릴레이션을 하나로 합 - 중복된 행(튜플)은 한 번만 조회 |
차집합(Difference) | - 본래 릴레이션에는 존재하고 다른 릴레이션에는 존재하지 않는 것 조회 |
교집합(Intersection) | - 두 개의 릴레이션 간에 공통된 것 조회 |
곱집합(Cartesian product) | - 각 릴레이션에 존재하는 모든 데이터 조합 연산 |
합집합 - UNION , UNION ALL
- UNION - 합집합, 데이터 중복 제거, 정렬
- UNION ALL - 합집합, 데이터 중복 포함, 정렬 X
SELECT EMPNO FROM EMP WHERE SAL <= 2000
UNION -- UNION ALL
SELECT EMPNO FROM EMP WHERE SAL >= 5000;
차집합 - MINUS(ORACLE) / EXCEPT(MS-SQL)
SELECT EMPNO FROM EMP WHERE EMPNO = 7369 OR EMPNO = 7499 OR EMPNO = 7521
MINUS
SELECT EMPNO FROM EMP WHERE EMPNO = 7369;
--결과 7369 데이터 제거
교집합 - INTERSECT
SELECT EMPNO FROM EMP WHERE EMPNO = 7369 OR EMPNO = 7499 OR EMPNO = 7521
INTERSECT
SELECT EMPNO FROM EMP WHERE EMPNO = 7369;
곱집합 - CROSS JOIN
관계 연산
- 선택 연산 - WHERE 절
- 투영 연산 - SELECT 절
- 결합 연산 - JOIN
- 나누기 연산 - DIVISION
연산순위
괄호 > 부정 > 비교 > 논리 AND > 논리 OR
SQL 종류
- DDL(데이터 정의어) - 구조 정의 언어
- CREATE / ALTER / DROP / RENAME/ TRUNCTATE
🔥 ORACLE은 DDL 이후 AUTOCOMMIT / SQL-Server는 X
Oracle 과 SQL Server 차이
# Oracle
ALTER TABLE CONTACTS
MODIFY (
EMAIL VARCHAR2(500),
PHONE VARCHAR2(500)
)
# SQL-Server
ALTER TABLE CONTACTS
ALTER COLUMN(
EMAIL VARCHAR2(500)
)
ALTER TABLE CONTACTS
ALTER COLUMN(
PHONE VARCHAR2(500)
)
- 오라클 다중 컬럼 변경 가능, MS-SQL 다중 컬럼 변경 불가능 하나씩 작성해야함
2. DML(데이터 조작어) - 입력, 수정, 삭제, 조회
- SELECT / INSERT / UPDATE / DELETE
🔥 절차적 데이터 조작어
- 사용자가 무슨(what) 데이터를 원하며, 어떻게(how) 접근하여 처리해야 하는지를 명세하는 저급 데이터 언어
- 한번에 하나의 레코드(one record as a time)를 검색하여 호스트언어와 함께 처리하는 특성을 가짐
🔥 비절차적 데이터 조작어
- 사용자가 무슨(what) 데이터를 원하는지만 명세하고, 어떻게(how) 접근하여 처리할 것인가에 대해서는 DBMS가
처리하는 고급 데이터 언어
- 한번에 여러 개의 레코드 처리
- 질의어 (Query Language)
3. DCL(데이터 제어어) - 권한 부여, 회수
- GRANT / REVOKE
4. TCL(트랜잭션 제어어) - 트랜잭션 제어
- COMMIT / ROLLBACK / SAVEPOINT
🔥 ORACLE은 COMMIT 이후 AUTOCOMMIT / SQL-Server는 X
실행 순서
Parsing → Execution → Fetch
실행 순서 | 설명 |
Parsing | -SQL문의 문법 확인, 구문 분석 - 분석이 끝난 SQL문 Library cache에 저장 |
Execution | -옵티마이저가 수립한 실행 계획에 따라 SQL문 실행 |
Fetch | - 데이터 인출 |
제약조건(CONSTRAINT)
제약조건 | 설명 |
PRIMARY KEY (기본키) | NOT NULL + UNIQUE |
FOREIGN KEY (외래키) | 참조 무결성 |
CHECK | 속성 도메인 (값의 범위) |
NOT NULL | 필수 값 |
UNIQUE | 유일한 값 NULL 가능 |
트랜잭션
데이터베이스의 상태를 변화시키기 해서 수행하는 논리적인 작업 단위를 의미한다
특징 | 설명 |
원자성(ATOMICITY) | All or Nothing |
일관성(CONSISTENCY) | 실행되기 전의 DB가 잘못되어 있지 않다면 트랜잭션 실행 이후에도 잘못이 있어선 안된다 |
고립성 = 격리성(ISOLATION) | 실행도중 다른 트랜잭션의 영향을 받아 잘못된 결과가 있어선 안된다 |
영속성(DURABILITY) | 성공적으로 수행되면 영구적으로 저장된다 |
트랜잭션 격리레벨
- READ UNCOMMITED - TRANSACTION 격리 레벨 0
- 다른 트랜잭션에서 아직 커밋되지 않은 내용도 참조 가능
- DIRTY READ 발생
- 아직 커밋되지 않은 데이터
- READ COMMITED - 트랜잭션 격리 레벨 1
- 다른 트랜잭션에서 커밋된 내용만 참조 가능
- 온라인 서비스에서 가장 많이 사용하는 격리 레벨 수준
- 오라클 기본 격리 수준
- Non-Repetable Read
- 한 트랜잭션 내에 같은 쿼리 두번 수행시 그 사이에 다른 트랜잭션이 값을 수정,삭제해 두 쿼리 값이 다름
- Repeatble Read - 트랜잭션 격리 레벨 2
- 트랜잭션에 진입하기 이전에 커밋된 내용만 참조 가능
- Mysql InnoDB 기본 격리 수준
- Phantom Read 발생
- 한 트랜잭션 내에 같은 쿼리 두번 수행시 첫번째 쿼리에서 없든 유령 레코드가 두번째 쿼리에 발생
- SERIALIZABLE - 트랜잭션 격리 레벨 3
- 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션에 접근 할 수 없음
VIEW
가상의 테이블이다. 테이블을 참조해 원하는 컬럼만 조회가 가능하다.
VIEW의 특징
- 참조된 테이블이 변경되면 뷰도 변경된다.
- 검색은 참조된 테이블과 동일하게 가능하며 입력,수정,삭제는 제약된다.
- 한번 생성되면 변경할 수 없어 삭제 후 재생성 해야한다.
- ALTER 사용할 수 없다.
VIEW의 장점과 단점
장점 | 단점 |
- 특정 컬럼만 조회 = 보안 기능 - 데이터 관리 간편 - SELECT문 간단 -하나의 테이블에 여러개 뷰 생성 가능 |
- 독자적인 인덱스 불가 - 삽입, 수정,삭제 연산 제약 - 데이터 구조 변경X |
형 변환
두 개의 데이터의 데이터 타입(형)이 일치하도록 변환하는 것을 의미한다.
형 변환 함수 | 설명 |
TO_NUMBER(str) | 문자열을 숫자로 치환 |
TO_CHAR(int / date, [FORMAT]) | 숫자 혹은 날짜를 지정된 format의 문자로 변환 |
TO_DATE(str, [FORMAT]) | 문자열을 지정된 FORMAT의 날짜형으로 변환 |
명시적 형 변환
형 변환 함수를 사용해 데이터 타입을 일치 시킨다.
암시적 형 변환
개발자가 형 변환을 하지 않았을 경우에 자동으로 형 변환을 수행한다.
ROWNUM & ROWID
ROWNUM
SELECT문 결과에 대해 논리적인 일련번호 부여한다.
# 출력되는 값은??
SELECT *
FROM EMP e
WHERE ROWNUM > 1;
조회되지 않음 → 1행 가져와서 rownum 붙여주려고 하지만 조건에 맞지않아 날아감
- 보통 10 이하의 데이터 추출시 사용
ROWID
데이터를 구분할 수 있는 유일한 값