Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

영우

SELECT 문의 실행순서를 알아보자. 본문

CS/데이터베이스

SELECT 문의 실행순서를 알아보자.

duddn 2024. 2. 23. 00:53

SELECT문에는 다양한 절이 들어가게됩니다. 

아래의 쿼리가 실행되었을때를 어떤 순서로 처리하는지 알아봅니다.

SELECT 이름, SUM(주문개수) FROM 유저 JOIN 주문내역 ON 유저.이름 = 주문내역.이름
WHERE 나이 < 60 GROUP BY 이름 HAVING SUM(주문개수) < 6 
ORDER BY 이름 LIMIT 1;

 

FROM + JOIN

FROM절은 테이블을 식별합니다.

FROM 유저

JOIN절은 테이블을 병합하는데, ON 조건에 명시된대로 유저의 이름과 주문내역의 이름이 같은 경우 하나의 행으로 병합됩니다.

JOIN 주문내역 ON 유저.이름 = 주문내역.이름

WHERE

where절은 지정된 조건에 따라 테이블의 행을 필터링합니다. 영수는 나이가 60세 이상이므로 테이블에서 삭제합니다.

WHERE 나이 < 60

GROUP BY

지정된 열을 기준으로 행이 그룹화됩니다. 쿼리에서 이름을 기준으로 그룹화하므로 영우, 철수, 민수가 각 다른 그룹으로 처리됩니다.

GROUP BY 이름


HAVING

지정된 조건에 따라 그룹을 필터링합니다. 주문한 개수가 6개 이상인 철수는 테이블에서 삭제됩니다.

HAVING SUM(주문개수) < 6

SELECT

최종 결과 집합에 포함되는 테이블의 열을 남깁니다. 각 그룹의 묶이는 조건인 이름과 그룹의 주문개수의 합이 생성됩니다. 이외의 정보는 삭제합니다.

SELECT 이름, SUM(주문개수)

ORDER BY

순서를 정렬합니다. 이름을 역순으로 정렬하는 조건이므로 민수가 첫번째 행이 됩니다.

ORDER BY 이름

LIMIT

지정된 행수로 제한합니다. 1개만 남기므로 영우가 삭제됩니다.

LIMIT 1

 

깨달은점

  • WHERE에서 그룹의 조건을 명시해 줄 수 있을것 같은데 HAVING이 왜 필요하지? 라는 생각이 있었는데, WHERE을 처리한 이후 그룹을 만들기 때문에 그룹에 대한 조건은 HAVING에서 따로 처리해야한다는것을 알 수 있었습니다.

 

  • ORDER BY가 SELECT 이후에 처리되기 때문에 ORDER BY에 SELECT에 없는 행으로 정렬할 수 없을것 같았습니다. 찾아보니 데이터베이스의 종류와 버전, 설정에 따라 달랐습니다.
    • 이러한 기능을 지원을 하는 MySQL에서 직접 SELECT에 없는 행으로 정렬하는 쿼리를 만들어보았습니다.
    • SELECT에서 찾지 않는 행이지만 ORDER BY가 가능한것을 확인할 수 있습니다.

 

'CS > 데이터베이스' 카테고리의 다른 글

MySQL Full-Text Search  (0) 2024.03.08
CTE란 무엇인가요?  (2) 2024.02.29
클러스터링 인덱스의 사실과 오해  (0) 2024.02.15
서브쿼리란 뭘까?  (1) 2024.02.08
MySQL EXPLAIN 명령어는 뭘까?  (0) 2024.02.01