카테고리 없음

SQL 첫걸음 3장_정렬과 연산

haenaneah 2025. 3. 25. 20:48

SQL3-4장.docx
1.03MB

9강_정렬 - ORDER BY 

 

SELECT 명령의 ORDER BY 구를 사용하여 검색결과의 행 순서를 바꿀 수 있음.

- 정렬(sort) 방법

SELECT 열명 FROM 테이블명 WHERE ORDER BY 열명

 

ORDER BY  구를 지정하지 않을 경우에는 데이터베이스 내부에 저장된 순서로 반환.

; 정해진 순서로 결괏값을 얻기 위해서는 ORDER BY 구를 지정해야 함.

 

 

1. ORDER BY로 검색 결과 정렬하기

- WHERE 구 뒤에 ORDER BY 구를 지정하는 경우

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

 

검색 조건이 필요없는 경우에는 WHERE 구를 생략. 

-FROM 구 뒤에 ORDER BY 구를 지정하는 경우

SELECT 열명 FROM 테이블명 ORDER BY 열명

 

오름차순으로 정렬.

 

 

2. ORDER BY DESC로 내림차순으로 정렬하기

- 내림차순으로 정렬은 열명 뒤에 DESC를 붙여 지정.

SELECT 열명 FROM 테이블명 ORDER BY 열명 DESC

 

- 오름차순은 내림차순과 달리 생략 가능하며 ASC로도 지정할 수 있음.

SELECT 열명 FROM 테이블명 ORDER BY 열명 ASC

 

-ASC나 DESC로 정렬방법을 지정하지 않은 경우에는 ASC로 간주. (ORDER BY의 기본 정렬방법은 오름차순)

 

 

3. 대소관계 

 

- 문자열형 데이터 : 알파벳, 한글(자음, 모음순) -> 사전식 순서에 의해 결정

- 사전식 순서에서 주의할 점 : 문자열형 열에 숫자를 저장하면 문자로 인식되어 대소관계으 계산 방법이 달라짐.

; 수치형과 문자열형 데이터는 대소관계의 계산 방법이 다르다!

 

 

4. ORDER BY는 테이블에 영향을 주지 않는다

- 서버에서 클라이언트로 행 순서를 바꾸어 결과를 반환하는 것뿐, 저장장치에 저장된 데이터의 행 순서를 변경하는 것은 아님.

- SELECT 명령은 데이터를 저장하는 명령. 이는 테이블의 데이터를 참조만 할 뿐이며 변경은 하지 않음.


10강 복수의 열을 지정해 정렬하기

- 복수 열을 지정해 정렬하는 방법

SELECT 열명 FROM 테이블명 WHERE 조건식
ORDER BY 열명1 [ASCIDESC], 열명2 [ASCIDESC]...

 

-한편 정렬 시에는 NULL 값에 주의할 필요가 있음.

 

 

1. 복수 열로 정렬 지정

- ORDER BY로 행을 정렬하는 경우 같은 값을 가진 행의 순서는 어떻게 정해지는가?

- ORDER BY 구는 생략할 수 있는데 이때 순서는 어떻게 정해지는가?

; 순서눈 일정하지 않다

 

- 언제나 같은 순서로 결과를 얻고 싶다면 반드시 ORDER BY 구로 순서를 지정해야 함.

- 같은 값이 들어가 있는 경우 ORDER BY 구를 지정해도 1개의 열만으로는 정확히 순서를 결정할 수 없는 경우도 많음.

a열, b열 모두 INTEGER 형. b열은 a열의 하위 번호. SELECT 명령에 있는 ORDER BY를 이용해 a열로 정렬하면 b열의 정렬 순서가 일정하지 않음. 그 이유는 a열의 값이 1인 행이 총 3개 있는데, 서로 값이 똑같아 순서를 결정할 수 없기 때문.

 

 

- ORDER BY로 복수 열 지정하기

- SELECT 구에서 열을 지정한 것처럼 콤마()로 열명을 구분해 지정.

