KoreanFoodie's Study

SQL 첫걸음 - 3. 정렬과 연산 본문

Database

SQL 첫걸음 - 3. 정렬과 연산

GoldGiver 2021. 10. 7. 17:52

SQL 첫걸음이라는 책을 보고 SQL에 대한 기초적인 내용을 정리한 리마인더 글입니다.


3장 : 정렬과 연산

// ORDER BY로 검색 결과 정렬하기 -> 테이블에 영향을 주지 않는다 
SELECT * FROM sample31 ORDER BY age; 
// 기본은 오름차순 정렬 

SELECT * FROM sample31 ORDER BY age DESC; 
// 내림차순 SELECT * FROM sample31 ORDER BY age ASC; 
// 오름차순 
// 수치형과 문자열형 데이터는 대소관계의 계산 방법이 다름
// INTEGER : 1 < 2 < 10 < 11 ... 
// VARCHAR : 1 < 10 < 11 < 2 ... (한글자씩 비교하기 때문이다) 
// 복수의 열을 지정해 정렬

SELECT * FROM sample32 ORDER BY a, b; 
// 먼저 a열로 정렬 후 b열로 정렬 

SELECT * FROM sample32 ORDER BY a ASC, b DESC;
// 각각의 열에 대해 옵션을 줄 수 있음 
// NULL 값의 정렬순서 : MySQL의 경우는 NULL을 가장 작은 값으로 취급한다 (DB 제품마다 다름) 
// 결과 행 제한하기 - LIMIT (표준 SQL이 아님. MySQL, PostgreSQL에서 사용) 

SELECT * FROM sample33 ORDER BY no DESC LIMIT 3; 
// no열을 내림차순 정렬 후 상위 3개 행을 선택 
// 결과 행 제한하기 - <= (ORACLE) 

SELECT * FROM sample33 ORDER BY no DESC ROWNUM <= 3; 
// 위와 같은 결과 
// 오프셋 지정 
// 대량의 데이터를 페이지 나누기(pagination)기능을 사용해 나눈다. 

SELECT * FROM sample33 LIMIT 3 OFFSET 0; // 1-3 행을 1페이지로 (0 : 인덱스라고 생각) 

SELECT * FROM sample33 LIMIT 3 OFFSET 3; // 4행부터 3건의 데이터 표시 (3+1 = 4행)

 

수치 연산

// + - * / % MOD SELECT *, price * quantity FROM sample34; 
// price * quantity 값이 계산된 새로운 column이 추가되어 리턴된다 
// 예약어 / 별명 : 숫자로 시작하면 안된다! 

SELECT *, price * quantity AS amount FROM sample34; 
// 계산된 값의 column이 amount라는 이름으로 추가 

SELECT *, price * quantity "금액" FROM sample34; 
// "금액" 이라는 column이 붙어 나온다 
// WHERE 구에서 연산하기 

SELECT *, price * quantity AS amount FROM sample34 WHERE price * quantity >= 2000; 
// 잘 동작 

SELECT *, price * quantity AS amount FROM sample34 WHERE amount >= 2000; 
// 동작하지 않음 
// 내부처리 순서가 WHERE -> SELECT 로 가기 때문이다! (일반적으로) 
// 또한, 별명은 SELECT 구문을 내부처리할 때 붙여진다. 

// NULL 값 연산 : SQL에서, NULL + 1 = NULL 
// 2 * NULL = NULL 
// 1 / NULL = NULL 

// 금액의 별명을 사용해 내림차순으로 정렬 
SELECT *, price * quantity AS amount FROM sample34 ORDER BY amount DESC; 
// ORDER BY는 제일 나중에 실행된다! 
// 실행 순서 :WHERE -> SELECT(별명 지정) -> ORDER BY 

// ROUND 함수 
SELECT amount, ROUND(amount) FROM sample34; 

// 소수점 이하를 반올림 
SELECT amount, ROUND(amount, 1) FROM sample34; 

// 소수점 둘째 자리를 반올림 
SELECT amount, ROUND(amount, -2) FROM sample34; 
// 10의 자리를 반올림

 

문자열 연산

// +, ||, CONCAT 함수로 문자열을 결합할 수 있다. 
SELECT CONCAT(quantity, unit) FROM sample35; 

// 문자열 붙이기 
SUBSTRING('20140125001', 1, 4); 
// '2014' SUBSTRING('20140125001', 5, 2); 
// '01' TRIM('ABC '); 
// 'ABC' CHARACTER_LENGTH('ABC'); 
// 3 

// 시스템 날짜 확인하기 
SELECT CURRENT_TIMESTAMP; 

SELECT CURRENT_DATE + INTERVAL 1 DAY; 
// 시스템 날짜의 1일 후를 계산 

// 날짜간의 차이 : '2014-01-01' - '2010-01-01' 
// ORACLE에서... 

// CASE문으로 데이터 변환하기 
// CASE로 조건을 줘서 케이스를 나눈다 (WHEN - ELSE) ELSE가 필수는 아님 
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample37; 

// COALIESCE 함수는 여러 개의 인수를 지정하여 주어진 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환한다. 
SELECT A, COALESCE(a, 0) FROM sample37; 

// 성별 코드 변환하기 (검색 CASE) 
SELECT a AS "코드", CASE WHEN a = 1 THEN '남자' WHEN a = 2 THEN '여자' ELSE '미지정' END AS "성별" FROM sample37;
// ELSE를 생략하면 ELSE NULL이 된다!
Comments