4. [SQL기초] 데이터베이스의 데이터 가져오기

테이블의 데이터 가져오기

가장 간단한 쿼리문으로 테이블에서 데이터를 가져오는 연습을 해보겠습니다. 첫 쿼리문입니다.

기본 구문

Select * from 테이블이름;

첫 쿼리문을 작성해서 테이블에서 데이터를 가져오려면 커맨드라인 인터페이스, 또는 워크벤치에서 쿼리문을 입력한 후 실행을 해야 합니다.

커맨드라인 인터페이스 사용

콘솔 창, 또는 도스 창을 연 후 “mysql”을 입력하면 MySQL 커맨드라인 인터페이스가 실행되고 입력 커서가 “mysql> ”로 변경됩니다. 미리 만들어 두었던 예제 데이터베이스인 “shop” 데이터베이스의 회원 정보 테이블에서 회원 목록을 열람하는 쿼리문을 실행해보겠습니다. 커맨드라인 다음과 같이 입력합니다.

mysql> select * from member;

쿼리문 끝에는 항상 세미콜론을 붙여 쿼리문이 끝났음을 표시해야 합니다. 입력 완료 후 엔터 키를 누르면 쿼리문이 실행되고, 회원정보 목록이 콘솔 화면에 표시됩니다.

회원정보 테이블이 표시되지 않고 “ERROR 1046 (3D000): No database selected” 메시지가 표시되면 다음 쿼리문을 실행해서 사용할 예제 데이터베이스를 먼저 선택한 후 쿼리문을 실행해야 합니다.

mysql> use shop;

MySQL 워크벤치 사용

워크벤치를 실행한 후 데이터베이스에 접속하면 쿼리문을 입력하는 에디터가 오른쪽에 위치합니다.

쿼리문을 입력한 후 Ctrl+Enter 키를 누르면 현재 커서가 위치한 행의 쿼리문이 실행됩니다.


쿼리문을 입력하는 방법

각 키워드와 테이블 이름, 그리고 대상 컬럼 사이에는 공백으로 구분을 합니다. 공백은 여러 개여도 됩니다.

그리고, 앞서 설명한대로 쿼리문 끝에는 항상 세미콜론을 붙여서 쿼리문 끝임으로 표시합니다. 세미콜론으로 쿼리문을 끝내지 않고 엔터 키를 누르면 쿼리문이 실행되는 것이 아니라 추가 입력을 받기 위해 다음행에 커서가 표시됩니다. 세미콜론(;)을 입력한 후 엔터 키를 눌러야 비로소 쿼리문 끝임을 알게 되고, 쿼리문을 실행합니다.

쿼리문을 입력하다 오타가 발생하면 백스페이스키를 눌러 한 글자씩 삭제할 수 있습니다.

쿼리문의 “*”는 특별한 컬럼 선택 표시로, 데이터를 가져올 테이블의 모든 컬럼을 선택하다는 약속된 키워드입니다. 영어로는 애스터리스크, 한글로는 별표(또는 특정 회사의 마크와 같아서 백설표라고도 합니다.)입니다.

“select”는 데이터를 가져오는 명령어입니다. 그리고 “from”은 데이터를 가져올 대상 테이블을 지정하는 예약된 명령어입니다. 쿼리문을 문장으로 해석하면 다음과 같이 됩니다.

“member” 테이블로부터(from) 모든 컬럼(*)의 데이터를 가져온다(select)

그리고 이 명령어 키워드로 구분한 영역들을 “절”이라고 부릅니다. “select” 절, “from” 절이라고 각 영역을 구분해서 부릅니다. 데이터를 가져오는 “select” 쿼리문은 “select”, “from” 절 외에 여러 개의 추가적인 절이 올 수 있습니다. 어떤 절이 오는지는 뒤에서 하나씩 배우게 됩니다.


원하는 열의 데이터만 가져오기

회원정보 테이블의 모든 컬럼을 가져오면 커맨드라인 콘솔에는 아스키 문자로 테이블처럼 선을 그어서 모양을 만든 결과가 표시됩니다. 테이블 맨 위 첫 줄에 구분되어 보이는 것은 컬럼 이름입니다. 컬럼 이름을 알았으므로, 원하는 컬럼만 표시를 해서 데이터를 가져와 봅니다.

