Sql

SQL 첫걸음 CH03. 정렬과 연산

hojomu 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 문법 작성 순서

  1. SELECT 열명
  2. FROM 테이블명
  3. WHERE 조건식
  4. GROUP BY 그룹화할 열명
  5. HAVING 그룹하고 난 후의 조건식
  6. ORDER BY 정렬하고자 하는 열명

** SELECT SQL 쿼리 실행 순서 (DBMS 내부 처리)

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. 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 값이 나온다.