BackEnd

SQL 데이터베이스에 대해 제대로 알자(1) - 데이터베이스란?

Taemin Kim 2023. 3. 8. 14:06

이번에 공부를 하면서 기본적인 SQL DB쪽 지식이 정말 많이 부족하다는 것을 알게되었고

경각심을 가지게 되어서 기초를 탄탄이 하기 위해서 처음부터 제대로 공부해보려고 한다.

이것도몰라? 이걸 왜적어? 라고 생각 할 수있는 내용이 나오더라도 아시는분들은 스킵해주시고

"기본기 공부를 한번 해야겠다" 싶은 분들만 보시면 될 것 같다.

원래는 노션에 정리하려고했으나 아무래도 기술블로그를 나름대로(?) 작성하고있으니 기왕하는거 여기에 포스팅을 해보려고한다.


그럼 정리를 시작해보자!

 


<데이터베이스>

 

데이터베이스란?

넓은 의미에서는 컴퓨터 안에 기록된 모든 것이라고 할 수 있다.

특정 데이터를 확인하고 싶을 때 간단하게 찾아낼 수 있도록 정리된 형태를 말한다.

데이터베이스 내의 데이터는 영구적으로 보존되어야한다.

주기억장치에만 데이터를 저장한다면, 전원을 끄는 순간 모든 데이터는 사라져 버린다.

이러한 상태에서는 영구적이라고 말할 수 없다.

따라서 데이터베이스의 데이터는 하드디스크나 플래시메모리(SSD)등 비휘발성 저장장치에 저장한다.

시스템 내의 데이터베이스란?

현재에 이르기 전 기존방식은 데이터센터가 따로 있고 모든 데이터는 그곳을 통해서 운용이 되었다.

하지만 현재에는 개인 기기에도 데이터베이스가 각각 내장되어있기도 하다.

휴대폰 전화번호부를 열어서 번호를 저장하는 것 또한 휴대폰에 내장된 데이터베이스를 사용하는 것이고

마트나 카페에서 주문을 해서 물건을 바코드를 찍고 계산을 하게되면 계산대 시스템에 있는 데이터베이스로 전송이 된다.

하지만 내장방식이 아닌 다수의 사람이 이용하는 서비스를 예로들어보면

우리가 흔히 사용하는 웹사이트에서 책이나 옷을 주문하면 웹사이트에 연결된 데이터베이스로 접근하게 되는 경우가 많다.

DB와 DBMS란?

DB는 우리가 흔히사용하는 DataBase에서 앞자만 따와서 부르는 것을 말한다

데이터베이스는 저장장치에 정리되어 저장된 데이터의 집합이고,

이를 효율적으로 관리하는 소프트웨어를 “데이터베이스 관리 시스템(DataBase Management System)”,

약자로 DBMS라고 부른다. DBMS를 사용하는 이유는 크게 3가지로 분류할 수 있다.

 

  • 생산성

어떤 시스템을 개발하더라도 해당 시스템에서 데이터 검색, 추가, 삭제, 갱신과 같은 처리가 이루어지게 된다. 이와 같은 기본 기능을 DBMS가 기본적으로 제공한다. 시스템을 구축할 때 이러한 기본 기능부터 구현하면 비용측면에서 효율적이지 않기 때문에 기본적으로 제공되는 것을 활용해서 생산성을 높일 수 있게 되는 것이다.

  • 기능성

DBMS는 복수 유저의 요청에 대응하거나, 대용량 데이터를 저장하고 고속으로 검색하는 기능을 제공하기도 한다. 나아가 데이터베이스 관리 기능을 유저가 확장 할 수도 있어서 유연하게 시스템을 개발 할 수 있게 되는 것이다.

  • 신뢰성

대규모 데이터베이스는 많은 요청에 대응할 수 있도록 만들어져 있다. 이를 위해 하드웨어를 여러 대로 구성하여 신뢰성을 높이는 동시에 성능향상을 꾀하기도 한다. 실제로 일부 DBMS는 컴퓨터를 여러 대를 두고, 소프트웨어를 통해 확장성(Scalability)과 부하 분산(Load balancing)을 구현하기도 한다.

이를 보통 ‘클러스터 구성’ 또는 ‘스케일 아웃’이라고 부른다.

