기억과 구글링에 의존해서 필요할 때가 되서야 찾는 것보다는 한 번 시간을 들여 숙지하고 기록을 해놓을 필요성을 느꼈다. 아래의 사이트들에서 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문을 작성하는 것이 더 수월해진다.
- FROM and JOINs.
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- 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에 빠르게 익숙해지는 목적이 크며 이론적 기반을 다지는 것이 필요함