관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

SQL 기본 문법 3 - 좀더 깊이 있게 알아보는 SELECT 문 본문

알고리즘 및 자료 관리/SQL

SQL 기본 문법 3 - 좀더 깊이 있게 알아보는 SELECT 문

huenuri 2024. 10. 12. 23:48

SELECT ~ FROM ~ WHERE는 가장 핵심적인 SQL 문이다. 이에 부가적으로 결과를 정렬하거나, 일부만 보여주는 등의 다양한 처리가 필요할 때도 있다.

이 내용 역시 엘리스로 모두 학습했던 내용이라 어렵지 않게 공부해볼 수 있을 것 같다. 한번 더 복습한다는 의미로 정리해보려고 한다.

 

 

시작하기 전에

SELECT 문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 사용할 수 있다.

GROUP BY 절은 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출한다. 주로 그룹으로 묶는 경우는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 함께 사용된다. GROUP BY 절에서도 HAVING 절을 통해 조건식을 추가할 수 있다. HAVING 절은 WHERE 절과 비슷해 보이지만, GROUP BY 절과 함께 사용되는 것이 차이점이다.

 


 

 

 

 

 

ORDER BY 절

SELECT 절에서 FROM과 WHERE은 지난 절에서 다루었고 이번에는 아직 다루지 않은 ORDER BY, LIMIT를 살펴보고 GROUP BY, HAVING에 대해서도 알아볼 것이다.

 

1. 오름차순과 내림차순 정렬

ORDER BY 절은 결과의 값이 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다. 다음과 같이 입력하여 실행해보겠다. 

 

 

데뷔 일자가 빠른 순서대로 출력되었다. 대뷔 일자가 늦은 순서대로 출력하려면 어떻게 해야 할까? 제일 뒤에 DESC라고 붙여주면 된다. 기본값은 ASC인데, Ascending의 약자로 오름차순을 의미하고, DESC는 Descending의 약자로 내림차순을 의미한다.

 

 

이번에는 데뷔 일자가 늦은 순서대로 출력되었다.

 

 

 

2. ORDER BY와 WHERE 함께 사용하기

ORDER BY 절과 WHERE 절은 함께 사용할 수 있다. 평균 키가 164 이상인 회원들을 키가 큰 순서대로 조회해보겠다. 

 

하지만 syntax 오류가 발생한다. 그 이유는 SQL 구문의 순서가 틀렸기 때문이다. ORDER BY 절은 WHERE 절 다음에 나와야 한다. 수정을 한 후 다시 실행해보겠다.

 

 

 

이번에는 평균 키가 165 이상인 회원들이 제대로 출력되고 있다. 하지만 한 가지 더 고려할 사항이 있다. 잇지와 트와이스의 평균 키는 167로 동일한데 잇지가 먼저 출력되었다. 여기서 정렬 기준을 한 가지 더 추가하면 좋을 것 같다. 

 

 

 

3. 두 가지 정렬 기준 적용하기

정렬 기준은 1개 열이 아닌 여러 개 열로 지정할 수 있다. 우선 첫 번째 지정 열로 정렬한 후에 동일할 경우에는 다음 지정 열로 정렬할 수 있다. 즉, 평균 키가 큰 순서대로 정렬하되 평균 키가 같으면 데뷔 일자가 빠른 순서로 정렬한다.

 

이번에는 잇지와 트와이스 중에서 데뷔 일자가 빠른 순서대로 정렬되었다.


 

 

 

출력의 개수를 제한 : LIMIT

LIMIT는 출력하는 개수를 제한한다. 예를 들어, 회원 테이블을 조회하는데 전체 중 앞에서 3건만 조회할 수 있다.

 

 

 

이번에는 데뷔 일자가 빠른 회원 3건을 ORDER BY와 함께 사용해보기로 하자. LIMIT 형식은 LIMIT 시작, 개수이다. LIMIT 3만 쓰면 0, 3과 동일하다. 0은 생략되기도 한다.

 

 

 

필요하다면 중간부터 출력도 가능하다. 다음과 같이 평균 키가 큰 순으로 정렬하되, 3번째부터 2건만 조회할 수 있다.


 

 

 

중복된 결과를 제거 : DISTINCT

DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다. 여기서는 회원들의 지역(addr)을 출력해보겠다. 다음 SQL 결과를 보면 회원이 사는 지억은 경기, 경남, 서울, 전남, 경북 등 5군데인 것을 확인할 수 있다. 

 

데이터 건수가 적은데도 중복된 것을 눈으로 골라내기가 어렵다. 이럴 때 ORDER BY를 사용해 골라낼 수 있다.

 

