Database

SQL 첫 걸음 11장] 결과 행 제한과 수치연산

hololo 2021. 10. 16. 23:36

##본 포스팅은 "SQL 첫걸음 - 아사이 아츠시" 책을 보고 요약한 것입니다.

손가락 왤케 까매?

LIMIT 행수 제한

인터넷 쇼핑몰에서 물건을 구매하거나 커뮤니티 사이트의 게시판을 읽다보면
수많은 상품과 게시물을 전부 하나의 페이지에 표시하는 대신 몇 건씩 나누어 표시하는 것을 알 수 있다.

이런 경우 LIMIT을 사용하여 표시할 건(행) 수를 제한할 수 있다.

SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]

LIMIT구는 표준 SQL은 아니다.
MySQL과 PostgreSQL에서만 사용할 수 있다.

WHERE 구나 ORDER BY 구의 뒤에 지정한다.

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수

LIMIT 다음에는 최대 행수를 수치로 지정한다.
만약 테이블에 하나의 행만 있다면 LIMIT 3으로 지정해도 1개의 행이 반환된다.

- 정렬한 후 제한하기
WHERE도 조건을 걸어 행을 제한할 수 있다.
하지만 LIMIT와 WHERE은 기능과 내부처리 순서가 전혀 다르다.
WHERE 구로 검색 -> ORDER BY -> LIMIT 순으로 처리된다.

- LIMIT을 사용할 수 없는 데이터베이스에서의 행 제한
1) SQL Server - TOP

SELECT TOP 3 * FROM table;

2) Oracle - ROWNUM

SELECT * FROM table WHERE ROWNUM <=3;

 

제한 행 오프셋 제한

대량의 데이터를 하나의 페이지에 표시하는 것은 기능적으로, 속도적으로 효율적이지 못하므로,
일반적으로 페이지 나누기(pagination) 기능을 사용한다.
페이지 하단 부분에 '1 2 3 4....' 등으로 표시된 것이 그 예이다.

SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치

데이터를 취득할 위치는 OFFSET으로 지정할 수 있다.
OFFSET에 의한 시작 위치 지정은 LIMIT 뒤에 기술할 수 있다.

위치 지정은 0부터 시작하며, 4번째 행부터 취득하고 싶다면 OFFSET 3으로 표현하면 된다.

SELECT * FROM sample LIMIT 3 OFFSET 3;

 

 

두번째 페이지에는 4행부터 3건의 데이터를 표시하고 싶다면, 위처럼 작성하면 딘다.

 

수치 연산

1. 수치 연산
SQL은 데이터베이스를 조작하는 언어지만, 컴퓨터를 조작하는 언어이기도 한 만큼 기본적으로 계산기능을 포함한다.

SELECT구로 연산을 수행할 수 있다.

no price quantity
1 100 10
2 230 24
3 1980 1
SELECT *, price * quantity FROM sample;
no price quantity price * quantity
1 100 10 1000
2 230 24 5520
3 1980 1 1980


2. 열의 별명
price * quantity와 같이 열 이름이 길고 알아보기 어려운 경우는 별명을 붙여 열명을 재지정할 수 있다.

예를 들어 amount라는 별명을 붙이면 조금 더 알아보기 쉬울 것이다.

SELECT *, price * quantity AS amount FROM sample;
no price quantity amount
1 100 10 1000
2 230 24 5520
3 1980 1 1980

별명은 예약어 AS를 사용해 지정한다.

SELECT 구에서는 콤마로 구분하여 복수의 식을 지정할 수 있으며 각각의 식에 별명을 붙일 수 있다.
MySQL에서는 별명을 중복해서 지정해도 에러는 발생하지 않지만, 문제가 발생할 수도 있어 기본적으로 중복되지 않도록 지정한다.

키워드 AS는 생략할 수 있다.
단, 별명을 한글로 지정하는 경우에 더블쿼트로 둘러싸서 지정한다.
더블쿼트를 사용하면 예약어와 같은 이름으로 사용할 수도 있다.

또한 이름을 붙일 때는 숫자로 시작할 수 없다.

SELECT *, price * quantity AS amount FROM sample
	WHERE price * quantity > = 2000;

price * quantity로 금액을 계산해 그 값이 2000 이상인 행을 검색하라는 뜻이다.

여기서 WHERE 구에서 amount로 지정하면 안된다.
그 이유는 내부 처리 순서때문이다.

WHERE와 SELECT의 처리 순서는,
WHERE -> SELECT 구의 순서로 처리된다.

WHERE 구로 행이 조건에 일치하는지 아닌지를 먼저 조사한 후에 SELECT 구에 지정된 열을 선택해 결과로 반환하는 식으로 처리한다.

별명은 SELECT 구문을 내부 처리할 때 비로소 붙여지기 때문에, SELECT보다 우선 처리되는 WHERE 구에서 사용한 별칭은 아직 내부적으로 지정되지 않은 상태가 되어 에러가 발생한다.


3. NULL 값의 연산
NULL 값은 0으로 처리되지 않는다.
NULL로 연산하면 결과는 NULL이 된다.

4. ORDER BY 구에서 연산하기

SELECT *, price * quantity AS amount FROM sample ORDER BY amount DESC;

ORDER BY는 서버에서 내부적으로 가장 나중에 처리된다.
즉, SELECT 구보다 나중에 처리되기 때문에 SELECT 구에서 지정한 별명을 ORDER BY에서도 사용할 수 있다.

WHERE -> SELECT -> ORDER BY

 

연산자 함수

연산자 외에 함수를 사용해 연산할 수도 있다.

- ROUND : 소수점 반올림 함수
- DECIMAL : 열을 정의할 때 정수부와 소수부의 자릿수를 지정할 수 있는 자료형
- TRUNCATE : 버림 함수