또한 대부분의 DBMS가 데이터베이스의 데이터를 다른 저장장치로 내보내는 export, 반대로 데이터베이스 안에 데이터를 집어넣는 import등의 기능을 갖추고 있다. 이때 집어넣고 또는 내보내기 기능을 통해 데이터베이스를 간단하게 백업할 수 있다.


<다양한 데이터베이스>


데이터베이스의 여러종류

데이터베이스의 사용 용도나 이를 제어하는 프로그래밍 환경 등 각각의 조건에 들어맞는  다양한 DBMS가 고안되었기 때문에 여러 종류가 존재한다.

데이터베이스 중에서도 SQL로 데이터를 다루는 데이터베이스를 관계형 데이터베이스(RDB : Relational Database)라고 한다.
관계형 데이터베이스는 현재 주류를 이룰 정도로 많은 시스템에 채택되었으며 제품도 여러가지가 있다.

  • 계층형 데이터베이스

역사가 오래된 DBMS로 폴더와 파일등의 계층 구조로 데이터를 저장하는 방식의 데이터베이스이다. 하드디스크나 DVD 파일 시스템을 이러한 계층형 데이터베이스라고 할 수 있다.

하지만 현재 DBMS로서 채택되는 경우는 많지 않다.

  • 관계형 데이터베이스

’관계 대수’ 라는 것에 착안하여 고안된 데이터베이스이다. 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스를 가리킨다. 가로방향을 “열”, 세로방향을 “행”으로 나열한다. 엑셀시트를 생각하면 쉽다. 관계형 데이터베이스에는 이런 표를 잔뜩 저장하고 각각의 표에 이름을 붙여 사용한다. 이때 저장된 데이터는 SQL 명령어로 조작할 수 있게된다.

  • 객체지향 데이터베이스

자바나 C++를 객체지향 언어라고하는데 쉽게말해 객체 중심으로 프로그램을 하는 언어이고 여기서는 가능하면 객체 그대로 데이터베이스에 저장하는 것이 객체지향 데이터베이스이다.

  • XML 데이터베이스

HTML처럼 <data> </data>와 같은 형식으로 표현한다. 이처럼 HTML과 흡사한 형식으로 기록된 데이터를 저장하는 데이터베이스이다. XML데이터베이스에서는 SQL명령을 사용할 수 없다. 대신 XML데이터를 검색 할 때는 XQuery라는 전용 명령어를 사용한다.

  • 키-밸류 스토어(KVS)

해시테이블에서 자주 보이는 키와 벨류의 조합을 뜻하는데 NoSQL (Not only SQL)이라는 슬로건으로 생겨난 데이터베이스로 열 지향 데이터베이스라고도 부른다.

key : 000 key : 000 key : 000

키 : 벨류 형태로 저장하는 방식


데이터베이스 제품

  • Oracle

오라클에서 개발한 RDBMS

  • DB2

IBM이 개발한 RDBMS으로 IBM컴퓨터내에서만 한동안 구동되어 뒤쳐짐

  • SQL Server

마이크로소프트가 개발한 RDBMS로 윈도우플랫폼에서만 동작함

  • PostgreSQL

오픈소스 커뮤니티가 개발한 RDBMS 무료로 사용가능

  • MySQL

오픈소스 커뮤니티가 개발했고 경량 데이터베이스로 최소한의 필요기능만 가지고있음 현재는 많은 기능의 확장이 이루어짐

  • SQLite

오픈소스 커뮤티니에서 개발되었고 임베디드 시스템에 자주쓰이는 작은 RDBMS이다.



SQL 방언과 표준화

표준 SQL언어이지만 특정 제품에서만 사용되는 명령어가 나뉘게됨

ex) Oracle, SQL Server : FROM 생략 가능

DELETE sample1

ex) MySQL, PostgreSQL : FROM 생략 불가능

DELETE FROM sample1

프로그래밍 언어의 세계에서 ‘방언’은 환영받지 못한다.

이 같은 방언을 없애기위해 모두 ‘표준어’ 라는 것을 사용하면 된다.

그러기 위해서 표준SQL 기준을 결정하기도 한다.

 

 

 

<데이터베이스 서버>

 