SELECT 열명 FROM 테이블명 ORDER BY 열명1, 열명2...

 

- 정렬 순서는 지정한 열명의 순서를 따름. 이때 값이 같아 순서를 결정할 수 없는 경우에는 다음으로 지정한 열명을 기준으로 정렬하는 식으로 처리.

 

 

2. 정렬방법 지정하기

- 복수 열을 지정한 경우에도 각 열에 대해 개별적으로 정렬방법을 지정할 수 있음. 이때 각 열 뒤에 ASC나 DESC를 붙여줌.

SELECT 열명 FROM 테이블명
			ORDER BY 열명 1 [ASCIDESC], 열명2 [ASCIDESC]

 

- 구문 중에서 [ ] 부분은 생략할 수 있음. 

|는 둘 중 하나라는 뜻

...는 동일한 형태로 연속해서 지정할 수 있다는 의미 

; 이를 활용해 각 열의 정렬방법을 다르게 지정할 수 있음.

 

- 복수 열을 지정하는 경우에 정렬방법을 생략하면 기본값은 ASC가 됨. (하지만 데이터베이스 제품에 따라 기본값을 변경할 수도 있으므로 주의필요)

 

 

3. NULL 값의 정렬순서

- 특성상 대소비교를 할 수 없어 정렬 시에는 별도의 방법으로 취급.

- '특정 값보다 큰 값', '특정 값보다 작은 값'의 두 가지로 나뉘며 이 중 하나의 방법으로 대소비교를 함

 

; ORDER BY로 지정한 열에서 NULL 값을 가지는 행은 가장 먼저 표시되거나 가장 나중에 표시됨.

참고용


11강 결과 행 제한하기 - LIMIT

REVIEW ; SELECT 명령에서는 결괏값으로 반환되는 행을 제한할 수 있음.

- LIMIT 구로 결과 행을 제한하는 방법

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

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

 

 

1, 행수 제한

- LIMIT 구는 표준 SQL은 아님. (MySQL과 PostgreSQL에서 사용할 수 있는 문법)

- LIMIT 구는 SELECT 명령의 마지막에 지정하는 것으로 WHERE 구나 ORDERBY 구의 뒤에 지정.

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

 

- LIMIT 다음에는 최대 행수를 수치로 지정. (LIMIT로 지정히는 것은 ‘최대 행수’)

(만약 테이블에 하나의 행만 있다면 LIMIT 3으로 지정해도 1 개의 행이 반환)

 

 

- 정렬한 후 제한하기

- LIMIT는 반환할 행수를 제한하는 기능으로, WHERE 구로 검색한후 ORDERBY로 정렬된 뒤 최종적으로 처리

(LIMIT WHERE은 기능과 내부처리 순서가 전혀 다름)

 

 

-LIMIT를 사용할 수 없는 데이터베이스에서의 행 제한

LIMIT는 표준 SQL이 아니기 때문에 MySQL과 PostgreSQL 이외의 데이터베이스에서는 사용할 수 없음

 

SQL Server에서는 LIMIT와 비슷한 기능을 하는 'ToP’을 시용할 수 있음.

TOP 뒤에 최대 행수를 지정하면 됩니다.
알아두며면 좋은 정보

 

 

2. 오프셋 지정

- 페이지 나누기 기능은 LIMIT를 사용해 간단히 구현할 수 있음.

- 이때 ‘6 번째 행부터’라는 표현은 결핏값으로부터 데이터를 취득할 위치를 가리키는 것으로 LIMIT 구에 OFFSET으로 지정할 수 있음. (LIMIT 구의 OFFSET은 생략 기능하며 기본값은 0)

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

 

- 두 번째 페이지에는 4행부터 3건의 데이터를 표시

SELECT * FROM sample33 LIMIT 3 OFFSET 3;

12강 수치 연산

- 계산하는 방법, 특히 수치의 연산 방법에 대해

+ - * / % MOD

 

- 어떤 계산을 할지는 연산자를 이용해 지정. 

 

 

1. 사칙 연산

