기억과 구글링에 의존해서 필요할 때가 되서야 찾는 것보다는 한 번 시간을 들여 숙지하고 기록을 해놓을 필요성을 느꼈다. 아래의 사이트들에서 interactive한 배움을 가졌다:

기초

  • about case sensitivy
  • single line comment는 --을 앞에 붙여서, multi line comment는 /* ... */ (C-style)

데이터 타입

대부분의 RDBMS에서 지원하는 타입들. RDBMS 구현에 따라 다른 데이터 타입이 있을 수 있다.

  • (numeric) INTEGER, BOOLEAN
  • (floating point) FLOAT, DOUBLE, REAL
  • (string) CHAR(n), VARCHAR(n), TEXT
    • 문자열 리터럴은 '...'. 외따옴표는 ''로 표기함
  • DATE, DATETIME
  • BLOB

연산자 및 함수

  • (numeric) +, -, *, /, %, DIV, MOD, ROUND, FLOOR, CEIL, …
    • /는 floating point를, DIV는 integer를 리턴함
  • (string) (NOT) LIKE, LENGTH, CONCAT, LEFT, RIGHT, …
    • (NOT) LIKE: 우변의 문자열에는 와일드카드가 올 수 있다. %는 길이 0이상 문자열, _는 길이 1인 문자열을 매칭한다.
    • (NOT) LIKE: case-insensitive comparison
  • (logic) &&, AND, ||, OR, !, NOT, XOR
  • (compare) <, >, <=, >=, =, <>, !=, (NOT) IN, (NOT) BETWEEN a AND b, IS (NOT) NULL, COALESCE, …
    • ==는 없다.
    • <>!=
    • NULL 검사는 반드시 IS (NOT) NULL을 쓴다. 그 이외의 방법으로 NULL과 비교되면 항상 FALSE이다.
  • CAST
  • (aggregate) COUNT, SUM, SUM, MIN, MAX

SQL statements

  • Data Manipulation
    • SELECT
    • INSERT
    • UPDATE
    • DELETE
    • …more
  • Data Definition
    • ALTER
    • DROP
    • …more

Manipulation 예시들

SELECT attr1, attr2 FROM mytable;

SELECT attr1, attr2 FROM mytable WHERE cond1 AND cond2;

SELECT attr1, COUNT(*) FROM mytable GROUP BY attr1;

-- 개수를 셀 때, attr2 = NULL 경우는 무시
SELECT attr1, COUNT(attr2) FROM mytable GROUP BY attr1; 

-- 기본은 오름차순. 뒤에 ASC 혹은 DESC 키워드을 붙여 명시적으로 오름차/내림차순 지정
SELECT attr1, attr2, attr3 FROM mytable ORDER BY attr1;

-- attr2의 내림차순으로 정렬하고 tie가 나면 attr1의 오름차순으로 정렬
SELECT attr1, attr2, attr3 FROM mytable ORDER BY attr2 DESC, attr1;


INSERT INTO mytable VALUES (attr1_val1, attr2_val1, attr3_val1, ...), ...;

INSERT INTO mytable (attrA, attrB) VALUES (attrA_val1, attrB_val1, ...), ...;

UPDATE mytable SET attr1 = expr1, attr2 = expr2 WHERE condition;

DELETE FROM mytable WHERE condition;

SELECT statement 추상적 처리 흐름

CAUTION: 이 순서는 데이터베이스 엔진이 실제로 쿼리문을 처리하는지와는 관련이 없다. 컴파일러CPU처럼 최적화를 위해 내부적으로는 다르게 처리할 수 있다.

이 순서를 숙지해놓으면 SQL문을 작성하는 것이 더 수월해진다.

  1. FROM and JOINs.
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. DISTINCT
  7. ORDER BY
  8. LIMIT and OFFSET

Join

테이블 두 개로 새로운 테이블을 만드는 연산이다. SELECT statement의 FROM clause에서 사용할 수 있다.

CROSS JOIN

mytable CROSS JOIN yourtable
mytable JOIN yourtable

카르테시안 곱. 집합론에서의 카르테시안 곱과 다른 점은 열 개수가 2가 아닌 M+N으로, “flatten”된다.

INNER JOIN

mytable INNER JOIN yourtable ON condition
mytable JOIN yourtable ON condition

카르테시안 곱을 한 다음 condition에 부합하는 행들만 걸러낸다.

OUTER JOIN

mytable LEFT JOIN yourtable ON condition
mytable RIGHT JOIN yourtable ON condition
mytable FULL JOIN yourtable ON condition

INNER JOIN을 하면 mytable의 각 행은 condition으로 매칭되는 yourtable의 행들

각각 차집합(A-B), 차집합(B-A), 합집합으로 비유하여 이해할 수 있다.

MariaDB에는 FULL JOIN이 없다. 다른 방법으로 FULL JOIN의 기능을 대체할 수 있다.

서브쿼리(Subqueries)

SELECT statement의 결과를 쿼리문 안에 중첩시킬 수 있다.

◦ ALL과 ANY

SELECT * FROM mytable WHERE attr1 > ANY(SELECT attry FROM yourtable);

SELECT * FROM mytable WHERE attr1 > ALL(SELECT attrx FROM yourtable);
  • ANY와 서브쿼리: 서브쿼리의 모든 행에 대해 조건식이 불만족했을 때 FALSE를 나타내는 표현식이 된다.
  • ALL과 서브쿼리: 서브쿼리의 모든 행에 대해 조건식이 만족했을 때 TRUE를 나타내는 표현식이 된다.

◦ 상호연관 서브쿼리 (correlated subqueries)

SELECT * FROM world
WHERE population >
  (
    SELECT AVG(population) FROM world AS X
    WHERE world.continent = X.continent
  )
;

안쪽 쿼리가 바깥쪽 쿼리의 열을 참조하면. 안쪽 쿼리를 상호연관 서브쿼리라고 한다. 안쪽 쿼리가 바깥쪽 쿼리의 각 행에 의존성이 생기기 때문에 각 행에 대해서 서브쿼리가 평가된다.

Definition

테이블의 구조는 테이블 스키마 (table schema)​로 정의된다. 테이블 스키마는 각 열의 이름, 데이터 타입 그리고 (선택적) 제약조건 (constraints)​들을 기술한다.

열 제약조건들:

  • PRIMARY KEY
  • AUTOINCREMENT
  • UNIQUE
  • NOT NULL
  • CHECK(expr) : 값의 유효성을 expr 로 검사함
  • FOREIGN KEY : 다른 테이블과의 연관 관계를 표현할 때 사용함

Definition 예시들

CREATE TABLE movie (
  id             INTEGER PRIMARY KEY,
  title          TEXT,
  director       TEXT,
  year           INTEGER, 
  length_minutes INTEGER
)

CREATE TABLE IF NOT EXISTS mytable (
  ...
)

ALTER TABLE mytable
  ADD attr moreattr DEFAULT defval

ALTER TABLE mytable
  DROP column

ALTER TABLE mytable
  RENAME TO new_tbl_name

DROP TABLE mytable
DROP TABLE IF EXISTS mytable

맺음말

SQL에 빠르게 익숙해지는 목적이 크며 이론적 기반을 다지는 것이 필요함