제3장 SQL 기본
제1절 관계형 데이터베이스 개요
제2절 DDL
제3절 DML
제4절 TCL
제5절 WHERE절
제6절 함수
제7절 Group By, Having 절
제8절 Order By절
제9절 조인(JOIN)
DB : 특정한 기업이나 조직 또는 개인이 필요에 의해 데이터를 일정한 형태로 저장해 놓은 것
DBMS : 효율적인 데이터 관리뿐만 아니라 예기치 못한 사건으로 인한 데이터 손상을 피하고, 필요시 데이터를 복구하기 위한 강력한 기능의 SW
SQL 문장들의 종류
- DML : SELECT, INSERT, UPDATE, DELETE (COMMIT)
- DDL : CREATE, ALTER, DROP, RENAME (AUTO COMMIT)
- DCL : GRANT, REVOKE
- TCL : COMMIT, ROLLBACK
비절차적 데이터 조작어
- 사용자가 무슨(what) 데이터를 원하는지만 명세
절차적 데이터 조작어
- 사용자가 무슨(what) 데이터를 어떻게 (how) 접근해야 하는지 명세 (ex) PL/SQL(Oracle), T-SQL(SQL Server)
정규화
- 데이터의 정합성 확보에 데이터의 입력/수정/삭제 시 발생할 수 있는 이상현상을 방지하기 위해 중복 제거
제약조건을 걸어두는 이유 : 데이터의 무결성 유지를 위함
- PRIMARY KEY : 중복 X, NULL X, 값 하나
- UNIQUE KEY : 중복 X, NULL 가능
- NOT NULL
- CHECK
- FOREIGN KEY : 값 여러 개 가능
제약조건 추가하는 법 (ex) 테이블 생성 시, 기본키 제약 조건 추가)
테이블 생성시 기본키 제약조건 지정
- CONSTRAINT [조건명] PRIMARY KEY ([칼럼명])
- 해당 칼럼을 생성할 때 바로 기본키 지정
테이블의 구조를 변경하여 제약조건 지정
- ALTER TABLE [테이블명] ADD CONSTRAINT PRIMARY KEY [조건명] ON [칼럼명]
테이블 구조 변경
[Oracle]
ALTER TABLE [테이블명] MODIFY (칼럼명1 데이터유형 [DEFAULT] [NOT NULL]) ..
[SQL Server]
ALTER TABLE [테이블명] ALTER (칼럼명1 데이터유형 [DEFAULT] [NOT NULL]) ..(테이블 구조 변경)
RENAME [기존테이블명] TO [바꿀테이블명] (테이블명 변경)
NULL값
- 숫자 0이 아니라, "아직 정의되지 않은 미지의 값"이거나 "현재 데이터를 입력하지 못하는 경우"이다.
테이블 삭제 옵션
- ON DELETE CASCADE : Master 삭제 -> Child 삭제
- ON DELETE SET NULL : Master 삭제 -> Child NULL
- ON DELETE SET DEFAULT : Master 삭제 -> Child DEFAULT
- ON DELETE RESTRICT : Child 테이블에 PK값 없는 경우 -> Master 삭제 허용
- ON DELETE NO ACTION : 참조무결성을 위반하는 삭제/수정 액션 X
테이블 삽입 옵션
- AUTOMATIC : Master PK X -> Master PK 생성 후 Child 입력
- SET NULL : Master PK X -> Child 외부 키 NULL값으로 처리
- SET DEFAULT : Master PK X-> Child 외부 키를 DEFAULT로 처리
- DEPENDENT : Master PK O -> Child 입력 허용
- NO ACTION : 참조무결성을 위반하는 삭제/수정 액션 X
데이터 조회 옵션
- ALL : Default 옵션이므로 별도 표시 X, 중복된 데이터가 있어도 모두 표시
- DISTINCT : 중복된 데이터가 있는 경우 1건으로 처리해서 출력
테이블 생성 시 주의사항
- 테이블명은 객체를 의미할 수 있는 적절한 이름 사용 + 단수형
- 다른 테이블의 이름과 중복 X
- 칼럼명 반드시 문자로 시작, 벤더에서 사전에 정의한 예약어(Reserved Word) X
- A-Z, a-z, 0-9, _, $, # 문자만 허용
count(*), count(칼럼명)
- *은 NULL값을 포함한 카운트, 그 외에는 NULL값 미포함
INDEX 생성
- CREATE INDEX [인덱스명] ON [테이블명] (칼럼명)
테이블 삭제 명령어
DROP | TRUNCATE | DELETE |
DDL | DDL(일부 DML) | DML |
ROLLBACK X | ROLLBACK X | COMMIT 이전 ROLLBACK O |
AUTO COMMIT | AUTO COMMIT | 사용자 COMMT |
테이블이 사용했던 storage를 모두 release | 테이블이 사용했떤 storage중 최초 테이블 생성시 할당된 storage만 남김 | 데이터를 모두 delete, release X |
테이블 정의 자체를 삭제 | 테이블 생성 초기 상태로 만듦 | 데이터만 삭제 |
로그 X | 로그 X | 로그 O |
트랜잭션(transaction)
- DBMS에서 분리될 수 없는 논리적인 작업 단위
커밋(commit) & 롤백(rollback)
- 커밋 : 데이터에 대한 변경사항을 영구적으로 반영
- 롤백 : 데이터에 대한 변경사항을 모두 폐기하고 변경 전의 상태로 되돌림, commit 되지 않은 상위의 모든 트랜잭션을 ROLLBACK, savepoint(저장점)을 정의해하면 롤백할 때, savepoint지점까지 일부만 롤백 가능
[Oracle]
SAVEPOINT SVPT1;
...
ROLLBACK TO SVPT1;
[SQL Server]
SAVE TRANSACTION SVPT1;
...
ROLLBACK TRANSACTION SVTR1;
트랜잭션의 특성
- 원자성(atomicity) : 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지, 전혀 실행되지 않거나 둘 중 하나(all or nothing)
- 일관성(consistency) : 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안 됨
- 고립성(isolation) : 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안 됨
- 지속성(durability) : 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장
트랜잭션의 격리성이 낮을 경우 발생할 수 있는 문제
- Non-Repeatable Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리가 다르게 나타나는 현상
- Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상
- Dirty Read : 다른 트랜잭션에 의해 수행, 커밋되지 않은 데이터 읽기
WHERE절
- FROM절 다음에 위치 (조회되는 데이터의 조건을 설정하여 데이터 제한
연산자의 종류
- BETWEEN a AND b
- IN (list) (Oracle에서는 VARCHAR2 빈 문자열을 NULL로 판단)
- IS NULL
- NOT IN(list)
- LIKE '비교 문자열'
※ NULL값과의 비교(+,-,*,/) 연산은 무조건 NULL값 반환
※ NULL을 조건절에서 사용할 경우 IS NULL, IS NOT NULL 두 개만 사용 가능
연산자 우선순위
- () -> NOT -> 비교 연산자 -> AND -> OR
함수
- 벤더에서 제공하는 함수인 내장 함수(Built-in Function)와 사용자가 정의할 수 있는 함수(User Defined Function)로 나눌 수 있음
- 내장 함수는 단일행 함수(Single-Row Function), 다중행 함수(Multi-Row Function), (집계 함수(Aggregate Function), 그룹 함수(Group Function), 윈도우 함수(Window Function)로 구분
- 다중행 함수, 단일행 함수는 모두 단일 값 반환, 1:M 관계 테이블을 조인하는 경우 두 개의 함수 모두 사용 가능
단일행 함수 종류
종류 | 내용 | 예시 |
문자형 함수 | 문자를 입력하면 문자나 숫자 값 반환 | LOWER, UPPER, SUBSTR, SUBSTRING, LENGTH/LEN, LTRIM, RTRIM, TRIM, ASCII |
숫자형 함수 | 숫자를 입력하면 숫자 값 반환 | ABS(절댓값), MOD, ROUND(해당 자리 반올림), TRUNC(소수점 버림), SIGN(양수 : 1 ,0 : 0, 음수 : -1), CEIL/CEILING(정수 올림), FLOOR(정수 내림), EXP, LOG |
날짜형 함수 | DATE 타입의 값 연산 | SYSDATE/GETDATE(현재 날짜와 시간 출력), EXTRACT(날짜에서 데이터 출력), TO_NUMBER(TO_CHAR(d, 'YYYY' | 'MM' | 'DD'), 1=하루, 1/24=1시간 1/24/60=1분 |
변환형 함수 | 문자, 숫자, 날짜형 값의 데이터 타입 반환 | TO_NUMBER, TO_CHAR, TO_DATE |
NULL 관련 함수 | NULL 처리하기 위한 함수 | NVL/ISNULL, NULLIF, COALESCE |
단일행 NULL 관련 함수 종류
- NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2) : 표현식1 값 NULL-> 표현식2, NULL 아니면 표현식1로 표현
- NULLIF(표현식1, 표현식2) : 표현식1과 표현식2가 같으면 NULL, 같지 않으면 표현식1 리턴
- COALESCE(표현식1, 표현식2, 표현식3 ...) : NULL값 아닌 최초 표현식 리턴, 모두 NULL이면 NULL 리턴
GROUP BY절, HAVING절의 특징
- GROUP BY 절은 행동을 소그룹화 한후, SELECT 절에 집계함수 적용
- 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행
- GROUP BY 절에서는 ALIAS 사용 불가
- 집계 함수는 WHERE 절에 올 수 없다
- HAVING 절에는 집계함수를 이용하여 조건 o
- HAVING 절은 일반적으로 GROUP BY 뒤에 위치
CASE WHEN LOC = 'NEW YORK' THEN 'EAST'
=
CASE LOC WHEN 'NEW YORK' THEN 'EAST'
ORDER BY 특징
- SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정한 칼럼을 기준으로 정렬
- 칼럼명 대신, ALIAS, 정수 대체 가능
- DEFAULT : ASC, DESC
- SQL 문장에 가장 마지막에 위치
- SELECT 절에서 정의하지 않은 컬럼 사용 가능
Oracle에서 NULL값을 가장 큰 값으로 취급, SQL Server에서는 NULL 값을 가장 작은 값으로 취급
SELECT 문장 실행 순서(FWGHSO)
- FROM : 발췌 대상 테이블 참조
- WHERE : 발췌 대상 데이터가 아닌 것 제거
- GROUP BY : 행들을 소그룹화 한다
- HAVING : 그룹핑된 값의 조건에 맞는 조건만 출력
- SELECT : 데이터의 값 출력/계산
- ORDER BY : 데이터를 정렬한다
[TOP ()예제] 사원
테이블에서 급여가 높은 2명을 내림차순으로 출력하는데, 같은 급여를 받는 사원이 있으면 같이 출력
- SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;
JOIN
- 두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
- PK, FK 값의 연관에 의해 JOIN 성립
- 어떤 경우에는 PK, FK가 없어도 논리적인 값들의 연관만으로도 JOIN 성립
N개의 테이블 조회 -> 최소 N-1의 JOIN 필요
EQUI JOIN : 2개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우 사용, PK, FK 관계 기반(=)
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2
-> WHERE절에 JOIN 조건을 넣는다.
ANSI/ISO SQL 표준 EQUI JOIN 문장
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.칼럼명1 = 테이블2.칼럼명2
->ON절에 JOIN절을 넣는다.
NON EQUI JOIN : 2개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우 사용, PK, FK 관계 기반(BETWEEN, <=, >= 연산자)
ex)
SELECT COUNT(*) CNT
FROM EMP_TBL A, RULE_TBL B
WHERE A.ENAME LIKE B.RULE
'SQL' 카테고리의 다른 글
[sqld] SQL 자격검정 실전문제 핵심정리 (4장 SQL 활용) (6.10 시험 대비용 정리) (2) | 2023.06.09 |
---|---|
[sqld] SQL 자격검정 실전문제 핵심정리 (2장 데이터 모델과 성능) (6.10 시험 대비용 정리) (0) | 2023.06.06 |
[sqld] SQL 자격검정 실전문제 핵심정리 (1장 데이터 모델링의 이해) (6.10 시험 대비용 정리) (0) | 2023.06.06 |