본문 바로가기
SQL

데이터 검색 / 정렬 / 연산

by csue 2021. 4. 27.

예약어란 select, from 과 같이 특정 용도로 사용되도록 예약되어있는 단어를 의미한다.

테이블을 포함하여 데이터를 저장하거나 관리하는 것들을 데이터베이스 객체라고 한다. 통상적으로 데이터베이스 객체명에는 예약어와 동일한 이름을 사용할 수 없다.

예약어와 데이터베이스 객체명은 대소문자를 구별하지 않는다.

desc

describe. 테이블의 구조를 확인할 수 있다.

 

자료형

  • integer : 정수형. 소수 X
  • char : 문자열을 저장할 수 있는 자료형. 최대 길이를 지정해야 하며, 최대 길이를 초과한 문자열은 저장할 수 없다. 언제나 고정된 길이로 데이터가 저장되는 '고정 길이 문자열' 자료형이다. 최대 길이보다 작은 문자열을 저장할 경우 공백 문자로 나머지를 채운 후 저장하게 된다.
  • varchar : char 과 마찬가지로 문자열을 저장할 수 있는 자료형이다. 최대 길이를 지정해야 하는 점 역시 같으나, char 형과는 달리 데이터 크기에 맞춰 저장 공간의 크기가 변경되는 '가변 길이 문자열' 자료형이다.
  • date : 날짜
  • time : 시간

SELECT

SELECT * FROM users;

참고로 예시로 쓰일 users 테이블은 아래와 같은 값을 갖고 있다.

 

와일드카드

컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다.

* = 애스터리스크. 모든 열을 의미한다.
% = 임의의 문자열
_ = 임의의 문자열 하나

연산자

  • <> 연산자
    좌변과 우변의 값이 서로 다른 경우 참이 된다.
    SELECT * FROM users WHERE age <> 24

      
    age 가 24 인 열을 제외한 나머지 열들이 출력된다.
  • IS NULL
    연산자로 NULL 을 검색할 때에는 = NULL 이 아닌 IS NULL 을 사용한다.

AND 와 OR

AND 는 OR 에 비해 우선순위가 높으므로 괄호를 붙여 조건이 잘못 지정되는것을 막아주어야 한다.

 

 

위의 경우 AND 가 우선순위가 높게 책정되었으므로, 'age 가 17이 아니고 city 가 서울인 것' + 'age 가 24가 아닌 것' 의 합집합이 출력되었다.
그러나 괄호를 쳐주자, OR 이 우선적으로 검색되어 'age 가 17, 24 가 아닌 것' 중에서 'city 가 서울인 것' 이 출력된 것을 확인할 수 있다.

LIKE

LIKE 는 문자열의 일부분을 검색할 때 사용한다. 패턴 매칭이라고도 하며, 보통

LIKE 패턴

의 형식으로 사용된다.

name 에서 a 로 시작하는 열을 검색한다.

 

 

name 에서 a 가 포함되어있는 열을 검색한다.

 

ORDER BY

ORDER BY 구를 사용하여 정렬을 통해 검색결과의 행 순서를 바꿀 수 있다.

DESC

내림차순으로 정렬한다.
(헷갈릴때는 🔽 모양이라고 생각하면 된다 😅)

ASC

오름차순으로 정렬한다.

 

 

수치형과 문자열형 데이터는 대소관계의 계산방법이 다르다.
수치형은 기본적으로 오름차순으로 정렬된다. 문자열형은 기본적으로 사전순으로 정렬된다.

 

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

, 를 이용하여 순서를 지정할 수 있다.

 

 

ASC, DESC 를 사용할수도 있다.
MySQL 에서는 NULL 값을 가장 작은 값으로 취급해서 오름차순에서는 가장 먼저 출력된다.

 

LIMIT

LIMIT 는 표준 SQL 은 아니고 MySQL 에서 사용할 수 있는 문법으로, 결과값으로 반환되는 행을 제한한다. (oracle 에는 ROWNUM 이라는 유사한 query 문이 있다)

OFFSET

