🚦 Summary

  • “WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다.” by Sweet Data Story
  • SQL 쿼리의 복잡성을 이해하는 데 있어, SELECT와 WHERE 절의 역할을 명확히 하는 것이 중요합니다.
  • 복잡한 쿼리를 분석할 때, 각 절이 데이터 집합에 미치는 영향을 이해하면 쿼리 결과를 더 쉽게 예측할 수 있습니다.

📌 Intro.

  • 이번 포스팅은 Sweet DataStory님의 블로그[StartUP SQL BOOK]SELECT 기초 - WHERE 절 사용법 이라는 포스팅을 읽고 작성하게 되었습니다.
  • SQL을 처음 배울 때는 단순한 쿼리만 다루게 됩니다. SELECT 절이 열을 선택하고, FROM 절이 데이터를 가져올 테이블을 지정합니다. 고급 쿼리를 배우면서 쿼리의 복잡도가 높아집니다.
  • 이때, 복잡해지는 쿼리를 해석하는데 점점 어려움을 느껴 포기하게 되는 것 같습니다.
  • 자세한 내용은 해당 블로그의 내용을 참고해주시면 좋습니다.

이번 포스팅에서는 현재 공부중인 SQLD 자격증 시험에서 가장 힘들었던 고급 쿼리를 해석할 때 도움이 된 문장에 대한 제 생각을 정리합니다.

해당 포스팅을 보게 된 건 링크드인을 보면서 Sweet Data Story님의 블로그 글에 대한 포스팅을 보면서 였습니다.

“WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다.”

라는 문장과 함께 위 링크의 포스팅을 홍보하시는 글이었는데, 문장을 보면서 “아~ 저렇게 이해할 수도 있겠구나?” 라는 생각이 들었고, 좀 더 읽어 보고 싶어져서 블로그에 방문에서 글을 읽게 되었습니다.

(내용이 너무 잘 정리가 되어있으니 SQL을 공부하는 분이라면 꼭 한번 읽어 보시길 권유 드립니다👍)

그리고 정리해본 왜 “WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다.” 라는 문장이 통찰력이 있는 문장인가를 정리해 보았습니다.

저 문장을 읽고 제가 읽고 아하?! 했던 이유는 제가 딱 마주친 고민들을 해결해주는 문장이었기 때문입니다.

맨 처음에 SQL을 배우기 시작할 때는

1
2
3
4
SELECT 
	NAME
	, SAL 
	FROM EMP;

와 같이 단순한 쿼리만 접하면서 “뭐야~ 쉽네~ ㅋㅋ” 하는 생각을 했습니다. 이런 쿼리에서는 SELECT 절이 출력할 열을 선택하고, FROM 절이 데이터를 가져올 테이블을 지정 하는 정도로 이해해도 충분합니다.

그런데 점점 고급 쿼리를 배우면서 쿼리의 복잡도가 높아지면, 저러한 문장 만으로는 복잡한 쿼리를 이해하는 것에 한계가 있었습니다.

예를들어, SELECT 절에서는 단순히 테이블의 열을 선택하는 것을 넘어서서 각종 연산과 함수를 사용하여 새로운 열을 만들어내기도 하고 (연산자, 집계 함수, CASE 문 등), WHERE 절에서는 다양한 조건들을 복잡하게 조합하여 행을 필터링하는 경우도 있죠 (AND, OR, IN, EXISTS 등의 조건 연산자 및 서브쿼리).

심지어는 여러 테이블을 JOIN하여 데이터를 가져오는 경우(INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 등) 도 있습니다.

이렇게 되면 “SELECT는 보고 싶은 열을 고르고, WHERE는 어떤 행을 가져올지 정한다”는 식의 단순한 설명으로는 쿼리를 제대로 이해하기에는 분명한 한계가 있습니다.

예를 들어서 아래의 쿼리는 최근에 제가 문제 풀다가 본 쿼리입니다.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
    E.EMPNO, E.ENAME, E.JOB, E.SAL, E.DEPTNO,
    (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) AS DEPT_AVG_SAL,
    M.ENAME AS MANAGER_NAME
FROM 
    EMP E
JOIN 
    (SELECT EMPNO, ENAME FROM EMP WHERE JOB = 'MANAGER') M ON E.MGR = M.EMPNO
WHERE 
    E.SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO)
    AND E.DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = 'NEW YORK')
    AND EXISTS (SELECT 1 FROM EMP WHERE MGR = E.EMPNO);

솔직히, 한눈에는 이 쿼리가 정확히 어떤 데이터를 가져오는지, 각 절이 무슨 역할을 하는지 파악하기가 쉽지 않습니다. 여러번 읽어 보고 쿼리를 분해해서 뜯어봐야 합니다.

근데 “WHERE 절은 데이터 집합의 높이를 변화 시키고, SELECT 절은 데이터 집합의 넓이를 변화 시킵니다.”라는 문장이 저런 복잡한 쿼리를 이해하는 시간을 단축 시키는데 큰 도움이 되는 것 같습니다.

원문이된 블로그 내용을 보면 저 문장은 SQL 쿼리의 결과물이 원본 테이블과는 별개의 새로운 데이터 ‘집합’을 만들어낸다 는 사실을 전제로 하고 있음을 알 수 있습니다.

이는 새로운 데이터 집합의 모양. 즉, 어떤 열(column)들이 존재하고 그 열(column)들의 내용이 어떤 식으로 계산될 것인지는 SELECT 절에 의해 결정 되는거고, WHERE절은 그 데이터 집합에 어떤 행들이 포함될 것인지, 이 두 명령문이 ‘데이터 집합의 크기를 결정짓는 요소’라는 점을 명확하게 짚어 주는 문장이었습니다.

이런 관점에서 복잡한 쿼리를 바라보면, 위와 같이 복잡해 보이는 쿼리도 좀 구조 파악이 빨리 되고, 결과가 추론이 좀 더 수월해지는 느낌 입니다. SELECT 절과 WHERE 절이 각각 ‘집합의 모양’과 ‘집합의 크기’를 결정짓는 핵심 요소 라는 전제로 보니까 쿼리가 어떤 데이터를 만들어낼 것인지를 예측이 좀 더 쉬워지는 핵심적인 개념 설명이란 생각이 들었습니다.


🎈 Outro.

  • 오늘 포스팅한 “WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다.”라는 문장은 SQL 쿼리의 본질을 이해하는 데 큰 도움이 됩니다.
  • 복잡한 쿼리를 분석할 때, 각 절이 데이터 집합에 미치는 영향을 명확히 이해하면 쿼리 결과를 더 쉽게 예측할 수 있습니다.
  • 따라서, SQL을 공부하시는 분들이라면 이 문장을 기억해 두는 것이 앞으로 공부를 하는데 있어 큰 도움이 될 것 같습니다.

댓글남기기