MySQL 기초

신입 프론트엔드 개발자가 갑자기 MySQL 문을 만나도 당황하지 않기 위한 MySQL 기초 문법

안녕하세요! 융(Yoong)입니다.

여러분은 데이터베이스와 SQL문에 대해 잘 알고 계신가요? 프론트엔드 개발자로서 SQL은 익숙하지 않은 언어일 수 있습니다. 특히 저처럼 프론트엔드 개발만 집중해오신 분들이라면 더욱 그럴 거라고 생각합니다. 저는 입사 후 맡은 첫 업무에서 MySQL 쿼리문을 해석하고 직접 수정해야 했는데요, SQL문을 어디서부터 어떻게 해석해야 할지 몰라 당황했던 기억이 있습니다. 그래서 이번 글에서는 그동안 조금씩 적어놓았던 MySQL 관련 기초 내용을 정리해 보려 합니다.

❗️이 글은 신입 프론트엔드 개발자가 갑자기 MySQL 문을 만나도 당황하지 않기 위한 아주 기초적인 MySQL 문법을 다룹니다.

이 글의 목적

  • MySQL 데이터베이스의 기본 구조와 용어를 이해할 수 있습니다.
  • 간단한 MySQL 문장을 해석할 수 있습니다.
  • 간단한 MySQL 문장을 작성할 수 있습니다.

앗! 야생의 SQL문이 등장했다!

SELECT id,title,author FROM book ORDER BY id DESC LIMIT 2;

기존 프로그래밍 언어와는 다른 인상을 주는 SQL문이 등장했습니다.

아직은 많이 낯설죠? SQL문을 모르시더라도 영어를 해석해보셨다면 대략적인 의미를 이미 파악하셨을지도 모르겠습니다. 이 글의 마지막에서 같은 쿼리문을 보여드리겠습니다. 처음 봤을 때와 기초 문법을 익혔을 때 어떻게 해석되는지 비교해보세요. 그럼 빠르게 SQL이 무엇인지부터 살펴봅시다.


구조적 질의 언어(SQL)

  • Structured Query Language
  • 데이터베이스 관리 시스템(DBMS) 에서 자료를 관리하고 처리하기 위해 설계된 언어입니다.
  • 데이터베이스 관리 시스템(DBMS)은 데이터베이스를 관리하는 시스템 또는 소프트웨어입니다.
  • MySQL도 데이터베이스 관리 시스템(DBMS, DataBase Management System) 중 하나이므로 SQL을 사용합니다.

SQL, 즉 구조적 질의 언어는 ‘사람과 DBMS가 소통하기 위한 언어’입니다. 이 SQL문(=쿼리문)을 사용하여 DBMS에서 테이블 및 데이터의 생성, 수정, 삽입, 검색, 삭제 등 다양한 작업을 수행할 수 있습니다.

SQL의 언어적 특성