mysql> select id, name, nickname from member;

id, name, nickname 컬럼 3개만 회원정보 테이블에서 가져와서 표시를 합니다. 예제 테이블의 컬럼 이름은 대문자인데 쿼리문에서는 컬럼 이름을 모두 소문자로 입력했습니다. 눈치챘는지 모르겠지만, 쿼리문의 모든 예약어와 객체 이름에서 대소문자를 구분하지 않습니다. 테이블 이름, 열 이름 등 모든 데이터베이스 객체 이름은 대소문자 구분이 없습니다.

편의상, 또는 쿼리문 커맨드 키워드와 열 이름을 잘 구분하기 위해 커맨드 키워드는 대문자로, 열 이름은 소문자로 구분해서 사용하기도 합니다.

다음의 쿼리문은 모두 같은 쿼리문입니다.

Select * from member;
SELECT * FROM member;
select * from MEMBER;

쿼리 결과를 보는 방법

모든 쿼리문의 실행 결과는 1개의 테이블로 표시됩니다. 예외적으로 결과 값 1개만 반환되는 쿼리문의 경우, 1행 1열의 테이블로 표현됩니다.

쿼리 결과의 첫 줄은 항상 컬럼 이름이 표시됩니다. 그리고 그 밑 행에서부터 실제 결과 데이터가 컬럼별로 구분되어 표시됩니다.

결과 행의 컬럼 1개는 “셀” 이라고 하며, 값 1개를 담고 있습니다.

엑셀의 구조와 동일하다고 이해하면 됩니다.

관계형 데이터베이스의 모든 컬럼은 데이터 형을 지정하기 때문에 쿼리문의 실행 결과로 반환된 결과 테이블의 각 컬럼 값도 해당 데이터 형을 가지게 됩니다. 대표적으로 숫자형, 문자열형, 날짜형으로 크게 나누어집니다.

하나의 컬럼은 1가지 데이터 형만을 가지며, 쿼리문 결과도 동일합니다. 단, 예외적으로 널(NULL) 값이 있을 수 있습니다. 널에 대해서는 뒤에서 조금 더 자세히 배우게 됩니다. 일단은 컬럼에 아무 것도 입력되지 않는 빈 상태라고 생각하면 됩니다.


테이블 구조 알기

데이터를 가져온 테이블이 어떤 컬럼들을 가지고 있고, 어떤 데이터 형인지 알아야 원하는 컬럼 데이터를 가져올 수 있습니다.

테이블 구조를 출력하는 쿼리문은 데이터베이스마다 모두 다릅니다. 테이블 정의를 저장하는 위치나 방식이 데이터베이스마다 다르기 때문에, 데이터베이스에 맞는 쿼리문을 사용해야 합니다.

MySQL은 다음과 같은 쿼리문을 실행합니다.

mysql> desc member;

이 쿼리문은 예제 데이터베이스의 회원정보 테이블 정의 정보를 테이블 모양으로 출력해줍니다.

SQL Server 에서는 다음과 같이 사전 정의된 스토어드 프로시저 명령어로 확인할 수 있습니다.

sp_help member;

오라클에서는 다음과 같이 내장 커맨드를 사용해 테이블 정의 정보를 확인할 수 있습니다.

describe member;

스토어드 프로시저에 대해서는 뒤에서 배웁니다. 여기서는 DBMS가 제공하는 내장 명령어 정도로 생각하고 넘어갑니다.

테이블 정의 정보에는 컬럼이름, 데이터 형, 널 허용여부, 기본값 등에 대한 설정 정보가 표시됩니다. 아직은 데이터를 가져오는 단계지만, 뒤에서 테이블의 컬럼 정의 속성을 변경하는 방법을 배우게 됩니다.

MySQL의 회원정보 테이블 정의 정보가 표시하는 내용은 다음과 같습니다.

컬럼 용도 설명
Field 컬럼이름 문자열로 시작하며, 문자열과 숫자 조합
Type 데이터 형 int, bigint, integer, varchar, date, time, datetime 등
Null 널 허용 YES, NO
Key 기본키, 외래키 표시 PRI, MUL
Default 기본값 데이터 형

