본문 바로가기

DB/기타

SQL

관계형 데이터베이스 개요

SQL 문장의 종류

명령어 종류 명령어
DML (Data Manipulation Language) SELECT, INSERT, UPDATE, DELETE
DDL (Data Definition Language) CREATE, ALTER, DROP, RENAME
DCL (Data Control Language) GRANT, REVOKE
TCL (Transaction Control Language) COMMIT, ROLLBACK

STANDARD SQL

현재 SQL의 많은 기능이 관계형 데이터베이스의 이론을 수립한 E.F.Codd 박사의 논문에 언급돼 있다. 논문에 언급된 8가지 관계형 대수는 4개의 일반 집합 연산자와 순수 관계 연산자로 나눌 수 있다.

일반 집합 연산자를 현재의 SQL과 비교하면 다음과 같다.

  1. UNION → UNION
  2. INTERSECTION → INTERSECT
  3. DIFFERNECE → EXCEPT, MINUS
  4. PRODUCT → CROSS JOIN

순수 관계 연산자는 관계형데이터베이스를 구현하기 위해 새롭게 만들어진 연산자다. 순수 관계 연산자를 현재의 SQL과 비교하면 다음과 같다.

  1. SELECT → WHERE
  2. PROJECT → SELECT
  3. (NATURAL) JOIN → JOIN
  4. DIVDE → 사용 x

데이터 유형

  • CHARACTER
  • VARCHAR
  • NUMERIC
  • DATETIME
  • Binary String Type
  • Binary Large Object Type
  • National Character String Type
  • Boolean Type

 

함수

함수

  • 단일행 함수 (Single-Row Function)
  • 다중행 함수 (Multi-Row Function)
    • 집계 함수 (Aggregate Function)
    • 그룹 함수 (Group Function)
    • 윈도우 함수 (Window Function)

단일행 함수의 종류

단일행 함수의 특징

  • SELECT, WHERE, ORDER BY 절에 사용 가능한다.
  • 각 행들에 대해 개별적으로 적용해 데이터 값들을 조작하고, 각각의 행에 대한 조작 결과를 리턴한다.
  • 함수의 인자로 함수를 사용하는 함수의 중첩이 가능하다.

NULL 관련 함수

NULL 값을 포함하는 연산의 경우 결과 값도 NULL 값이다.

WHERE 절

WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.

  • 칼럼 명 (보통 조건식의 좌측에 위치)
  • 비교 연산자
  • 문자, 숫자, 표현식 (보통 조건식의 우측에 위치)
  • 비교 칼럼명 (JOIN 사용 시)

연산자의 종류

  • 비교 연산자 (=, >, ..)
  • SQL 연산자 (BETWEEN a AND b, IN (list), LIKE ‘비교문자열’, IS NULL))
  • 논리 연산자 (AND, OR, NOT)

LIKE 연산자

와일드카드 설명
% 0개 이상의 어떤 문자
_ 1개의 단일 문자

GROUP BY, HAVING 절

집계 함수

여러행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수 중 집계함수(Aggregate Function)의 특성은 다음과 같다.

  • 여러 행들의 그룹이 모여 그룹당 단 하나의 결과를 돌려주는 함수다.
  • GROUP BY 절은 행들을 소그룹화한다.
  • SELECT, HAVING, ORDER BY 절에 사용할 수 있다.

집계함수에서 사용되는 2가지 옵션은 다음과 같다.

  • ALL: default
  • DISTINCT

GROUP BY 절과 HAVING 절의 특징

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계함수를 사용한다.
  • 집계함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  • GROUP BY 절은 SELECT 절과 달리 ALIAS 명을 사용할 수 없다.
  • 집계함수는 WHERE 절에는 올 수 없다. (집계함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다.)
  • WHERE 절은 전체 데이터를 GROUP 으로 나누기 전에 행들을 미리 제거한다.
  • HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계함수를 이용한 조건을 표시할 수 있다.
  • GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.

ORDER BY 절

ORDER BY 절은 SQL 문장으로 조회한 데이터들을 다양한 목적에 맞게 특정 컬럼을 기준으로 정렬, 출력하는데 사용한다. ORDER BY 절에 컬럼 명 데신 SELECT 절에서 사용한 ALIAS 명이나 컬럼 순서를 나타내는 정수도 사용 가능한다.

