SQL(Structured Query Language)


사용자가 DBMS를 이용하여 DB를 관리하는데 사용하는 질의어(Query Language)중 하나.

SQL은 가장 대중적인 데이터베이스 언어이며 많은 DBMS에서 기본적으로 사용하고 있다.

대표적인 특징으로는 언어내에서 대소문자를 구분하지 않는다.

표준 SQL이 존재하지만 DBMS마다 조금씩 다른 방언을 가지고 있다.

SQL의 종류


DDL (Data Definition Language)

CREATE, ALTER, DROP, RENAME, TRUNCATE의 명령어가 존재하며 주로 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들이다.

DML (Data Manipulation Language)

SELECT 명령어를 이용해 데이터베이스를 조회할 수 있다.

INSERT, UPDATE, DELETE 명령어를 이용해 데이터를 삽입, 갱신, 삭제할 수 있다.

DCL (Data Control Language)

GRANT, REVOKE의 명령어가 존재하며 사용자 권한을 부여하거나 회수한다.

SQL 테이블 구조


SQL.001.jpeg

SELECT의 우선순위


1
2
3
4
5
6
SELECT [컬럼명]
FROM [테이블명]
WHERE [테이블 조건]
GROUP BY [컬럼명]
HAVING [그룹 조건]
ORDER BY [컬럼명] [ASC|DESC]

우선 순위

  1. FROM [컬럼명] - 찾고자하는 테이블에 접근
  2. WHERE [테이블 조건] - 테이블에서 조건에 맞는 것만 필터링
  3. GROUP BY [컬럼명] - [컬럼명]을 기준으로 그룹화
  4. HAVING [그룹 조건] - [그룹 조건]에 맞는 그룹만 필터링
  5. ORDER BY [컬럼명] - [컬럼명]을 기준으로 [ASC|DESC] 정렬

SQL 집계 함수


집계 함수는 그룹화된 데이터에서 통계적 계산을 위해 사용하는 함수이다.

SQL 대표 집계 함수

  • COUNT (컬럼명)
  • SUM (컬럼명)
  • AVG (컬럼명)
  • MAX (컬럼명)
  • MIN (컬럼명)

GROUP BY를 사용하지 않았다면 조회하고자 하는 테이블 전체를 지칭한다.

그룹 조건에서 사용되면 그룹을 필터링 할 수 있다.

SQL JOIN


1
TB1 [NATURAL] [LEFT|RIGHT|FULL] [INNER|OUTER] JOIN [USING|ON] TB2

https://i.ibb.co/0skHY82/2022-02-24-6-58-10.png

자연 조인 (Natural Join)

같은 이름과 타입을 가진 컬럼을 모두 이용해 두 테이블을 조인

내부 조인 (Inner Join)

  • 왼쪽 오른쪽 모두 존재하는 원소만을 조인

외부 조인 (Outer Join)

  • Left Outer Join
    • 왼쪽 테이블에 존재하는 원소를 기준으로 오른쪽 테이블에 존재하지 않으면 Null로 조인
  • Right Outer Join
    • 오른쪽 테이블에 존재하는 원소를 기준으로 왼쪽 테이블에 존재하지 않으면 Null로 조인
  • Full Outer Join
    • Left, Right Join를 전부 한 결과와 같음

USING, ON

USING은 괄호안에 조인에 사용할 컬럼들을 집어 넣는다.

CTE (Common Table Expression)


비재귀적 CTE

1
2
3
4
5
WITH CTE AS (
[쿼리문]
)

SELECT * FROM CTE

[쿼리문]에 해당하는 내용의 임시 테이블을 만드는 표현이다. 쿼리 실행 도중에만 메모리에 존재하게 된다.

재귀적 CTE

1
2
3
4
5
6
7
8
9
WITH RECURSIVE CTE AS (
SELECT NAME, MANAGER, 0 AS GRADE -- 앵커 멤버
FROM EMP
UNION ALL
SELECT EMP.NAME, EMP.MANAGER, CTE.GRADE + 1 -- 재귀 멤버
FROM EMP JOIN CTE ON EMP.MANAGER = CTE.NAME
)

SELECT * FROM CTE

SQL 계층적인 구조를 조회할 때 주로 사용한다.

자기 자신의 집합을 반복적으로 조회하면서 결과가 나오지 않을때까지 반복한다.

종료 조건이 반드시 명확해야한다.

1
2
3
4
5
6
7
8
WITH RECURSIVE CTE AS (
SELECT 0 AS N -- 앵커 멤버
UNION ALL
SELECT N + 1 FROM CTE -- 재귀 멤버
WHERE N < 23 -- 종료 조건
)

SELECT * FROM CTE -- 0 ~ 24

DBMS를 최대한 잘 활용하려면


해당 DBMS에서 지원하는 내장 함수에 대해 더 조사해본다.

코딩테스트에서는 보통 MySQL 또는 Oracle이 대중적이다.

코딩테스트 전에 반드시 풀어볼 것


SQL 고득점 KIT