SQL 기본
관계형 데이터베이스 개요
데이터베이스와 테이블
데이터베이스에는 N개의 테이블을 만들 수 있다. 데이터의 특성에 따라서 하나가 좋을 수도, 여러 개가 좋을 수도 있다. 모든 자료들은 테이블에 입력되고, 테이블에서 조회하고, 수정하고, 삭제할 수 있다.
분산 데이터베이스 특징
- 지역 자치성 (P)
- 점증적 시스템 용량 확장이 가능함 (P)
- 빠른 응답 속도 (P)
- 오류의 잠재성이 높음 (N)
- 처리 비용이 증가함 (네트워크 구축…) (N)
SELECT 문
SQL 문법 구조
SELECT <어쩌고>
FROM <어쩌고>
WHERE <어쩌고>DISTINCT
DISTINCT : 중복되면 한 번만 출력한다.
함수
NVL
NVL (대상 컬럼, 대상 컬럼의 값이 NULL이면 반환할 값)
날짜 함수
NEXT_DAY(날짜, 요일) : 해당 날짜보다 이후에 오는 첫번째 지정 요일
ADD_MONTHS(날짜, 개월수) : 해당 날짜에 N개월 더하기
Oracle에서 날짜형에 +1을 하면 day(일, 하루)로 인식한다.
SYSDATE의 결과가 2025-06-09 12:12:12라면 SYSDATE +1은 2025-06-10 12:12:12이 반환
- 1/24는 한 시간
- 1/24/60은 1분
- 1/24/60/60은 1초
- 2/24/60/60은 2초
SUBSTR
SUBSTR(문자열, 시작위치, 추출할 글자 수)
문자열에서 시작위치를 포함해서 추출할 일부 글자만 가져오는 함수이다.
SELECT SUBSTR('DATABASE', 1, 4) ⇒ DATA
시작위치는 1부터 시작하고, 길이를 생략하면 시작위치부터 끝까지 가져온다.
ROUND
ROUND : 반올림 함수
ROUND(값, 자릿수)
- 자릿수가 양수인 경우 : 소수점 N번째 자리까지 반올림 →
ROUND(456.789, 1)= 456.8 - 자릿수가 0일 경우 : 정수로 반올림 →
ROUND(456.789, 0)= 457 - 자릿수가 음수인 경우 : 정수부에서 N번째 자리에서 반올림 →
ROUND(456.789, -2)= 500
WHERE 절
WHERE 절의 AND, OR
WHERE 절에서 AND와 OR 가 함께 사용되면 AND가 먼저 평가된다.
WHERE GRADE='A' OR GRADE='B' AND STATUS='ACTIVE'GRADE가 ‘A’ 인 데이터 또는 GRADE가 ‘B’이고 STATUS가 ‘ACTIVE’인 데이터
<>
<> : 같지 않다.
GROUP BY, HAVING 절
집계 함수
집계 함수 : COUNT, SUM, AVG
집계 함수는 NULL을 제외하고 집계한다.
집계 함수와 WHERE 절
AVG와 같은 집계 함수는 WHERE 절에서 쓸 수 없다.
이유 : 집계함수는 GROUP BY가 선행되어야 쓸 수 있다. 그런데 WHERE 절은 GROUP BY보다 먼저 실행됨.
집계함수를 이용해서 조건을 주기 위해서는 GROUP BY 이후에 실행되는 HAVING 절을 이용하면 된다.
조인
조인 조건
여러 테이블로부터 원하는 데이터를 조회하기 위해서는 전체 테이블이 N개인 경우 최소 N-1개 만큼의 JOIN 조건이 필요하다.
Cartesian Product / CROSS JOIN
조인을 할 때 조인 조건이 없으면 카테시안 곱이 발생한다.
카테시안 곱 ⇒ 행 개수 * 행 개수
FROM TAB1, TAB2 을 보면 조건이 없기 때문에 두 테이블을 조건 없이 모두 조합한다 ⇒ Cartesian Product 또는 CROSS JOIN
SELECT *
FROM TAB1, TAB2
ORDER BY 1;그래서 ANSI 방식으로는 이렇게 적을 수 있다.
SELECT *
FROM TAB1
CROSS JOIN TAB2
ORDER BY 1;※ CROSS JOIN 은 ON 조인 절을 사용하지 않는다.
Oracle-style 조인과 ANSI 조인
구식 Oracle-style 조인 문법 : 테이블은 FROM에 콤마로 나열하고, 조인 조건은 WHERE에 적는 방식
ANSI 방식 : JOIN ... ON ...처럼 표준 SQL 조인 문법을 사용해서 테이블 연결 조건을 명확하게 쓰는 방식
테이블 ALIAS
FROM 절에서 FROM PLAYER P, TEAM T 같이 테이블에 대한 ALIAS를 사용한 경우
SELECT 절에서는 반드시 테이블명이 아닌 ALIAS 명을 사용해야 한다.
조인 유형
NON-EQUI JOIN : 등가 조건이 성립되지 않은 테이블에 JOIN을 걸어주는 방법
EQUI JOIN은 조인 칼럼이 1:1로 매핑이 가능하면 사용할 수 있다.
OUTER JOIN : JOIN 조건을 만족하지 않는 데이터도 볼 수 있다.
SELF JOIN : 하나의 테이블을 논리적으로 분리시켜 EQUI JOIN을 한다.
Natural 조인에 해당하는 칼럼은 테이블의 칼럼명이 동일하다.
LEFT (OUTER) JOIN
왼쪽 테이블의 행은 전부 살리고, 오른쪽 테이블에서 조건이 맞는 행이 있으면 붙인다, 없으면 오른쪽 컬럼은 NULL로 채운다.
FROM T1
LEFT OUTER JOIN T2
ON T1.COL = T2.COLT1은 전부 남기고, T1.COL = T2.COL인 T2 행이 있으면 붙인다. 없으면 T2 쪽 컬럼은 NULL.
FULL (OUTER) JOIN
양쪽으로 OUTER JOIN을 하는 것이다.
내부적으로 LEFT JOIN과 RIGHT JOIN을 하는 것.
조인 조건이 있어야 한다.
오라클에서는 (+) 기호를 양쪽에서 사용할 수 없다.
Sort Merge 방식의 조인
두개의 테이블을 정렬한 뒤에 Merge하는 방식이다. 완료되면 한번의 Full Scan으로 데이터를 검색
기본키와 외래키 관계에서 외래키에 인덱스가 없을 때 효율적인 방식이라서 이런 상황에서 옵티마이저가 Sort Merge 방식으로 동작하게 한다.
Nested Loop Join
- 중첩된 반복문과 유사한 형식이다.
- 선행 테이블의 조건을 만족하는 건수만큼 반복 수행된다.
- 랜덤 액세스가 발생한다.
FROM 절에 아무리 많은 테이블이 나열되더라도 항상 2개씩 조인된다. (동시에 조인 작업이 수행되지 않는다.) 앞에서 이미 수행된 조인의 결과 집합을 이용해서 조인이 처리된다.
Hash Join
- 해시 함수를 사용해서 주소를 계산하고 조인을 수행한다.
- 작은 테이블을 선행 테이블로 사용하는 것이 성능 관점에서 좋다.
- 해시 함수를 사용하기 때문에 CPU를 많이 사용한다.
- 랜덤 액세스는 발생하지 않는다.
ORDER BY 절
ORDER BY절에서 정렬 기준이 생략되면 Default로 ASC(오름차순) 정렬이 된다
ORDER BY절에는 칼럼명 대신에 SELECT절에 기술한 칼럼의 순서 번호나 칼럼의 ALIAS명을 사용할 수 있다.
실행 계획과 인덱스
인덱스
- 인덱스는 기본적으로 오름차순으로 생성되고 정렬된다.
DESC를 명시하면 내림차순 인덱스를 생성할 수 있다. - 비용적인 측면에서는 인덱스 스캔보다 전체 테이블 스캔이 더 유리할 수 있다.
- 규칙 기반 옵티마이저는 적절한 인덱스가 존재하면 전체 테이블 스캔보다는 항상 인덱스를 사용하려고 한다.
- 인덱스 범위 스캔은 결과 건수만큼 반환한다. 즉 결과가 없으면 한 건도 반환하지 않을 수 있다.
데이터 스캔 방식
- Unique Index Scan
- Non-Unique Index Scan
- Index Full Scan
- Table Full Scan : 인덱스를 사용하지 않고 테이블 전체를 스캔하는 방식이다. 대량 데이터를 조회하거나 적절한 인덱스가 없을 때 인덱스 스캔보다 효율적일 수 있다.
SQL의 실행 계획
SQL문의 처리를 위한 절차와 방법을 표현하는 것이다.
액세스 기법, 조인 순서, 방법 같은 것들이 포함됨.
실행 계획이 달라도 결과가 달라지지는 않지만 성능의 차이는 있다.
최적화 정보란 실행 계획의 단계 별 예상 비용을 의미한다.
SQL 처리흐름도
실행 계획을 시각화한 것 (SQL의 처리 절차를 시각적으로 표현한 것)
인덱스 스캔, 전체 테이블 스캔 같은 액세스 기법을 표현할 수 있다.
성능적인 측면도 함께 표현할 수 있음