예약어란 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 THEN 식1
[WHEN 조건식2 THEN 식2 ...]
[ELSE 식3]
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 |