정렬은 되었지만 데이터의 개수가 많다면 종류를 세는 것은 너무 어려울 것이다. 이를 간단하게 해결하는 것이 DISTINCT 문이다. 열 이름 앞에 DISTINCT를 써주면 중복된 데이터를 1개만 남기고 제거한다.


 

 

 

 

GROUP BY 절

GROUP BY 절은 그룹으로 묶어주는 역할을 한다. 다음의 SQL을 사용하면 market_db의 구매 테이블(buy)에서 회원(mem_id)이 구매한 물품의 개수(amoun)를 구할 수 있다.

 

 

회원별로 여러 건의 물건 구매가 있었고, 각각의 행이 별도로 출력되었다. APN(에어핑크) 회원의 경우에는 1+2+1+1=5개의 물건을 구매했다. 일일이 구할 수는 없으니 이럴 때 사용하는 것이 집계 함수이다. 집계 함수는 GROUP BY 절과 함께 쓰이며 데이터를 그룹화해주는 기능을 한다.


 

 

 

집계 함수

GROUP BY와 함께 주로 사용되는 집계 함수는 다음 표와 같다.

 

각 회원별로 구매한 개수를 합쳐서 출력하기 위해서는 집계 함수인 SUM()과 GROUP BY 절을 사용하면 된다. 즉, GROUP BY로 회원별로 묶어준 후에 SUM()함수로 구매한 개수를 합치면 된다.

 

1) SUM() 함수로 구매한 개수 구하기

 

 

2) 별칭 사용하기

별칭을 사용해서 결과를 보기 좋게 만들 수도 있다.

 

별칭에 작은따옴표를 사용해도 되지만, 작은따옴표는 INSERT 등에서 문자를 입력할 때 사용하므로 별칭에는 큰따옴표를 사용하는 것이 좋다.

 

 

 

3) 구매한 금액의 총합 구하기

이번에는 회원이 구매한 금액의 총합을 출력해보겠다. 구매한 금액은 가격(price) * 수량(amount)이다. 역시 합계는 SUM()을 사용한다.

 

 

4) 구매한 물품 개수의 평균 구하기

전체 회원이 구매한 물품 개수의 평균을 구해보겠다. 회원이 한 번 구매할 때마다 평균 몇 개를 구해하는지 알아보는 것이다.

 

평균 구매 개수의 결과는 3.0개이다. 이번에는 한 번 구매시 평균 몇 개를 구매했는지 알아보겠다. 회원(mem_id)별로 구해야 하므로 GROUP BY를 사용하면 된다.

 

 

 

5) 연락처가 있는 회원의 수 세기

회원 테이블에서 연락처가 있는 회원의 수를 카운트해본다. 

 

 

그런데 결과는 전체 회원 수인 10명이 나온다. 연락처가 있는 회원만 카운트하려면 국번(phone1) 또는 전화번호(phone2)의 열 이름을 지정해야 한다. 그러면 NULL 값인 항목은 제외하고 카운트하여 연락처가 있는 회원의 인원만 나온다.

 

COUNT(*)는 모든 행의 개수를 세고, COUNT(열_이름)은 열 이름의 값이 NULL인 것을 제외한 행의 개수를 센다.


 

 

 

HAVING 절

앞서 살펴보았던 SUM()으로 회원별 총 구매액을 구해보겠다.

 

결과 중에서 총 구매액이 1000 이상인 회원에게만 사은품을 증정하려면 어떻게 해야 할까? WHERE 절을 사용하면 오류 메시지가 뜬다.

 

 

이 오류는 집계 함수는 WHERE 절에 나타낼 수 없다는 내용이다. 이럴 때 WHERE 대신 사용되는 것이 HAVING 절이다. HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한한다. 그리고 HAVING 절은 꼭 GROUP BY 절 다음에 나와야 한다.

 

 

 

 

만약 총 구매액이 큰 사용자부터 나타내려면 ORDER BY를 사용하면 된다.

 

여기까지 SELECT 문과 관련된 기본적인 SQL 형식을 살펴보았다.


 

 

 

단원 마무리하기

 


 

 

 

 

확인 문제 풀기

 

 

 

 

 

 

 

모든 문제는 책을 참고하지 않고 혼자서 푸는데 그래도 한 문제 빼고 다 맞았다. HAVING은 GROUP BY일 때 WHERE 대신 조건으로 사용하는 것이다. 이 둘이 좀 헤깔렸다. 나머지 SUM, AVG, COUNT는 WHERE 안에 쓸 수 있는 조건들이다.


 

 

 

 

학습을 마치고

확인 문제를 내일 새벽에 풀어보려고 남겨두었는데 밤에 30분이 다 되도록 누워있었으나 잠이 오지 않았다. 가끔 그런 날이 있는데 그냥 일어나서 공부를 더 하기로 했다.

이렇게 해서 SELECT 문에 대해서 기본적인 내용을 모두 학습했다.