기초 자료형 알기

자료형은 데이터베이스에 따라 조금씩 다를 수 있습니다. 표준 SQL과는 별도로 데이터베이스 특성에 맞게 사용하는 전용 자료형이 있으므로 MySQL 이 아닌 다른 데이터베이스를 사용할 때는 개별적으로 다른 데이터 형이 어떤 것이 있는지 확인해야 합니다.

가장 기본인 데이터 형은 다음 5가지가 있습니다.

integer

id int not null

정수 값을 저장하는 자료형입니다. 최대 19비트 길이 정수를 저장할 수 있습니다. 정수 데이터 형이므로 소수점이 있는 데이터는 저장할 수 없습니다. 줄여서 int로 데이터 형을 사용할 수 있습니다. “int”, “bigint”와 같이 정수 길이에 따라 구분해서 선언할 수도 있습니다. “bigint” 정수형은 최대 8바이트 길이의 정수를 저장할 수 있습니다. Int와 integer는 같으며 최대 4바이트 길이의 정수를 저장합니다.

정수타입 길이(byte) 부호 있는 최소값 부호 없는 최소값 부호 있는 최대값 부호 없는 최대값
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

정수형의 최소, 최대 값은 다음과 같습니다. 자주 사용하게 되고, 범위를 알아 둘 필요가 있습니다.

char

char(1000)

문자열을 저장하는 자료형입니다. 가장 기본적인 자료형이며, 데이터 형을 정의할 때 최대 길이를 반드시 정해서 선언해야 합니다. 최대 길이보다 작은 문자열만 저장할 수 있습니다. 문자열을 저장할 때 선언한 길이만큼 무조건 저장 공간을 할당하기 때문에 짧은 문자열을 저장하면 남은 길이만큼 뒷부분을 공백으로 채웁니다. 특별한 경우가 아니면 데이터베이스 저장 공간을 절약할 수 있는 varchar형 문자열을 사용하는 것을 추천합니다.

varchar

varchar(20)

문자열을 저장하는 자료형입니다. 숫자를 저장해도 문자열 타입인 숫자로 저장됩니다. 최대 길이를 지정해 문자열 최대 길이를 제한하지만, 가변형 문자열 데이터 형이기 때문이 최대 길이보다 짧은 문자열을 저장하면 실제 차지하는 저장 공간도 줄어듭니다. varchar는 가변형 문자열(Variable Character)를 줄여서 표기하는 것입니다.

datetime

orderdate datetime default now()

년-월-일 시:분:초를 표시하는 자료형입니다. 년-월-일 데이터만 저장하는 date 데이터 형과 시:분:초 데이터를 표시하는 time 데이터 형도 있습니다.

decimal

decimal(5,2)

고정 소수점 자료형입니다. 길이와 소수점 자리 수 길이로 구분해서 정의하며, 소수점 숫자 표기에 사용하는 기본 자료형입니다.

그 밖에도 여러가지 자료형이 추가로 있으며, 데이터베이스 별로 고유한 자료형도 있습니다.


주석문 사용

주석문은 쿼리문을 파일로 따로 보관할 때 쿼리문에 대한 설명이나 기록을 남기기 위해 사용합니다. 커맨드라인 인터페이스로 쿼리문을 하나씩 작성할 때는 쓸 일이 없지만, 워크벤치로 여러 개의 쿼리문을 작성하거나, 쿼리문들을 파일로 따로 보관했다 나중에 사용하려고 할 때 기록을 남겨 둘 필요가 있습니다.

주석은 2가지 타입이 있습니다.

-- 한 줄 주석 내용 입력
/* 여기에 주석 내용 입력 */
/* --------------
여러 줄
주석 내용 입력 */

주석 내용 길이에 따라 적당히 맞는 것을 사용하면 됩니다. 워크벤치에서 여러 개의 쿼리문을 한꺼번에 실행할 때 주석문이 있는 행은 실행되지 않고 건너뜁니다.


연산자 기초