클라이언트/서버 모델

 

클라이언트/서버 모델이란 사용자 조작에 따라 요청을 전달하는 ‘클라이언트’와 해당 요청을 받아 처리하는 ‘서버’로 소프트웨어를 나누고, 복수의 컴퓨터 상에서 하나의 모델을 구현하는 시스템을 말한다.

브라우저에서 클라이언트가 요청을 보내면 서버가 처리하고 응답을 보낸다. 웹 시스템에는 없었던 사용자 인증이라는 것이 필요하다.

RDBMS에서는 사용자별로 데이터베이스 접근을 제한 할 수 있다.

ID와 비밀번호가 일치해야만 실행할 수 있고 실패하면 접근할 수 없게 된다.

 

MySQL 서버와 MySQL 클라이언트

 

즉 SQL명령어가 클라이언트가 되고 그것을 처리하는 MySQL서비스가 데이터베이스 서버가 되는 것이다.


<테이블에서 데이터 검색>

 

SELECT * FROM 테이블명 그리고 세미콜론(;)

SELECT * FROM 테이블명;

세미콜론을 빼먹지말고 하나의 명령문이 끝나면 ; 을 꼭 붙여줘야한다.

세미콜론이 붙지 않으면 실행되지 않는다.

SELECT : 명령의 종류

* : 모든 열 (모든 열을 의미하는 메타문자)


FROM :

처리 대상 테이블을 지정하는 키워드이다. 보통 FROM 뒤에 테이블명을 지정한다.

 

SQL 명령어 키워드는 ‘구’ 라는 단위로 나눌 수 있는데 SELECT 명령에서는 여러 개의 구로 구성되어있다.

SELECT 라는 ‘구’와 FROM 이라는 ‘구’로 구성된 것이다.

 

예약어와 데이터베이스 객체명

SELECT 와 FROM이 구를 결정하는 키워드이자 예약어다. 데이터베이스는 테이블을 생성하는데 이것을 테이터베이스 객체라고 하고 이름을 붙여서 사용한다. 그래서 기존에 등록되어 사용되고있는 테이블과 중복된 이름으로는 새로 생성할 수 없게 되는 것이다.

 

통상 데이터베이스 객체명은 예약어와 동일한 이름을 사용할 수 없다.

SELECT는 ‘구’ 이면서 ‘예약어’ 이다 그래서 SELECT라는 이름의 테이블은 생성 할 수 없다.

대소문자 구별

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

 

select * from table1;

 

Select * from Table1;

 

SELECT * FROM TABLE1;

 

모두 사용이 가능하다.

 

하지만 가능하면 예약어는 대문자로 객체명은 소문자로 표시해주는게 작성할 때 번거롭지만

보기에는 더 잘 보이기때문에 좋은점도 있다. 또한 다른 제품에서는 대소문자를 구별하는 경우가 있기 때문에 알고있으면 좋다.

 

 

Hello World를 실행한 결과 = 테이블

SELECT 명령을 실행하면 표 형식의 데이터가 출력된다.

 

‘행’(레코드)과 ‘열’(컬럼/필드)로 구성되는데 ‘행’은 모두 동일한 형태로 되어있으며 옆으로 ‘열’(컬럼/필드)가 나열되는데 ‘열’마다 이름이 지정되어 있다.

 

각각의 행과 열이 만나는 부분을 ‘셀’이라고 한다.

‘셀’에는 하나의 데이터 값이 저장되어 있다.

 

컬럼명이 no, name, birth, address 가 있다고 하면 가로로 순서대로 나열되는데 이 컬럼명이 가로로 나열되는 것을 ‘열’ 이라고 한다.

가로로 한칸씩 잡아먹고 나열된 열이 있고 그 열 아래로 ‘행’(레코드)가 순서대로 나열되는데 가로와 세로가 만나는 한 칸이 결국 ‘셀’이 되는 것이다.

 

*결론적으로 테이블이란 행과 열로 구성된 표 형식의 데이터라고 할 수 있다.

 

데이터에는 수치형과 문자열형이 존재하는데 숫자만으로 구성된 데이터를 ‘수치형 데이터’ 라고 하고 수치형 데이터는 오른쪽 정렬로 표시된다. 또한 사람의 이름을 name이라는 열에 저장한다면 각 행에 들어가는 값들은 임의의 문자로 구성된 데이터가 되는데

