SQL 첫걸음 CH03. 정렬과 연산
1 _ 정렬 ORDER BY
어떤 조건으로 열들을 정렬 할지 정할 수 있다.
SELECT 열명 FROM 테이블명 WHRER 조건식 ORDER BY 열명 (DESC or ASC)
DESC : 내림차순
ASC : 오름차순
- 내림인지 오름인지 정하지 않았다면 기본적으로 오름차순으로 지정된다 ( 작은 수가 위에 )
숫자형 자료의 경우 오름, 내림차순은 숫자를 기준으로 한다.
년도 : 1000년 < 2000년 시간이 흐를수록 커진다
문자열 : 문자열들은 사전식 순서에 의해 결정된다.
-> 문자열 자료 칸에 숫자가 입력된 경우 이는 숫자가 아니라 문자이므로 오름차순 했을 때 다음과 같은 결과가 나온다
- a열의 경우 문자열이기 때문에 숫자를 넣어도 사전식 순서에 따라 10 , 11 보다 2가 더 크다.
2 _ 복수열을 지정해 정렬하기'
- ORDER BY 이후에 열명을 여러개 적는다
SELECT 열명 FROM 테이블명 WHRER 조건식 ORDER BY 열명1 [ASC | DEC], 열명2 [ASC | DEC]
- 이 때 order by 이후에 오는 열의 순서에 따라 정렬의 기준이 달라진다.
먼저 정렬한 열이 정렬이 끝나면 그 다음 열의 정렬을 시작하는 방식이다.
3 _ 결과 행 제한하기 LIMIT
1) LIMIT
LIMIT 구
SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]
SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수
** LIMIT은 표준 SQL이 아니다. MySQL과 PostgreSQL에서 사용할 수 있는 문법이다.
2) OFFSET
: Pagination 을 만들 떄 처럼 많은 데이터들을 필요한 만큼 끊어서 나열하는데 필요하다.
OFFSET 지정
SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치
- OFFSET을 3 줬기 때문에 no가 4부터 시작한다.
만약 OFFSET이 0이라면, OFFSET을 주지 않은 것이므로 no가 1 부터 시작한다.
4 _ 수치연산
: 일반적인 수학 연산과 같다. * / % 를 우선순위로 계산하고, + - 를 후순위로 계산한다.
1) SELECT 구로 연산하기
SELECT 식1, 식2, ... FROM 테이블명
- price * quantity 는 별명을 붙일 수도 있다.
** 별명을 붙일 때 As가 필수는 아니다
price * quantity amount 로 써도 같은 결과가 나올 것이다.
다만 별명을 한글로 지정할 때는 꼭 " " 을 쓰도록 하자.
*** mySql에서 더블쿼트 " " 로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주한다
한편, 싱글쿼트 ' ' 로 둘러싸면 만자열 상수로 취급한다.
더블쿼트로 둘러싼다면 SELECT같이 명령어일지라도 객체로서 사용할 수 있다.
2) WHERE 구로 연산하기
- 이 때, where amount >= 2000; 으로하면 인식을 못 하므로 주의하자.
기본적으로 데이터 베이스는 SELECT문 보다 WHERE 문이 먼저 실행된다.
때문에, WHERE문을 실행했을 때 price * quantity는 amount로 별명이 붙여지지 않은 상태다.
** SQL에서 NULL에는 어떤 연산을 해줘도 NULL로 유지된다 ( NULL 은 0으로 취급되지 않는다 )
3) ORDER BY 구에서 연산하기
- ORDER BY 구에서는 별명을 사용할 수 있다.
서버의 내부 처리 순서는 다음과 같다
WHERE 구 -> SELECT 구 -> ORDER BY 구
** SELECT SQL 문법 작성 순서
- SELECT 열명
- FROM 테이블명
- WHERE 조건식
- GROUP BY 그룹화할 열명
- HAVING 그룹하고 난 후의 조건식
- ORDER BY 정렬하고자 하는 열명
** SELECT SQL 쿼리 실행 순서 (DBMS 내부 처리)
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
4) 함수
함수명 (인수1, 인수2, ...)
- ROUND 함수
: 소수점을 반올림 해주는 함수
ROUND(반올림할값 , 반올림할 소수점 자리수)
ex) SELECT amount, ROUND(amount,1) FROM sample341;
-> amount 열의 값을 소수점 2째 자리에서 반올림
** 소수점 첫 째 자리 : 0, 소수점 둘 째 자리 : 1
round(amount, -2) : 10의자리에서 반올림
5) 문자열 연산
+ || CONCAT SUBSTRING TRIM CHARACTER_LENGTH
문자열 결합 연산자
+ -> SQL server
|| -> Oracle, DB2, PostgreSQL
CONCAT -> MySQL
CONCAT 함수
: 2개의 열을 합쳐서 1개로 만든다 이 때 결과물은 문자열로 저장된다.
- 문자열 결합 예제 ( CONCAT )
- concat을 이용해서 quantity와 unit을 결합했다.
SUBTRING 함수
: 문자열의 일부분을 계산해서 반환해준다. ( 날짜 데이터에서 필요한 부분만 빼오는데 사용할 수도 있다)
SUBSTRING( '문자열' , 시작숫자선택, 글자수 선택)
ex) SUBSTRING('20230314' , 5, 2 ) -> '03' ( 날짜 중 월을 가져왔다 )
- 문자열 결합 예제 ( SUBSTRING )
TRIM 함수
: 문자열의 앞 뒤에 존재하는 스페이스를 제거해준다
ex) TRIM('abc ') -> 'abc'
CHARACTER_LENGTH 함수
: 문자열의 길이를 출력한다.
- CHARACTER_LENGTH() 예제
6) 날짜 연산
날짜를 확인하는 함수 current_date , current_timestamp , current_time
테이블을 생성할 때는 다음과 같이 쓴다
create table a{
d date,
t time,
dt datetime
}
날짜를 조절해서 출력할 수 있는 date_format( 날짜열 , "%y/%m/%d")
- 날짜의 덧셈과 뺄셈
: 날짜형 데이터는 기간형 수치데이터와 덧셈 및 뺄셈을 할 수 있다.
ex) 특정 일로부터 1일 후를 계산하고싶다면, a + 1 DAY
1일 전이라면, a - 1 DAY
- select current_date + inerval 1 day 로도 사용한다.
날짜형 데이터 간의 뺄셈
: 덧셈도 가능하지만 자주 사용되지 않기 때문에 큰 의미가 없다.
두 날짜 사이에 차이가 얼마나 발생하는지 계산할 수 있다.
Oracle
'2023-01-01' - '2023-02-03'
MySQL
DATEDIFF('2023-01-01', '2023-02-03')
7) CASE 문으로 데이터 변환하기
: 회원가입 기능을 만들 때 라디오기능으로부터 값을 받아올 수 있다. 이 때 숫자값을 받아왔다면
이를 유의미한 데이터로 변환해야한다.
CASE문
CASE WHEN 조건식1 THEN 식1
[ WHEN 조건식2 THEN 식2 ...]
[ELSE 식3]
END
- CASE 문 예제 ( 성별 )
- else를 생략할 경우 null로 들어가기 때문에 가급적 else를 생략하지 말자.
다음과 같이 a를 case 옆에 먼저 선언하고 조건문을 작성해도 문제가 없다.
** NULL 값의 경우
null + 값을 입력하면 null이 나온다. 이를 해결하기 위해선
- ifnull( NULL이 있는 열, 널을 변환하고 싶은 값 ) 함수를 이용하면 null의 값을 지정해서 계산할 수 있다.
sal+comm 의 결과로 null이 나오고, sal+ifnull(comm,0)의 결과로 sal + 0 값이 나온다.