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(내림차순)에서는 가장 나중에 표시

11. 결과 행 제한하기 - LIMIT

행수 제한

  • LIMIT 구는 표준 SQL이 아님
  • MySQL과 PostgreSQL에서 만 사용할 수 있는 문법
SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수
  • LIMIT 다음에는 최대 행수를 수치로 지정함

정렬한 후 제한하기

  • LIMITWHERE은 기능과 내부처리 순서가 다름
    • 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은 생략 가능하며 기본값은 0
  • OFFSET에 의한 시작 위치 지정은 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 제품이 지원됨

reference

SQL 첫걸음