이것을 ‘문자열형’ 데이터라고 부르고 문자형은 왼쪽으로 정렬되어 표시된다.

 

또한 날짜와 시간을 나태는 데이터를 ‘날짜시간형’ 데이터라고 하는데 이 경우네는 왼쪽 정렬로 표시된다.

 

* 데이터는 자료형으로 분류할 수 있다!

* 열은 하나의 자료형만 가질 수 있다!

 

값이 없는 데이터 = NULL

SELECT의 결과를 보다보면 셀의 값이 ‘NULL’로 표시된 부분이 있다.

NULL은 특별한 데이터 값으로 아무것도 저장되어 있지 않은 상태를 말한다.

다시말해 NULL이라는 데이터가 저장되어있는 것이 아닌 정말 아무것도 저장되어 있지 않은 상태를 뜻한다.
NULL은 SQL에서 대단히 중요한 개념이다.

 

<테이블에서 구조 참조하기>

 

DESC 명령

DESC 테이블명;

DESC는 SQL명령은 아니지만 DESC명령으로 테이블에 어떤 열이 정의되어 있는지 알 수 있다.

 

필드명/타입/NULL상태/key/디폴트값 등등.. 한 눈에 해당 테이블에 정보를 볼 수 있게 되는 것이다.

 

이러한 것을 테이블구조의 참조라고 한다.

 

자료형

열에는 몇가지 속성을 지정할 수 있는데 그 중 가장 중요한 속성은 ‘자료형’이다.

  • INTEGER 형

INTEGER 형은 수치형의 하나로 정수값을 저장할 수 있는 자료형이다. 소수점은 포함 할 수 없다.

  • CHAR 형

CHAR형은 문자열형의 하나로 문자열을 저장할 수 있는 자료형이다. 문자열형에서는 열의 최대 길이를 지정해야한다.

CHAR(10)이라고 자료형을 지정했을 경우 최대 10문자로 된 문자열을 저장할 수 있으며 11문자로 된 문자열은 저장할 수 없다.

 

다음에 설명할 VARCHAR 형은 저장할 문자열의 길이에 맞춰 저장공간을 가변적으로 사용하여 저장한다.

 

반면 CHAR형은 언제나 고정된 길이로 데이터가 저장된다.

그에 따라 ‘고정 길이 문자열’ 자료형이라고 부르기도한다.

 

CHAR형은 길이가 고정되기 때문에 최대 길이보다 작은 문자열을 저장할 경우 공백문자로 나머지를 채운 후 저장하게 된다.

  • VARCHAR 형

VARCHAR형 역시 문자열을 저장할 수 있는 자료형이다. 최대 길이를 지정하는 점은 CHAR형과 같다.

단 CHAR형과는 달리 데이터 크기에 맞춰 저장공간의 크기도 변경된다. 그에 따라 ‘가변 길이 문자열’ 자료형이라고 한다.

  • DATE 형

DATE형은 날짜값을 저장할 수 있는 자료형이다. 날짜값이란 ‘2023년 3월 8일’ 과 같이 연월일의 데이터를 저장할 수 있는 형이다.

  • TIME 형

TIME 형은 시간을 저장할 수 있는 자료형이다. 예를 들어 ‘12시 30분 20초’와 같은 시분초의 데이터를 저장할 수 있는 자료형이다.

 

* 문자열형에는 고정길이와 가변 길이가 있다.

<검색 조건 지정하기>

 

SELECT 구에서 열 지정하기

SELECT 열1, 열2 FROM 테이블명

열은 위의 구문처럼 콤마(,)를 이용하여 구분 지으며 여러 개를 지정할 수 있다. 지정한 열만 결괏값으로 표시된다.

SELECT FROM 테이블명; ← 이렇게 작성하면 에러가 생긴다. 무조건 열을 지정해줘야한다.

SELECT 열1, 열1, 열1 이런식으로 동일한 열을 중복으로 지정해도 상관은 없다.

열을 지정하는 순서는 정해진 것은 없다