SQL을 사용하기 전에 알아야 할 가장 기본적인 문법입니다. 이를 숙지하면 이후 만나게 될 쿼리문들을 더 잘 읽을 수 있습니다.

  1. 대소문자를 가리지 않습니다.

    • 단, 서버 환경이나 DBMS(ex. MySQL) 종류에 따라 데이터베이스 또는 필드명에 대해 대소문자를 구분하기도 합니다.
    • 이 글에서는 예약어와 식별자가 잘 구분되어보이도록 예약어는 대문자로, 그외 식별자(테이블명, 컬럼명 등)은 소문자로 작성하였습니다.
  2. SQL 명령은 반드시 세미콜론(;) 으로 끝나야 합니다.

  3. 고유의 값따옴표(’) 로 감싸줍니다.

    • 문자형 데이터일때는 따옴표가 필수이지만, 숫자형 데이터에서는 불필요합니다.

    ex) SELECT * FROM table WHERE name = 'James';

  4. SQL에서 객체를 나타낼 때는 백틱(`) 으로 감싸줍니다.

    • 필수는 아닙니다. 객체 이름을 만드는 규칙에 위배되지 않는다면 백틱은 생략할 수 있습니다. 하지만 객체 이름에 공백이 있거나, 예약어이거나, 숫자로 시작하거나 등 식별자 명명 규칙에 위배되는 경우에는 백틱으로 감싸야만 구문 오류가 발생하지 않습니다.
    • 데이터베이스에서의 ‘객체’란, 데이터베이스를 구성하는 독립된 요소들로 테이블, 컬럼, 뷰, 저장 프로시져, 함수, 트리거, 인덱스 등이 있습니다.

    ex) SELECT `cost`, `type` FROM `table`;

  5. 주석 은 앞에 -- 를 붙입니다.

    ex) --SELECT * FROM table;

  6. 여러 줄 주석은 /* */ 로 감싸줍니다.

    /*
    SELECT * FROM table WHERE id=(SELECT * FROM table WHERE name='yoong')
    */

SQL의 종류

SQL문의 종류는 크게 4가지로 나눌 수 있습니다. SQL 명령문의 종류 여기서 우리가 가장 자주 만나고 사용하게 될 명령어는 무엇일까요? 바로 데이터 조작어(DML) 입니다. 그만큼 가장 중요한 명령어라고 할 수 있습니다. 이 글에서도 데이터 조작어(DML)를 위주로 설명할 것입니다.


MySQL 데이터베이스의 구조

MySQL은 정확히 말하면 DBMS 중에서도 ‘관계형’ 데이터베이스 관리 시스템(RDBMS, Relational DataBase Management System)에 속합니다. RDBMS의 데이터베이스는 테이블(table) 이라는 최소 단위로 구성되어 있습니다. 아래 그림을 통해 데이터베이스의 구조를 파악해봅시다.

데이터베이스 구조

  • 데이터베이스 서버(database server) ex) MySQL

  • 데이터베이스(database, 또는 스키마 schema) 연관된 표(table)들을 그루핑한 것, 일종의 테이블 모아두는 폴더

  • 테이블(table): 표

테이블 구조

  • 로우(row): 행, 레코드 실질적인 진짜 데이터. 위의 테이블은 2개의 row를 가지고 있습니다.

  • 컬럼(column) : 열, 필드 테이블의 세로. 각 테이블은 여러 개의 컬럼(열, 필드)로 구성됩니다. 위의 테이블은 4개의 컬럼으로 구성되어 있습니다.


MySQL 접속

이제 본격적으로 데이터베이스를 다루기위해 MySQL에 접속해 봅시다.

mysql -u root -p
//-u : user
//root 라는 사용자로 접속하겠다.
//-p : password. 비밀번호 입력하겠다. -> enter 치고 그 다음 커맨드에서 비번 입력 필요

터미널에 위 명령어를 치면 MySQL에 접속할 수 있습니다.

root는 기본 유저로, 일반적으로 관리자 계정이기 때문에 모든 권한이 열려 있습니다. 실제로는 root 권한으로 데이터베이스를 다루는 것은 위험하기 때문에 별도의 사용자를 만들어 접속하는 것이 좋습니다. 계정에 관한 내용은 이 글에서 다루지 않습니다.

참고로 MySQL 접속을 종료하고 싶다면 exit 을 입력해주면 됩니다.

MySQL 스키마(schema = database) 다루기

우선 가장 먼저 우리가 사용할 데이터베이스(스키마)를 생성해줘야 합니다. 아래는 데이터베이스를 다루는 기본 명령어들입니다. 쿼리문 하단에 사용할 수 있는 옵션들을 주석으로 기록해두었습니다. 더 자세한 내용이 궁금하시다면 MySQL 공식 문서를 참고해주세요.

  • 데이터베이스(스키마) 생성하기

    CREATE DATABASE yoong;
    --CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
  • 데이터베이스(스키마) 삭제하기

     DROP DATABASE yoong;
    --DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
  • 데이터베이스(스키마) 리스트 확인하기 (이때 복수형인것에 주의)

    SHOW DATABASES;
    --SHOW {DATABASES | SCHEMAS}
    --  [LIKE 'pattern' | WHERE expr]
  • 데이터베이스(스키마) 선택하기

    • SELECT 문 등을 실행하려면 먼저 사용할 데이터베이스를 지정해주어야 합니다.
    USE yoong;
    --USE 스키마이름

MySQL 테이블 생성하기

DB의 핵심인 테이블을 만들어 볼까요? 책 정보를 저장할 book 이라는 이름의 테이블을 생성해줍시다. 이 테이블을 구성할 컬럼은 총 5개(id, title, description, created, author) 입니다. 테이블을 생성하기 위해서 다음과 같은 쿼리문을 실행해주면 됩니다.

CREATE TABLE book
(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	title VARCHAR(100) NOT NULL,
	description TEXT NULL,
	created DATETIME NOT NULL,
	author VARCHAR(30) NULL,
	PRIMARY KEY(id)
);

괄호 안을 한 줄씩 살펴보면 컬럼명 데이터타입 옵션 이 순서대로 써있는것을 보실 수 있습니다.

여기서 컬럼명은 우리가 직접 지어준 이름이고, 데이터타입은 MySQL 데이터 타입 공식 문서 를 참고해서 해당 컬럼에 어떤 데이터가 들어갈 것인지에 따라 알맞은 타입을 지정해주면 됩니다.

그럼 쿼리문에 쓰인 키워드들을 하나씩 살펴볼까요?

  1. 데이터타입
    • INT: 정수형 데이터 타입(4byte). -2147483648 ~ +2147483647 범위까지 저장할 수 있습니다. UNSIGNED 예약어를 사용하면 0 ~ 4294967295 까지 표현할 수 있습니다.
    • VARCHAR(n): 가변 길이 문자형 데이터 타입(1 ~ 16383byte). 괄호 안의 n은 길이를 나타내며 n 길이를 초과하는 부분은 삭제합니다. 지정된 길이 이하라면 차지한 글자수 만큼만 공간을 차지합니다. 반대로 CHAR(1 ~ 255byte) 라는 데이터타입은 지정된 길이보다 차지한 글자수가 짧더라도 지정된 길이만큼의 공간을 차지합니다. 다만 성능면에서는 CHAR가 조금 더 좋습니다. 보통은 글자 수가 고정된 경우 CHAR를 사용하고, 글자 수가 변동될 경우에는 VARCHAR을 주로 사용합니다.
    • TEXT(n): 대량의 텍스트를 저장할 수 있는 데이터 타입(1 ~ 65535byte). 긴 글을 저장해야할 경우 주로 이 타입을 사용합니다.
    • DATETIME: 날짜와 시간 형태의 기간 표현 데이터 타입(8byte). YYYY-MM-DD HH:MM:SS 형식으로 저장합니다.
  2. 그 외
    • UNSIGNED: 값의 범위가 0부터 시작되도록 만드는 예약어
    • NOT NULL: 널(빈 값)을 허용하지 않는다는 의미
    • NULL: 널(빈 값)을 허용한다는 의미
    • AUTO_INCREMENT: 자동으로 1씩 증가. id 값에 많이 활용합니다.
  3. PRIMARY KEY: 기본 키
    • 기본 키 컬럼은 각 행을 구분하는 유일한 열입니다.
    • 아래처럼 쓰는 것도 가능합니다.
          ...
          id INT(13) NOT NULL AUTO_INCREMENT PRIMARY KEY,
          ...
    • 테이블당 오직 하나의 기본키(PK)만 가질 수 있습니다. (다만, 기본키를 구성하는 칼럼이 복수일 수 있습니다. 복합키(Composite Key))
    • PRIMARY KEY 로 설정한 컬럼은 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가집니다.
      • NOT NULL: 널 값을 허용하지 않겠다.
      • UNIQUE: 중복되는 값을 허용하지 않겠다.

MySQL의 CRUD

이제 테이블의 데이터를 삽입하고, 조회하고, 갱신하고, 삭제할 수 있는 명령어를 알아봅시다. 본격적인 데이터 조작에 앞서, CREATE TABLE로 만들어 준 테이블 내용이 기억이 안 난다면 DESC 테이블명 을 입력해보세요. 각 컬럼에 대한 정보가 출력됩니다. desc book

📌 데이터 추가 - INSERT

조회하기에 앞서 데이터를 먼저 넣어줘야겠죠? INSERT 명령어로 행(row)를 넣어줄 수 있습니다.

INSERT INTO book (title,description,created,author) 
	VALUES('이펙티브 타입스크립','TS 동작원리의 이해와 구체적인 조언 62가',NOW(),'댄 밴더');
--INSERT INTO 테이블명 (컬럼1,컬럼2,...) VALUES(데이터1,데이터2,...)
  • 컬럼명 순서와 넣어줄 데이터 순서가 일치해야 합니다.
  • NOW() 을 써주면 현재시간이 들어갑니다.
  • 추가한 데이터를 보려면 테이블을 조회할 수 있는 SELECT 명령어를 사용하면 됩니다. 이 명령어에 대한 설명은 바로 다음에 이어서 하겠습니다.
SELECT * FROM book;
--book 테이블의 모든 데이터를 가져와라!

select all


📌 데이터 조회 - SELECT

SELECT * FROM book
--book 테이블의 모든 데이터 출력

SELECT id,title,author FROM book;
--SELECT 컬럼1,컬럼2,... FROM 테이블명
  • 보고싶은 순서대로 컬럼명 나열하면 그 순서대로 출력됩니다.
  • 전체 컬럼을 조회하고 싶을 때는 컬럼명을 다 써주는 대신 * 을 사용합니다.
  • MySQL의 SELECT문 메뉴얼 을 보시면 수많은 옵션 예약어들을 확인하실 수 있습니다. 그 중에 자주 쓰이는 몇 가지를 살펴보겠습니다.
  1. WHERE : 특정 조건에 해당하는 데이터만 조회
    id의 값이 2인 행만 조회됩니다.
SELECT * FROM book WHERE id = 2;
  1. ORDER BY : 오름차순(ASC) 또는 내림차순(DESC) 으로 정렬하기
    id 를 기준으로 내림차순으로 조회됩니다.
SELECT * FROM book ORDER BY id DESC;
--ORDER BY 컬럼명 [ASC | DESC]
  1. LIMIT : 출력 개수 제한하기 (주로 ORDER BY와 함께 사용)
    2개의 행까지만 조회됩니다.
SELECT * FROM book LIMIT 2;
--LIMIT 2 -> 2건만 보고싶다. 행 2개까지만 출력됩니다.

📌 데이터 업데이트 - UPDATE

UPDATE book SET description = '...', title = 'etc' WHERE id=3;
--UPDATE 테이블명 SET 컬럼명=데이터, 컬럼명=데이터... WHERE 조건
  • 여러 데이터를 바꾸려면 콤마(,) 로 연결해서 작성합니다.
  • ⚠️ WHERE 같은 조건문을 작성해주지 않으면 모든 행의 값이 바뀌므로 주의해야합니다.

📌 데이터 삭제 - DELETE

DELETE FROM book WHERE id = 3;
--DELETE FROM 테이블명 WHERE 조건
  • ⚠️ DELETE도 마찬가지로, WHERE 같은 조건문을 작성해주지 않으면 모든 행의 값이 바뀌므로 주의해야 합니다.

앗! (또 다시) 야생의 SQL문이 등장했다!

이제 여러분은 아주 기본적인 데이터 CRUD SQL문을 읽고 작성할 수 있게 되었습니다. 앞에서 보여드렸던 쿼리문을 기억하시나요? 다시 한 번 살펴봅시다.

SELECT id,title,author FROM book ORDER BY id DESC LIMIT 2;

해당 쿼리문은 ”book 테이블에서 id, title, author 컬럼을 조회해주세요. 보여줄 때는 id를 기준으로 내림차순으로 정렬하고, 행은 2개까지만 보여주세요.” 라는 의미입니다. 이 SQL문이 잘 이해가 되셨나요? 그렇다면 여러분은 성공적으로 데이터베이스를 다루는 첫 발을 뗐습니다! 🎉

이 글이 처음 MySQL을 접한 분들에게 도움이 되길 바라며, 다음에 기회가 된다면 관계형 데이터베이스의 꽃인 JOIN과 서브쿼리에 대해서도 포스팅해보도록 하겠습니다. 긴 글 읽어주셔서 감사합니다.


참고 자료 Opentutorials.org - MySQL MySQL 공식 Documentation 혼자 공부하는 SQL - 우재남 저

디지엠유닛원 주식회사

  • 대표이사 권혁태
  • 개인정보보호책임자 정경영
  • 사업자등록번호 252-86-01619
  • 주소
    서울특별시 금천구 가산디지털1로 83, 6층 601호(가산동, 파트너스타워)
  • 이메일 unit1@dgmit.com