데이터베이스 제품에 따라 적용하는 함수가 다른데 % 대신 MOD 함수를 사용하는 경우도 있음.

 

 

- 연산자의 우선순위

기본적으로 왼쪽애소 오른쪽으로 진행.

 

- SELECT 구나 WHERE 구 안에서도 연산할 수 있음.

 

 

2. SELECT 구로 연산하기

SELECT 식1, 식2...FROM 테이블명

 

- (예제) * 의 앞뒤로 스페이스를 넣을 필요는 없음. (price *quantity와 같이 붙여 써도 무관)

 

 

3. 열의 별명

- 열 이름이 길고 알아보기 어려운 경우는 별명을 붙여 열명을 재지정할 수 있음.

 

price * quantity에 amount라는 별명

 

- 별명은 예약어 AS를 시용해 지정.

- SELECT 구에서는 콤마(,)로 구분해 복수의 식을 지정할 수 있으며 각각의 식에 별명을 붙일 수 있음.

알아두면 좋은 정보

 

- 키워드 AS는 생략할 수 있음.

- 별명은 영어, 숫자, 한글 등으로 지정가능. (한글로 지정하는 경우에는 여러 가지로 오작동하는 경우가 많으므로 더블쿼트/MySQL에서는 백쿼트/로 둘러싸서 지정)

이 룰은 데이터베이스 객체의 이름에 ASCII 문자 이외의 것을 사용할 경우에 해당.

 

- 데블쿼트로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주.

- 한편 싱글쿼트로 둘러싸는 것은 문자열 상수.

 

 

- 더블쿼트로 둘러싸서 지정하면 예약어와 같은 이름으로 지정하여 사용할 수 있음.

(예제)

 

- 이름을 붙일 때는 숫자로 시작할 수 없음. 

- 수치형 상수를 명령 안에서 사용할 경우에는 쿼트로 묶지 않고 숫자만 입력.

(이때 이름이 숫자로 시작한다면 그것이 수치형 상수를 의미하는 것인지 데이터베이스 객체명을 의미하는 것인지 구별할 수 없음. 따라서 데이터베이스 객체명은 '숫자로 시작해서는 안 된다'라는 제약이 생김. 다만 더블쿼트로 묶으면 피할 수 있음.)

; 이름을 지정하는 경우 숫자로 시작되지 않도록 한다!

알아두면 좋은 정보

 

 

4. WHERE 구에서 연산하기

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

 

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

- WHERE 구에도 amount로 지정하면 되지 않을까? 하지만 그렇게 실행하면 amount라는 열은 존재하지 않는다는 에러가 발생.

 

 

- WHERE 구와 SELECT 구의 내부처리 순서

- WHERE 구에서의 행 선택 SELECT 구에서의 열 선택은 데이터베이스 서버 내부에서 WHERE 구 > SELECT 구의 순서로 처리.

- 별명은 SELECT 구문을 내부 처리할 때 붙여짐. 

; SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용할 수 없다!

간단한 이해구조

 

 

5. NULL 값의 연산

- SQL에서는 NULL 값이 0으로 처리되지 않음.