SELECT 열1, 열2 또는 SELECT 열2, 열1 어떤식이든 상관없으며 지정된 열의 순서대로 데이터를 나타낼 뿐 큰 차이는 없다.

 

WHERE 구에서 행 지정하기

테이블의 열은 많아야 몇십 개 정도지만 행은 열에 비해 훨씬 많을 수 있다.

데이터베이스 규모에 따라 다르지만 일반적으로 수백 건에서 대규모의 경우 수천만 건의 행에 달하는 경우도 있다.

이처럼 많은 행 속에서 필요한 데이터만 검색하기 위해서는 WHERE 구를 사용한다.

 

WHERE 구는 FROM 구의 뒤에 표기한다. 예약어 ‘WHERE’ 뒤에 검색 조건을 표기한다.

조건에 일치하는 행만 SELECT의 결과로 반환한다.

 

작성순서 :

SELECT 열 FROM 테이블명 WHERE 조건식 ;

 

  • 구의 순서와 생략

SQL에서는 구의 순서가 정해져 있어 바꿔서 적을 수 없다. FROM 구 뒤에 WHERE 구를 표기한다.

SELECT 구 → WHERE 구 → FROM 구 순서로 적으면 에러가 발생한다.

구에는 WHERE 구 처럼 생략 가능한 것도 있다. 만약 WHERE 구를 생략한 경우는 테이블 내의 모든 행이 검색 대상이 된다.

  • WHERE 구

조건식은 ‘열과 연산자, 상수로 구성되는 식’ 이다. 구체적인 예를 들어 설명해보자

 

SELECT * FROM 테이블명; 이라고 했을 때 나오는 모든 값에서 no 열 값이 2인 행만 선택해서 출력하고 싶다면?

SELECT * FROM 테이블명; WHERE no=2; 이렇게 작성해주면 해당 테이블 전체에서 no열의 값이 2인 행만 뽑아서 출력해준다.

 

WHERE no = 2; 를 자세하게 알아보면 no는 열의 이름이되고 = 은 연산자가 된다.

연산자란 어떤 계산을 할지 지정하는 것으로 보통 기호로 표기한다.

= 인 경우, 좌우로 2개 항목이 필요한 ‘이항 연산자’에 해당하며 일반적으로 많이 쓰이는 기호이다.

 

= 연산자를 기준으로 좌변과 우변의 항목을 비교하고 서로 같은 값이면 참을, 같지 않으면 거짓을 반환한다.

no = 2의 조건식에서 no열 값이 2인 행은 참이되며 1이나 3인 행은 거짓이 된다.

조건식을 만족하는 참이 되는 행만 결괏값으로 반환한다. = 연산자는 비교한 결괏값이 참인지 거짓인지를 반환하므로 ‘비교 연산자’라고 부른다.

  • 값이 서로 다른 경우 <>

비교 연산자는 = 외에도 존재한다. 조건식에 사용하는 연산자를 바꾸거나 복수의 연산자를 조합하면 복잡한 조건식을 만들 수 있다.

 

검색 조건으로 <> 연산자를 사용하는 예를 살펴보자

 

기존 검색은 전체 항목을 뽑아냈다.

 

SELECT * FROM 테이블명;

 

현재 이렇게 뽑아낸 값에서 내가 원하는 값만 추출하기위해서 조건식을 걸어보자

 

SELECT * FROM 테이블명 WHERE no <>2;

 

이렇게 작성해주면 no 열 값이 2가 아닌 행만 검색한다는 것이다.

 

그렇게되면 2를 제외한 no열 값이 1또는 3이 되는 값들만 출력이된다.

 

이전의 조건식에서 연산자를 =에서 <>로 바꿔줬다. = 연산자가 서로 같은 값인지를 비교하는 연산자인데 반해,

<> 연산자는 서로 다른 값인지를 비교하는 연산자이다.

 

여기서는 no열 값이 2가 아닐 경우 참이 되므로, 값이 1과 3인 행이 화면에 표시되는 것이다.

 

  • <>연산자를 통해 ‘값이 서로 다른 경우’ 참이 되는 조건식으로 변경할 수 있다.

이와 같이 WHERE구에서 지정한 조건식에 따라 복수의 행이 반환되는 경우도 있다.

