-
SQL 첫걸음 CH03. 정렬과 연산Sql 2023. 3. 14. 10:43
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 값이 나온다.
'Sql' 카테고리의 다른 글
SQL 첫걸음 CH05. 집계와 서브쿼리 (0) 2023.03.15 SQL 첫걸음 CH04. 데이터의 추가, 삭제, 갱신 (0) 2023.03.15 SQL 첫걸음 ch02. 테이블에서 데이터 검색 (2) 2023.03.13 SQL 첫걸음 CH06. 데이터베이스 객체 작성과 삭제 (0) 2023.03.09 SQL 첫걸음 CH01 데이터베이스 소개 (0) 2023.03.09