(즉, 'NULL+1’의 결괏값은 1이 아닌 NULL)

- 1 / NULL을 계산해도 NULL이 0으로 처리되지 않아 에러가 발생하지 않고 결과는 NULL이 됨.

 

 

6. ORDER BY 구에서 연산하기

: SELECT 구보다 나중에 처리되기 때문에 SELECT 구에서 ORDER BY에서도 사용할 수 있음.

위의 순서와 같이 서버에서 내부처리가 됨.

 

 

7. 함수

함수명 (인수1,인수2...)

 

- 얀산자는 기호에 따라 연산 방법이 결정

- 함수는 함수명에 따라 연산 방법이 결정

ㄴ 계산 대상을 인수로 지정 (이때 인수/피라미터/는 함수명 위에 괄호로 묶어 표기)

- 함수의 결괏값 반환을 '함수의 반환값'


(중간파트는 파일첨부)


14강 날짜 연산

- 날짜와 시간을 초 단위로 저장할 수 있는 날짜시간형을 중심으로

CURRENLTIMESTAMP CURRENT_DATE INTERVAL

 

1. SQL에서의 날짜

- 날짜나 시간 데이터는 수치 데이터와 같이 사칙 연산 가능

> 결괏값으로 동일한 날짜시간 유형의 데이터를 반환하는 경우

> 기간(간격)의 차를 나타내는 기간형 데이터는 반환하는 경우

 

- 시스템 날짜

- RDBMS에서도 시스템 날짜와 시간을확인히는힘수를 제공

- 표준 SQL에서는 ‘CURRENT_TIMESTMP’라는 긴 이름의 함수로 실행했을 때를 기준으로 시간을 표시(CURRENT_TIMESTMP는 함수임에도 인수를 필요로 하지 않음)

FROM 구를 생략. SELECT 구만으로도 SELECT 명령 실행. (Oracle과 같은 전통적인 데이터베이스에서는 FROM 구를 생략할 수 없으므로 주의)

 

- Oracle에서는 SYSDATE 함수 SQL Server에서는 GETDATE 함수를 사용해도 시스뱀 날찌를 확인할 수 있음 ( 표준화되기 ㅈㄴ에 구현된 함수인 만큼 사용하지 않는 편이 나음)

 

- 날짜 서식

- CURRENT _TIMEST뻐t1P를 사용해 시스템 상의 날찌를 저장 (임의의 날짜를 저장하고 싶을 경우, 직접 날짜 데이터를 지정해야 함)

알아두면 좋은 내용

 

- Oracle의 경우 TO DATE 함수를 사용해 문자열 데이터를 날짜형 데이터로 변환할 수 있으며 서식 또한 별도로 지정할 수 있음

TO_DATE('2014/01/25','YYYY/MM/DD')

 

- 반대로 날짜형 데이터를 서식에 맞춰 변환해 문자열 데이터로 출력히는 함수도 존재.(Oracle의 경우 TO CHAR 함수가그에 해당)

 

 

2. 날짜의 덧셈과 뺄셈

- 날짜시간형 데이터는 기간형 수치데이터와 덧셈 및 뺄셈할 수 있음.

- 날짜시간형 데이터에 기간형 수치데이터를 더하거나 빼면 날짜시간형 데이터가 반환.

예시

 

 

- CURRENT_DATE는 시스템 날짜만 확인하는 함수

 

 

- 날짜형 간의 뺄셈

- 날짜시간형 데이터 간에 뺄셈을 할 수 있음.

- 한편, MySQL에서는 DATEDIFF(’2014-02-28’, ’2014-01-01’ )로 계산할 수 있음.


15강 CASE 문으로 데이터 변환하기

CASE WHEN 조건식1 THEN 식1
  [WHEN 조건식2 THEN 식2...]
  [ELSE 식3]
END

 

- CASE 문을 이용하는 경우 : 임의의 조간에 따라 독자적으로 변환 처리를 지정해 데이터를 변환하고 싶은 경우

 

 

1. CASE 문

- NULL 값을 0으로 간주하여 계산하고 싶은 경우(NULL 값으로 연산한 결과는 모두 NULL이 됨)

- RDBMS에서 사용자가 함수를 작성할 수 있음.

CASE WHEN 조건식1 THEN 식1
  [WHEN 조건식2 THEN 식2...]
  [ELSE 식3]
END

 

- WHEN 절에는 참과 거짓을 반환히는 조건식을 기술

> 해당 조건을 만족하여 참이 되는 경우는 THEN 절에 기술한 식이 처리

(이때 WHEN 과 THEN을 한데 조합해 지정할 수 있음)

> WHEN 절의 조건식을 차례로 평가해 나가다가 가장 먼저 조건을 만족한 WHEN 절과 대응히는 THEN 절 식의
처리결과를 CASE 문의 결괏값으로 반환

> 그 어떤 조건식도 만족하지 못한 경우에는 ELSE 절에 기술한 식이 채택

(ELSE는 생략 가능하며 생략했을 경우 ‘ELSE NULL’로 간주)

 

NULL 값을 0으로 변환하는 CASE 식 구현사례. a 열 값이 NULL 일 때 WHEN a 1S NULL은 참이 되므로 CASE 문은 THEN 절의 ‘0’을 반환. NULL이 아닌 경우에는 ELSE 절의 ‘a’ 즉 a 열의 값을 반환.

 

- COALESCE

- NULL 값을 변환하는 경우라면 CO와ESCE 함수 사용하는 편이 더 쉬움.

SELECT a, COALESCE(a , 8) FROM sample37;

 

(a가 NULL이 아니면 a값을 그대로 출력, 그렇지 않으면 (a가 NULL이면) 0을 출력)


- COALESCE 함수는 여러 개의 인수를 지정할 수 있음

- 주어진 인수 가운데 NULL이 아닌 값에 대해서 가장 먼저 지정된 인수의 값을 반환

 

 

2. 또하나의 CASE ANS

- 숫자로 이루어진 코드를 알아보기 더 쉽게 문자열로 변환하고 싶은 경우 CASE문을 많이 사용

- 코드(=수치데이터터)를 정보인 문자화하는 것을 ‘디코드’라 부르고 반대로 수치화히는 것을 ‘인코드’라 부름.

디코드를 CASE 문으로 처리가능

 

- CASE 문은 '검색 CASE'와 '단순 CASE'의 두 개 구문으로 나눌 수 있음.

- 검색 CASE ‘CASE WHEN 조건식 THEN 식 ... ’ 구문

- 단순 CASE는 ‘CASE 식 WHEN 식 THEN 식 ... ’ 구문  (CASE 뒤에 식을 기술하고 WHEN 뒤에 (조건식이 아닌) 식을 기술)

식 1 의 값이 WHEN의 식 2의 값과 동일한지 비교하고, 값이 같다면 식3의 값이 CASE 문 전체의 결괏값이 됨. 값이 같지 않으면 그 뒤에 기술한 WHEN 절과 비교하는 식으로 진행. 즉,식1의 값과 식 4의 값이 같은지를 비교하고 같다면 식 5의 값이 CASE 문의 결광값이 됨. 비교 결과 일치하는 WHEN 절이 하나도 없는 경우에는 ELSE 절이 적용.
검색 CASE와 단순 CASE (차이점 확인)

 

3. CASE를 사용할 경우 주의사항

- ELSE 생략하면 ELSE NULL이 되는 것에 주의

- 대응하는 WHEN이 하나도 없으면 ELSE 절이 사용 (이때 ELSE를 생략하면 상정한 것 이외의 데이터가 왔을 때 NULL이 반환/ 따라서 ELSE를 생략하지 않고 지정하는 편이 나음)

 

- WHEN에서 NULL 지정하기

- 데이터가 NULL인 경우를 고려해 WHEN NULL THEN '데이터 없음'과 같이 지정해도 문법적으로 문제가 없지만 정상적으로 처리되지 않음

다음과같은순서로조건식을처리 1. a = 1 2. a=2 3.a=NULL

 

- 비교 연산자 =로는 NULL 값이 같은지 아닌지 비교할 수 없음.

- 따라서 a열의 값이 NULL이라 해도 a=NULL은 참이 되지 않음.

; '데이터 없음' 대신 '미지정'이라는 결괏값이 나옴. (단순 CASE 문으로는 NULL을 비교할 수 없다는문제점이 있음)

 

- NULL 값인지 아닌지를 판정하기 위해서는 IS NULL을 사용.

> 검색 CASE 문을 사용. (단순 CASE 문은 특성상 = 연산자로 비교히는 만큼 NULL 값인지를 판정해야 하기 때문)

; 단순 CASE 문으로는 NULL 값을 비교할 수 없다!

 

- DECODE NVL
- DECODE 함수는 CASE 문과 같은 용도로 사용할 수 있음.

알아두면 좋은 내용
알아두면 좋은 내용_2