[DB] 정렬과 연산
9. 정렬-ORDER BY
- ORDER BY 구를 지정하면 검색 결과의 행 순서를 바꿀 수 있음
- 지정하지 않으면 데이터베이스 내부에 저장된 순서로 반환
ORDER BY로 검색 결과 정렬
SELECT 열명 FROM 테이블명 (WHERE 조건식) ORDER BY 열명
- 검색 조건이 필요없는 경우 WHERE 구 생략 가능
ORDER BY DESC로 내림차순으로 정렬
- ORDER BY 구에 지정한 열의 값에 따라 행의 순서가 바뀜
SELECT 열명 FROM 테이블명 ORDER BY 열명 DESC
- 내림차순은 열명 뒤에
DESC
를 붙여 지정- DESC는 descendant(하강)의 약자
SELECT 열명 FROM 테이블명 ORDER BY 열명 ASC
- 오름차순은 생략가능하며
ASC
로도 지정할 수 있음- ASC는 ascendant(상승)의 약자
- ASC or DESC로 정렬 방법을 지정하지 않으면 ASC로 간주
- 즉, ORDER BY의 기본 정렬방법은 오름차순
대소관계
수치형 데이터, 날짜 시간형 데이터
- 숫자의 크기로 판별
문자열형 데이터
- 알파벳, 한글 순이며 한글은 자음, 모음 순
- 사전식 순서에 의해 결정
사전식 순서에서 주의할 점
- 수치형과 문자열형 데이터는 대소관계의 계산 방법이 다름
ORDER BY는 테이블에 영향을 주지 않음
ORDER BY
는 서버에서 클라로 행 순서를 바꾸어 결과를 반환하는 것 뿐 저장장치에 저장된 데이터의 행 순서를 변경하지 않음SELECT
명령은 테이블의 데이터를 참조만 할 뿐 변경하지 않음
10. 복수의 열을 지정해 정렬하기
복수 열로 정렬 지정
ORDER BY
로 행을 정렬하는 경우 같은 값을 가진 행의 순서와 ORDER BY 구를 생략했을 때 순서는 일정하지 않음- 데이터베이스 서버의 당시 상황에 따라 어떤 순서로 행을 반환할지 결정됨
- 언제나 같은 결과 값을 얻기 위해서는 ORDER BY 구로 순서를 지정해야함
ORDER BY로 복수 열 지정
- ORDER BY 구에는 SELECT 구에서 열을 콤마(,)로 열명을 구분한 것 처럼 복수로 열을 지정할 수 있음
SELECT 열명 FROM 테이블명 ORDER BY 열명1, 열명2...
- 복수 열을 지정하면 정렬 순서는 지정한 열명의 순서를 따름
정렬방법 지정
- 복수 열을 지정한 경우 각 열에 대해 개별적으로 정렬방법을 지정할 수 있음
- 각 열 뒤에 ASC or DESC를 붙임
SELECT 열명 FROM 테이블명
ORDER BY 열명1 [ASC|DESC], 열명2 [ASC|DESC]...
- [] 부분은 생략 가능
- |는 둘중 하나라는 뜻
-
…는 동일한 형태로 연속해서 지정할 수 있다는 의미
- 복수 열을 지정하는 경우에 정렬방법을 생략하면 기본값으로 ASC가 됨
- 데이터베이스 제품에 따라 기본값이 다를 수도 있음
- 가독성을 위해서 가능한 한 정렬방법을 생략하지 않고 표기하는 것이 좋음
NULL 값의 정렬순서
- ORDER BY로 지정한 열에서 NULL 값을 가지는 행은 가장 먼저 표시되거나 가장 나중에 표시됨
- NULL에 대한 대소비교 방법은 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 다름
- MySQL의 경우 NULL 값을 가장 작은 값을 취급함
- ASC(오름차순)에서는 가장 먼저, DESC(내림차순)에서는 가장 나중에 표시
- MySQL의 경우 NULL 값을 가장 작은 값을 취급함
11. 결과 행 제한하기 - LIMIT
행수 제한
LIMIT 구
는 표준 SQL이 아님- MySQL과 PostgreSQL에서 만 사용할 수 있는 문법
SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수
LIMIT
다음에는 최대 행수를 수치로 지정함
정렬한 후 제한하기
LIMIT
과WHERE
은 기능과 내부처리 순서가 다름LIMIT
은 반환할 행수를 제한하는 기능으로WHERE 구
로 검색한 후ORDER BY
로 정렬된 뒤 최종적으로 처리
LIMIT를 사용할 수 없는 데이터베이스에서의 행 제한
- SQL Server에서는
LIMIT
와 비슷한 기능을 하는TOP
을 사용할 수 있음TOP
뒤에 최대 행수를 지정하면 됨
- Oracle에는
LIMIT, TOP
도 없음, 대신ROWNUM
이라는 열을 사용해WHERE 구
로 조건을 지정하여 행 제한 할 수 있음ROWNUM
은 클라에게 결과가 반환될 때 각 행에 할당되는 행 번호
오프셋 지정
- 웹 시스템에서는 클라의 브라우저를 통해 페이지 단위로 화면에 표시할 내용을 처리함
- 대량의 데이터를 하나의 페이지에 표시하는 것은 기능적, 속도 측면에서 비효율적이므로 일반적으로 페이지 나누기(pagination) 기능을 사용함
- ex) 커뮤니티 사이트 등에서 게시판 하단 부분에 1 2 3 4 5로 표시된 것
LIMIT 구
의OFFSET
은 생략 가능하며 기본값은 0OFFSET
에 의한 시작 위치 지정은LIMIT
뒤에 기술- 위치 지정은 0부터 시작하는 배열 인덴스와 비슷, 시작할 행 - 1
# 12. 수치 연산
사칙 연산
- 산술 연산자 = 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈) + 나눗셈의 나머지
연산자 | 연산 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
연산자의 우선순위
우선순위 | 연산자 |
---|---|
1 | * / % |
2 | + - |
- 기본적으로 왼쪽에서 오른쪽으로 연산
- 우서눈위가 다른 연산자들이 섞여 있는 경우 우선순위 높은 쪽 먼저 계산
SELECT 구로 연산
SELECT 식 1, 식 2... FROM 테이블명
- 이 식은 열명, 연산자, 상수로 구성됨
열의 별명
- 별명은 예약어
AS
를 사용해 지정함AS
는 생략 가능
- 별명은 기본적으로 중복되지 않도록 지정함
- 별명을 한글로 지정하면 오작동할 수 있기 때문에 더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정해야함
WHERE 구에서 연산
WHERE 구와 SELECT 구의 내부처리 순서
- DB 서버 내부에서
WHERE 구
->SELECT 구
의 순서로 처리됨WHERE 구
로 행이 조건 일치 여부 조사 후SELECT 구
에 열을 선택해 결과로 반환함
- SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용할 수 없음
NULL 값의 연산
- C나 PHP 언어에서는 NULL이 0으로 처리되지만 SQL에서는 NULL 값이 0으로 처리 안됨
- NULL로 연산하면 결과는 NULL이 됨
ORDER BY 구에서 연산
ORDER BY
는 서버에서 내부적으로 가장 나중에 처리됨SELECT 구
에서 지정한 별명을 사용할 수 있음
서버에서 내부처리 순서
WHERE 구 -> SELECT 구 -> ORDER BY 구
함수
함수명 (인수1, 인수2..)
- 함수는 함수명에 따라 연산 방법이 결정
- 연산자는 기호에 따라 연산 방법이 결정
- 함수는 계산 대상을 인수로 지정
- 연산자는 좌우의 항목이 연산 대상이 됨
- 인수는 파라미터(parameter)라 부름
- 연산자가 그러하듯 함수 역시 결괏값을 반환함
- 이 결괏값을 함수의 반환값이라고 함
함수와 연산자는 표기 방법이 다를 뿐 같음
10 % 3 -> 1
MOD(10, 3) -> 1
ROUND 함수
반올림 자릿수 지정
- ROUND 함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림한 값을 반환함
- ROUND 함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있음
- 해당 인수를 생략하는 경우 0으로 간주
- 1을 지정하면 소수점 둘째 자리를 반올림함
- 인수를 음수로 지정해 정수의 반올림할 자릿수도 지정할 수 있음
- -1을 ㅣ정하면 1단위, -2을 지정하면 10단위를 반올림함
13. 문자열 연산
문자열 결합
- 문자열 결합 연산자는 DB 제품마다 방언이 있음
연산자/함수 | 연산 | 데이터베이스 |
---|---|---|
+ | 문자열 결합 | SQL Server |
|| | 문자열 결합 | Oracle, DB2, PostgreSQL |
CONCAT | 문자열 결합 | MySQL |
- 문자열 결합은 2개의 열 데이터를 모아서 1개의 열로 처리하고 싶은 경우에 자주 사용
SUBSTRING 함수
TRIM 함수
- 문자열의 앞뒤로 여분의 스페이스가 있을 경우 이를 제거해주는 함수
- 문자열 도중에 존재하는 스페이스는 제거되지 않음
- 고정길이 문자열 형에 대해 많이 사용하는 함수
- CHAR 형의 문자열형에서는 문자열의 길이가 고정되며 남은 공간은 스페이스로 채움
- 이 빈 공간을 채우기 위해 사용한 스페이스를 제거하는 용도로 사용
CHARACTER_LENGTH 함수
- 문자열의 길이를 계산해 돌려주는 함수
- VARCHAR 형의 문자열은 가변 길이이므로 길이가 서로 다름
- CHARACTER_LENGTH 함수를 사용하면 문자열의 길이를 알 수 있음
- OCTET_LENGTH 함수는 문자열의 길이를 바이트 단위로 계산해 돌려주는 함수
14. 날짜 연산
SQL에서의 날짜
- 날짜나 시간 데이터는 수치 데이터와 같이 사칙연산 가능
시스템 날짜
날짜의 덧셈과 뺄셈
15. CASE 문으로 데이터 변환
CASE 문
CASE 문
을 이용해 데이터를 변환할 수 있음
CASE WHEN 조건식1 THEN 식1
[WHEN 조건식2 THEN 식2...]
[ELSE 식3]
END
WHEN 절
에는 참과 거짓을 반환하는 조건식을 기술- 해당 조건을 만족하여 참인 경우
THEN 절
이 처리됨 WHEN 절
의 조건식을 차례로 평가해 나가다가 가장 먼저 조건을 만족하는WHEN 절
과 대응하는THEN 절
식의 결과를CASE 문
의 결괏값으로 반환- 어떤 조건식도 만족하지 못한 경우는
ELSE 절
에 기술한 식이 반환됨ELSE
는 생략 가능, 생략했을 경우 ELSE NULL로 간주
COALESCE
- 여러 개의 인수를 지저할 수 있음
- 주어지 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정한 인수의 값을 반환
또 하나의 CASE 문
CASE를 사용할 경우 주의사항
CASE 문
은 어디에나 사용할 수 있음WHERE 구
에서 조건식의 일부ORDER BY 구
나SELECT 구
에서도 사용 가능
ELSE 생략
ELSE
를 생략하면 ELSE NULL이 됨ELSE
를 생략하지 않고 지정하는 편이 나음
WHEN에 NULL 지정
DECODE NVL
- Oracle에는 디코드를 수행하는
DECODE 함수
가 내장되어 있음DECODE 함수
는CASE 문
과 같은 용도로 사용됨
CASE 문
은 표준 SQL로 규정되었기 때문에 많은 DB 제품이 지원됨