쿼리문에서 사용하는 연산자는 크게 3가지로 나누어집니다. 거짓과 참을 판단하는 논리연산자, 큰지 작은지, 또는 같은지를 판단하는 비교 연산자, 숫자, 또는 문자열 등을 연산해서 계산 결과를 만드는 산술 연산자가 있습니다.

연산자는 데이터베이스에 따라서 지원 여부가 조금씩 다릅니다. 대표적으로 사용되는 연산자를 중심으로 확인해보겠습니다.

논리연산자

조건이 참인지 여부를 판단합니다. 조건이 참이면 TRUE, 거짓이면 FALSE를 반환합니다.

연산자 설명
ALL 비교 대상 집합이 모두 참이면 TRUE, 하나라도 거짓이면 FALSE 반환
AND 두 개의 비교 대상이 모두 참이면 TRUE, 하나라도 거짓이면 FALSE 반환
ANY 비교 대상 집합 중 하나라도 참이면 TRUE, 모두 거짓이면 FALSE 반환
BETWEEN 피연산자가 범위 안에 있는 경우 TRUE, 아니면 FALSE 반환
EXISTS 피연산자와 일치하는 값이 목록에 1개라도 있으면 TRUE, 없으면 FALSE 반환
IN 피연산자가 결과 목록 중 하나와 같으면 TRUE, 일치하는 것이 없으면 FALSE 반환
LIKE 피연산자가 결과 목록 중 일치하는 패턴이 있으면 TRUE, 없으면 FALSE 반환
NOT 결과의 반대 불리언 값을 반환. TRUE면 FALSE, FALSE면 TRUE로 반환
OR 두 개의 비교 대상 중 하나라도 참이면 TRUE, 둘 다 거짓이면 FALSE 반환
SOME 비교 대상 집합 중 일부가 참이면 TRUE, 없으면 FALSE 반환

논리연산자 중 IS는 다른 NULL, UNKNOWN과 비교 대상을 비교해 참인지 거짓인지를 판단하는 예외적인 연산자입니다. IS NULL, IS NOT NULL 과 같은 형식으로 비교 대상 값의 널 여부를 판단해 TRUE, FALSE를 반환합니다.

비교연산자

비교하는 대상 2개 중 어느 한쪽이 크거나, 작거나, 같거나, 또는 같지 않은지를 비교하는 연산자입니다. 데이터베이스에 따라 “!<”, “!>”와 같은 고급 비교연산자를 지원하기도 합니다. 2개 이상의 기호로 표시하는 연산자는 공백 없이 붙여서 사용합니다.

연산자 설명
= 같은지 비교.
~보다 큼. 오른쪽 상수나 컬럼 값보다 왼쪽의 컬럼 값이 더 큰 경우
~보다 작음. 오른쪽 상수나 컬럼 값보다 왼쪽의 컬럼 값이 더 작은 경우
>= ~보다 크거나 같음. 비교 대상 상수나 컬럼의 값을 포함해 같거나 큰 경우.
<= ~보다 작거나 같음. 비교 대상 상수나 컬럼의 값을 포함해 작거나 같은 경우.
<>, != 같지 않음. 두가지 모두 사용 가능.
<=> 널을 포함해 같은지를 비교(MySQL 전용)

산술연산자

숫자를 연산하는 연산자입니다. 데이터베이스에 따라서 더하기(+) 연산자를 문자열을 합치는 연산자로 사용할 수도 있는 경우도 있습니다. 기본적으로는 숫자 연산에만 사용한다고 생각하면 됩니다.

연산자 설명
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 두 값을 나눈 나머지를 반환

연산자 우선순위 요약

연산자는 다음 순서대로 우선 순위를 가집니다. MySQL의 연산자를 기준으로 한 것으로, 일반 연산자를 제외한 함수형 연산자는 다른 데이터베이스에서는 다소 다를 수도 있습니다.

!

- (마이너스값), ~ (비트반전)

^

*, /, DIV, %, MOD

-, +

<<, >>

&

|

= (비교), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN, MEMBER OF

BETWEEN, CASE, WHEN, THEN, ELSE

NOT

AND, &&

XOR

OR, ||

=(대입), :=