관계형 데이터베이스 개요
관계형 데이터베이스(RDB; Relational Database)
- E.F Codd 박사의 정규화 이론에 따라 데이터의 일관성 문제를 근본적으로 해결한 데이터베이스 시스템
- 2차원 구조의 행과 열로 구성된 테이블
- SQL(Structured Query Language)이라는 공통의 질의언어를 정의해 데이터 조회, 가공, 추출이 가능
릴레이션 = 테이블 = 엔터티
레코드 = 튜플 = 행
필드 = 속성 = 열
칼럼 헤더 = 스키마
SELECT문 (조회 쿼리)
: 데이터를 조회하는 명령어로, WHERE절을 통해 특정 조건의 열만 조회할 수 있다.
- 테이블에 대한 별명(Alias) 부여 가능
* FROM 테이블1, 테이블2, 테이블3; -> 자연적인 JOIN이 일어난다.
TRIM
: 문자열의 양 끝단에서 공백 또는 지정된 문자열을 제거하고 반환한다.
TRIM([[arg1] [arg2] FROM] arg3)
# arg1: LEADING / TRAILING / BOTH, 생략될 경우 기본값은 BOTH이다.
# arg2: 제거할 특정 문자 또는 문자열. arg2가 생략되면 공백을 제거한다.
# arg3: 문자열 값 또는 문자열형의 칼럼
ex)
SELECT TRIM(' GOOD ') FROM DUAL;
# 문장의 앞, 뒤에서 공백 제거
LEADING
SELECT TRIM(LEADING '가' FROM '가나다라') FROM DUAL;
# '가나다라'의 앞에서 '가' 제거
TRAILING
SELECT TRIM(TRAILING '라' FROM '가나다라') FROM DUAL;
# '가나다라'의 뒤에서 '라' 제거
BOTH
SELECT TRIM(BOTH '가' FROM '가나다라가') FROM DUAL;
# '가나다라가'의 앞, 뒤에서 '가' 제거
* 코드의 길이를 줄일 수 있다.
LTRIM == TRIM LEADING
RTRIM == TRIM TRAILING
SUBSTR : 문자열 추출
REPLACE: 문자열 대체
LENGTH: 문자열 길이
LOWER, UPPER: 소문자 변환, 대문자 변환
함수 (NULL 관련 함수)
NVL (빈출)
: 첫 번째 인자가 Null이 아니면 첫 번째 인자를 그대로 반환하고 Null이면 두 번째 인자를 반환
( SQL Server에서는 NVL 대신 ISNULL을 사용)
NVL(arg1, arg2)
# arg1 : 칼럼 또는 표현식
# arg2 : 칼럼 또는 표현식. 단, arg1과 같은 데이터 타입을 가져야 한다.
ex)
SELECT EMPNO, ENAME, NVL(COMM, 0) AS COMM FROM EMP;
# COMM 컬럼의 값이 NULL인 것을 0으로 치환하여 반환한다.
NULLIF
: 입력된 두 인자가 같으면 Null을 반환하고 다르면 첫 번째 인자를 반환
NULLIF(arg1, arg2)
# arg1 : 칼럼 또는 표현식
# arg2 : 칼럼 또는 표현식. 단, arg1과 같은 데이터 타입을 가져야 한다.
ex)
SELECT EMPNO, ENAME, MGR, NULLIF(MGR, 7698) AS NM
FROM EMP;
# MGR 칼럼의 값이 7698인 것을 NULL로 치환하여 반환
COALESCE (오라클 단어 - 합체하다. )
: 입력된 인자를 순서대로 평가해 Null이 아닌 첫 번째 인자를 반환
COALESCE(arg1 [[, arg2] ...])
# arg1 : 칼럼 또는 표현식
# arg2 : 칼럼 또는 표현식. 단, arg1과 같은 데이터 타입을 가져야 한다.
ex)
SELECT EMPNO, COALESCE(HOURLY_WAGE, SALARY, COMMISSION)
AS TOTAL_SALARY FROM WAGES;
# HOURLY_WAGE, SALARY, COMMISSION 칼럼 순으로 읽어서 NULL이 아닌 첫 번째 값을 반환
WHERE절
: 특정 조건을 만족하는 행만을 대상으로 연산을 수행
- SELECT, UPDATE, DELETE에 사용 가능하나 INSERT에는 사용 불가
- FROM절을 먼저 수행하므로 FROM절에서 정의한 테이블에 대한 별명(Alias)은 사용할 수 있으나,
SELECT절에서 정의한 칼럼에 대한 별명은 사용할 수 없다.
SELECT 칼럼1 [[, 칼럼2]...]
FROM 테이블1 [[, 테이블2]...]
WHERE 조건식;
ex)
# SELECT절 - EMP 테이블에서 DEPTNO가 30인 모든 행을 조회
SELECT *
FROM EMP
WHERE DEPTNO = 30;
# UPDATE - DEPTNO가 30인 행에 대해서 JOB 칼럼의 값을 'SALESMAN'으로 변경한다.
UPDATE EMP SET JOB = 'SALESMAN'
WHERE DEPTNO = 30;
# DELETE - COMM 칼럼의 값이 Null인 행을 삭제한다.
DELETE FROM EMP
WHERE COMM IS NULL;
* 주의 * WHERE절에서 NULL과의 동등/부정 비교
: IS NULL, IS NOT NULL만 사용 가능하다.
(칼럼 = NULL, 칼럼 != NULL 등 비교연산자를 이용한 조건식은 제대로 동작하지 않는다. )
GROUP BY절
: 특정 값을 기준으로 데이터를 그룹핑할 때 사용
SELECT DEPTNO, SUM(SAL) AS SALS
FROM EMP
GROUP BY DEPTNO;
# EMP 테이블에서 DEPTNO로 그룹핑한 후, DEPTNO별 SAL의 합계를 조회
집계함수
: GROUP BY절로 그룹핑한 후에는 해당 그룹에 대해 집계함수를 사용하여 개수, 합, 평균 등을 계산
- 집계함수는 그룹을 대상으로 연산을 수행하고, GROUP BY절 없이 집계함수를 사용하면 전체 행을 하나의 그룹으로 간주하고 연산 수행
함수 | 설명 |
COUNT | 입력된 칼럼에서 값이 Null인 행을 제외한 행의 개수를 반환한다. |
SUM | 입력된 칼럼의 합을 반환한다. |
AVG | 입력된 칼럼의 평균을 반환한다. |
MIN | 입력된 칼럼의 최솟값을 반환한다. |
MAX | 입력된 칼럼의 최댓값을 반환한다. |
* 칼럼명 앞에 DISTINCT를 붙이면 칼럼값의 중복을 제거하므로,
집계함수의 인자로 입력되는 칼럼명에 DISTINCT를 사용하면 해당 그룹에서 첫 번재 행에 대해서만 연산을 수행
- DISTINCT : 중복 X, 유일한 것을 1번만 갖는다.
HAVING절
: GROUP BY 연산이 끝난 결과에 대해서 HAVING절의 조건을 만족하는 그룹만 추출
- GROUP BY 결과를 필터링 (WHERE절은 GROUP BY보다 먼저 실행된다. 먼저 필터링)
GROUP BY 연산 부하가 높다. -> WHERE절로 사전에 조건을 필터링한다.
SELECT ID FROM TBL
GROUP BY ID
HAVING COUNT(*) = 2;
# TBL 테이블에서 ID로 그룹핑한 후, ID별로 그룹핑한 개수가 2인 ID를 조회
표준 조인
JOIN
: 두 개의 테이블을 하나로 병합하는 연산 / 두 개의 테이블의 스키마가 다르다. (칼럼 구성이 다르다.)
* UNION: 스키마가 동일한 두 개의 테이블을 합집합으로 병합하는 연산
EQUI JOIN
- 등식을 조건으로 사용할 때 발생하는 조인
- 칼럼 값이 정확하게 일치할 때 성립하는 것으로 WHERE절의 조건이 등식인 경우 발생
Non EQUI JOIN
- 등식이 아닌 부등식(범위: BETWEEN, >, <, >=, <=)을 사용해 범위를 나타낸 조건일 때 발생
INNER JOIN
: 교집합의 개념으로 기준이 되는 키에 따른 칼럼값이 존재하는 것만 병합
SELECT
FROM 테이블명1 INNER JOIN 테이블명2 ON 테이블명1.칼럼 = 테이블명2.칼럼;
# ON : 테이블 병합 시 기준키(조건)을 정하는 절
OUTER JOIN
: 합집합의 개념으로, 기준이 되는 키에 따른 칼럼값이 존재하지 않더라도(NULL) 모든 튜플을 병합
* LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 포함시키면서 조인
* RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 포함시키면서 조인
* FULL OUTER JOIN: 왼쪽 테이블의 모든 행과, 오른쪽 테이블의 모든 행을 포함하는 조인
* Oracle에서의 OUTER JOIN
FROM T1 T2 (+) # OUTER JOIN 의미
NATURAL JOIN
: 조인의 대상이 되는 두 테이블에서 같은 이름의 칼럼에 대해서는 동일한 칼럼값을 가지는 행만 병합
- ON 절이 필요 없음
SELECT *
FROM table1 NATURAL JOIN table2;
# 같은 이름의 칼럼은 같은 값을 가지는 튜플만 SELECT 한다.
CROSS JOIN (카테시안 곱)
: 왼쪽 테이블의 각 행에 대한 오른쪽 테이블 모든 행의 대응을 조합하여 결과를 출력
- 왼쪽 테이블(M행), 오른쪽 테이블(N행) => M x N 행
# 1
SELECT 테이블1.칼럼, 테이블2.칼럼
FROM 테이블1, 테이블 2;
# 2
SELECT 테이블1.칼럼, 테이블2.칼럼
FEOM 테이블1 CROSS JOIN 테이블2;
References
'🏆 자격증 > SQLD' 카테고리의 다른 글
[SQLD 총정리] 2과목 3장 관리 구문 (0) | 2024.08.22 |
---|---|
[SQLD 총정리] 2과목 2장 SQL 활용 (0) | 2024.08.22 |
[과목 2] 1장 SQL 기본 (0) | 2024.08.19 |
[과목 1] 2장 데이터 모델과 성능 (0) | 2024.08.07 |
[과목 1] 1장 데이터 모델링의 이해 (0) | 2024.08.06 |