반드시 하나의 행만 반환되는 것은 아니다. 조건식에 일치하는 행이 전혀 없는 경우 아무것도 반환되지 않게되고 에러는 생기지 않는다.

  • 문자열형의 상수

이전에는 수치형 열을 조건식으로 뽑아내서 검사했지만 문자열형을 조건으로 뽑아내기 위해서는 다른 방식으로 해줘야한다.

‘홍길동’ 이라는 이름을 가진 행을 뽑아낸다면 싱글쿼트 (’ ‘)로 둘러싸서 표기해야만 조회가 가능하다.

 

날짜시간형의 경우에도 싱글쿼트로 둘러싸 표기해야한다. 이때 연월일은 하이픈(-)으로 구분해준다.

시간은 시분초를 콜론(:)으로 구분하여 표기한다.

 

ex) 수치형 상수 :

 

1 100 -3.8

 

ex) 문자열 상수 :

 

’ABC’ ’홍길동’

 

ex) 날짜시간형 상수 :

 

’2023-03-08’ ’2023-03-08 ‘10:30:00’

 

  • NULL 값 검색

’검색’이라고 했지만 조건식을 표기하는 것 뿐이므로 간단하다. 하지만 NULL 값을 검색할 경우에는 조금 주의해야한다.

 

지금부터 NULL값을 검색하는 방법에 관해 알아보자

 

시험삼아 이전에 작성한 = 비교연산자를 통해서 검색이 가능한지 확인해보자

 

SELECT * FROM 테이블명 WHERE birth = NULL; 이라고 작성했지만 널값으로 들어가있는 birth는 조회할 수 없다.

 

즉 = 비교연산자로 NULL을 검색할 수는 없다.

 

  • IS NULL

NULL 값을 검색할 때는 = 연산자가 아닌 IS NULL 을 사용한다. IS NULL은 술어로 연산자의 한 종류로 생각해야한다.

birth IS NULL과 같이 사용하면 된다. 좌변 항목의 값이 NULL인 경우 참을 반환한다.

 

SELECT * FROM 테이블명 WHERE birth IS NULL; 이라고 작성해주면 NULL로 되어있는 birth 행들을 반환한다.

 

반대로 NULL값이 아닌 행을 검색하고 싶다면 IS NOT NULL 을 사용하면 된다.

SQL에서 사용되는 비교연산자

  • 비교 연산자

= 연산자와 <> 연산자, IS NULL로 검색하는 방법에 대해 알아보았는데

WHERE 구로 지정하는 조건식은 참과 거짓을 반환하는 비교 연산자나 술어를 사용해서 표기한다.

 

SQL에서는 많은 연산자 술어를 사용할 수 있다.

 

여기에서는 대표적으로 비교 연산자에 어떤 것이 있는지 알아보자

 

= 연산자

 

좌변과 우변의 값이 같을 경우 참이 된다.

 

<> 연산자

 

좌변과 우변의 값이 같지 않을 경우 참이 된다.

>= 연산자

 

좌변 값이 우변의 값보다 클 경우 참이된다. 같거나 작을 경우는 거짓이된다.

 

<= 연산자

 

좌변 값이 우변의 값보다 크거나 같을 경우 참이 된다. 작을 경우는 거짓이 된다.

 

< 연산자

 

좌변 값이 우변의 값보다 작을 경우 참이된다. 클 경우 거짓이된다.

 

<= 연산자

 

좌변 값이 우변 값보다 작거나 같을 경우 참이 되고 클 경우 거짓이 된다.

 

>또는 < 와 같이 = 을 붙여 사용할 경우에는

 

> 또는 < 가 먼저 작성된 후 뒤에 =을 붙여야하며 띄어쓰기를 할 경우 2개의 연산자로 인식하게되서 붙여서 사용해줘야한다.

이어서 조건 부합하기를 알아볼텐데 글이 너무 길어져서 여기서 한번 끊고 이어써야 할 것 같다.

그럼 다음편에서 계속..
여기까지 읽은 사람이 있다면 박수를 쳐주고싶다 짝짝짝

 

 

 

 

모든 포스팅에 대한 내용은 도서 SQL첫걸음에서 익히고 배운 것들에 대한 내용을 직접 타이핑 하였음을 밝힙니다.