정보처리기사 취득 시 배웠던 SQL 지식과 실제 SQLD 자격증 범위의 공통점을 바탕으로, 본격적인 진도를 나가기 전 머릿속 파편화된 개념을 구조화하기 위해 작성했다.
최근 SQLD 자격증 시험을 준비하고 있다. 예전에 정보처리기사 자격증을 준비할 때 데이터베이스 과목에서 SQL을 다루었기 때문에 어느 정도 기본기는 있다고 생각했다.
SQLD 시험이 아무리 객관식이어도 운좋게 쉬운 문제만 나오리라는 보장도 없고 SQLD 문제은행 사이트에서 문제를 풀어보면서 복잡한 쿼리문을 풀려면 SQL를 다시한번 큰 줄기로 정리해보는게 좋을것같다.
SQL이라는 언어의 기본 구조를 분류해 보고, 앞으로 문제풀이에 자주 나올 핵심 주제들을 이 구조에 연관 지어 정리해 둔다.
문, 절, 구, 함수의 구분
SQL을 공부할 때 ‘SELECT 절’과 ‘SELECT 문’ 같은 용어들이 혼용되어 헷갈리기 쉽다. 명령어의 조립 단위부터 명확히 나눈다.
- 절 (Clause) : 쿼리의 뼈대
- SQL 문장을 구성하는 작업 단위다. 단독으로는 실행할 수 없고 여러 개가 모여야 한다.
- 예: SELECT 절, FROM 절, WHERE 절
- 구 또는 표현식 (Phrase / Expression) : 조건 묶음
- 절 내부에서 특정한 의미나 조건을 이루는 단어들의 묶음이다.
- 예: WHERE 절 내부에 들어가는 조건인 ‘price > 1000’ 부분
- 함수 (Function) : 데이터 가공 도구
- 데이터를 계산하거나 형태를 변환하기 위한 연산 도구다. 이름 뒤에 괄호가 붙는 특징이 있다.
- 예: SUM(price), COUNT(*)
- 문 또는 구문 (Statement) : 완성된 명령어
- 위의 절, 구, 함수들이 모두 모여 세미콜론(;)으로 끝나는 하나의 완벽한 실행 단위다.
- 예: SELECT SUM(price) FROM products WHERE category = ‘전자제품’;
간단히 말해, 절이라는 뼈대를 모으고 구와 함수로 내용을 채우면 하나의 완성된 문이 만들어진다.
SQLD 핵심 주제와의 연관성
위에서 정리한 기본 구조(문, 절, 구, 함수)를 바탕으로, SQLD 시험의 핵심 주제들이 각각 어디에 해당하는지 연결해 보았다.
DML, DDL, DCL : ‘문(Statement)’의 목적별 분류
완성된 명령어들을 역할에 따라 분류하는 개념이다. 그동안 흔하게 쓰던 SELECT 문이나 INSERT 문 등은 데이터를 조작하는 DML 그룹에 속한다.
- 분류: DML(데이터 조작어), DDL(데이터 정의어), DCL(데이터 제어어)
WHERE와 HAVING의 차이 : ‘절(Clause)’의 실행 순서
두 가지 모두 데이터를 필터링하는 절(Clause)이지만, 실행되는 시점이 다르다.
- WHERE 절은 데이터를 그룹화하기 전에 개별 데이터를 필터링한다.
- HAVING 절은 GROUP BY 절을 통해 데이터를 그룹화한 이후에 그 결과를 필터링한다.
조인 (JOIN) : FROM ‘절(Clause)’의 확장
SQLD에서는 여러 테이블을 연결하는 것이 필수적이다. 조인은 FROM 절 내부에서 여러 테이블을 엮어 하나의 큰 테이블처럼 만드는 기술이다.
서브쿼리 (Subquery) : ‘문(Statement)’을 ‘구(Phrase)’처럼 활용
가장 헷갈리기 쉬운 부분이다. 서브쿼리는 괄호 안에 또 다른 완벽한 SELECT 문(Statement)을 작성하여, 이를 다른 쿼리의 WHERE 절이나 FROM 절 안에서 하나의 조건이나 값(Phrase)처럼 사용하는 방식이다.
이렇게 구조를 잡고 나니 개념들이 어느 정도 정리된다. 서브쿼리는 결국 쿼리 안에서 또 다른 쿼리를 부품처럼 쓰는 것이고, 조인은 FROM 절을 확장하는 방식이다. SQLD에는 이후 윈도우 함수나 인덱스 같은 심화 내용도 나온다. 실제 기출문제 예시로 LAG()라는 윈도우 함수를 사용한 문제가 있는데, 문장도 길고 난이도가 정말 높다고 체감했다. 그 문제를 해석하면서 알게된건 윈도우 함수의 기본 공식이다.
윈도우 함수 공식
[윈도우 함수 종류] OVER (PARTITION BY [그룹핑 컬럼] ORDER BY [정렬 컬럼])
이건 어떤 함수 (ex) LAG, RANK, SUM 등… 를 쓸건데 OVER안의 규칙에 맞춰서 계산해줘! 라고 DB에 명령하는 구조로 GROUP BY의 딜레마를 극복하기 위해 이런 방식이 생겼다.
메인쿼리의 데이터는 1줄 압축하거나 훼손하지 않을 수 있고 독립적인 가상의 윈도우(특정 범위의 데이터만 들여다 보는 창문)로 원하는 묶음의 범위만 확인할 수 있다.
이 글은 개념정리뿐이고 아직은 문제풀이량이 많지 않아서 어떤 차이가 있고 무엇이 계산 효율이 더 좋고 문제에 자주 나오는지는 의문이 들고 더 알아보고 싶다. SQLD 합격을 위하여 열심히 기출을 풀며 공부해야지! ㅎㅎ
댓글이 보이지 않으면 GitHub에 로그인한 뒤 새로고침해 주세요. 공개 댓글은 로그인 상태에서 더 안정적으로 표시됩니다.