ORDER BY 절은 2가지 정렬 방식이 있다.

  • ASC
  • DESC

SELECT 문장 실행 순서

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

위 순서는 옵티마이저가 SQL 문장의 SYNTAX, SEMANTIC 에러를 점검하는 순서이기도 하다. 예를 들어 FROM 절에 정의되지 않은 테이블의 컬럼을 WHERE, GROUP BY, HAVING, SELECT, ORDER BY 절에서 사용하면 에러가 발생한다.

그러나 ORDER BY 절에는 SELECT 목록에 나타나지 않은 문자형 항목이 포하될 수 있다. 단, SELECT DISTINCT 를 지정하거나 SQL 문장에 GROUP BY 절이 있거나, SELECT 문에 UNION 연산자가 있으면 열 정의가 SELECT 목록에 표시돼야 한다.

관계형 데이터베이스가 데이터를 메모리에 올릴 때 행 단위로 모든 컬럼을 가져오게 되므로, SELECT 절에서 일부만 컬럼만 선택하더라도 ORDER BY 절에서 메모리에 올라와 있는 다른 컬럼의 데이터를 사용할 수 있다.

SQL 문장 실행 순서는 오라클 옵티마이저가 SQL 문장을 논리적인 순서이므로, SQL 문장이 실제로 실행되는 물리적인 순서가 아님을 유의하기 바란다.

JOIN

두 개 이상 테이블을 연결해 데이터를 출력하는 것

FROM 절에 여러테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다. 예를 들어 A, B, C, D 4 개의 테이블을 조인하고자 할 경우 옵티마이저는 (((A JOIn D) JOIN C) JOIN B) 와 같이 순ㄴ차적으로 조인을 처리한다. 이때 테이블의 조인 순서는 내부적으로 옵티마이저에 의해 결정된다.

EQUI JOIN

두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법이다. JOIN 조건은 WHERE 절에 = 연산자를 사용해 표현한다.

Non EQUI JOIN

두 개의 테이블 간에 논리적인 연관 관계를 갖고 있으나, 컬럼이 서로 일치하지 않는 경우에 사용된다. Between, >, ≥, <, ≤ 등의 연산자를 사용한다.

OUTER JOIN

EQUI JOIN, Non EQUI JOIN은 모두 조인 조건의 결과가 참인 행들만 반환하는 INNER JOIN 이다. OUTER JOIN은 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.

조인에 성공한 행들은 INNER JOIN과 동일하게 조인에 참여한 각 테이블의 칼럼 값들이 표시된다. 반면 조인에 실패한 행들의 경우 기준 테이블의 컬럼들의 값이 표시되고, 그 외 테이블에서 가져오는 컬럼들은 NULL으로 표시된다.

표준 JOIN

FROM 절 조인 형태

ANSI/ISO 에서 표시하는 FROM 절의 조인 형태는 다음과 같다.

  1. INNER JOIN
  2. NATURAL JOIN
  3. USING 조건절
  4. ON 조건절
  5. CROSS JOIN
  6. OUTER JOIN

INNER JOIN

INNER JOIN은 OUTER JOIN과 대비해 내부 조인이라고 하며, 조인 조건을 만족하는 행들만 반환한다. INNER JOIN 표시는 전통적인 방식의 조인 문법에서는 WHERE 절에 기술하던 조인 조건을 FROM 절에서 정의하겠다는 표시이므로 USING 조건이나 ON 조건절을 필수적으로 사용해야 한다.

NATURAL JOIN

NATURAL JOIN은 두 테이블 간에 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN을 수행한다. NATURAL JOIN이 명시되면 추가로 USING 조건절, ON 조건절, WHERE 절에서 조인 조건을 정의할 수 없다.

USING 조건절

FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다.

ON 조건절

조인 서술부 (ON 조건절)와 비 조인 서술부 (WHERE 조건절)를 분리해 이해가 쉬우며, 칼럼 명이 다르더라도 조인 조건을 사용할 수 있는 장점이 있다.

CROSS JOIN

집합 연산자의 PRODUCT 개념으로, 테이블 간 생길 수 있는 모든 데이터의 조합이다.

OUTER JOIN

LEFT (OUTER) JOIN, RIGHT (OUTER) JOIN, FULL (OUTER) JOIN을 사용 가능하다.