페이지 단위로 표시할 때 몇 번째 행부터 표시할 지 설정해준다. list 의 순서처럼 첫번째가 0으로 시작하므로, 반환하고 싶은 행 -1 의 값을 지정해주어야 한다.

반환되는 행을 3개로 제한하고, 1~3 / 4~6의 순서로 출력되도록 만들어보자.

 

수치 연산

연산자 연산 예시
+ 덧셈(가산) 1+2 = 3
- 뺄셈(감산) 1-2 = -1
* 곱셈(승산) 1*2 = 2
/ 나눗셈(제산) 1/2 = 0.5
% 혹은 MOD 나머지 1%2 = 1

 

연산의 우선순위는 일반 연산과 같다.
나머지는 곱셈/나눗셈과 궤를 같이 한다.

NULL 을 이용한 연산의 결과는 전부 NULL 이다.

연산 예시를 위해 nums 이라는 이름의 테이블을 생성하였다.
구조는 아래와 같다.

 

SELECT 의 연산

열의 별명 alias

AS 를 이용하여 생성된 열에 별명을 붙여줄 수 있다. AS 는 생략 가능하다.

 

 

한글로 이름을 붙여주고 싶을때는 더블쿼트를 사용해야 한다. 더블쿼트로 둘러싸면 예약어와 같은 이름의 열도 생성할 수 있다.

WHERE 의 연산

WHERE 구는 SELECT 구보다 우선순위가 높으므로, WHERE 구에서는 SELECT 구에서 지정한 열의 별명을 사용할 수 없다.

 

ORDER BY 의 연산

ORDER BY 구는 SELECT 구보다 우선순위가 후순위이므로, SELECT 구에서 지정한 열의 별명을 사용할 수 있다.

// 연산의 우선 순위
WHERE => SELECT => ORDER BY

SELECT 구에서 별명을 지정해주고 해당 별명의 열을 내림차순으로 정렬해보자.

 

ROUND 함수

연산자 외에 함수를 사용하여 연산할 수도 있다.
ROUND 함수는 기본적으로 소수점 첫째 자리를(=0) 기준으로 반올림한 값을 반환한다.

ROUND(table명, 1) // 소수점 둘째 자리
ROUND(table명, -1) // 1의 자리

문자열 연산

문자열을 결합하는 연산자는 데이터베이스마다 차이가 있으나, 보통 CONCAT 또는 || 연산자를 사용한다. (SQL server 에서는 + 연산자를 사용하기도 한다)

 

 

NULL 의 연산의 결과는 항상 NULL 이기 때문에 마지막 행의 결과값이 NULL 이 되어있다.

문자열로 결합한 결과는 항상 문자열이 된다. 수치 데이터를 문자열로 결합하여도 결과는 문자열이 된다.

SUBSTRING 함수

문자열의 일부분을 계산하여 반환해주는 함수이다.
user 테이블의 name 을 첫 번째부터 두 글자만 따서 반환하게 만들어보았다.

 

TRIM 함수

char 형의 문자열은 최대 길이가 고정되어 있으며, 최대길이보다 짧은 경우 스페이스로 채워진다고 언급한 바 있다. TRIM 함수는 이 스페이스를 제거한다. 문자열 도중에 있는 스페이스는 제거되지 않는다.

CASE 문으로 데이터 변환하기

CASE WHEN 조건식1 THEN1
    [WHEN 조건식2 THEN2 ...]
    [ELSE3]
END

 

 

ELSE 를 생략할 경우 아래처럼 ELSE NULL 로 처리된다.

 

 

CASE 문을 사용하면 디코드(문자화 하는 것) 와 인코드(수치화 하는 것) 도 쉽다. a열에 0 과 1 로 나뉘어진 table 이 있다면 아래와 같은 방식으로 True False 로 바꿀수 있다.

WHEN a = 0 THEN 'False'
WHEN a = 1 THEN 'True'

'SQL' 카테고리의 다른 글

db index & view  (0) 2021.04.27
데이터베이스 객체의 생성과 삭제  (0) 2021.04.27
집계와 서브쿼리  (0) 2021.04.27
데이터 추가 / 삭제 / 갱신  (0) 2021.04.27
DBMS  (0) 2021.04.27