DDL 은 Data Define Language 의 약자로써 데이터베이스의 Schema(형태)를 정의할 수 있는 쿼리문을 의미한다. CREATE, ALTER, DROP
이 대표적인 쿼리문이다. DDL 에 속하는 쿼리문의 이름에서도 알 수 있듯 데이터를 구성하는 논리적인 구조(데이터베이스 또는 테이블)을 추가하고 수정하고 삭제할 수 있다. 또한 메타데이터(데이터에 대한 데이터)를 다루는 쿼리문이라고 할 수 있다.
CREATE DATABASE my_favourite_artists; # Database 를 생성하는 명령어
SHOW DATABASES; # 현재 MySQL 에 저장되어있는 데이터베이스를 보는 명령어
USE my_favourite_artists; # 생성한 데이터베이스에 접근하는 명령어
SHOW tables; # 현재 데이터베이스 안에 저장되어있는 테이블들을 보는 명령어
아티스트 정보를 담기 위한 테이블을 생성한다.
CREATE TABLE artists
(
id INT NOT NULL AUTO_INCREMENT, # id 칼럼을 정수, NULL 을 허락하지 않으며 값을 자동증가하게 설정합니다.
name VARCHAR(100) NOT NULL, # name 칼럼을 100의 크기를 가지는 문자열, NULL 을 허락하지 않습니다.
PRIMARY KEY (id) # 이 테이블의 Primary Key 를 id 로 설정합니다.
); # 쿼리문은 ; 로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성할 수 있습니다.
테이블을 생성한 후에 sql문으로 잘 생성 되었는지 확인한다.
DESC artists; # Description 을 축약해 놓은 명령어로써, 테이블의 정보를 보여줍니다.
아티스트 테이블을 먼저 생성한 이유는 songs 테이블의 artist_id
가 artists 테이블의 id
를 참조하고 있기 때문이다. 외래키를 사용할 때는 FOREIGN KEY
와 REFERENCES
이 두가지 옵션을 사용해서 원하는 칼럼을 외래키로 만들고 참조하는 테이블의 칼럼을 정의할 수 있다.
CREATE TABLE songs
(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
lyrics VARCHAR(2000),
artist_id INT,
PRIMARY KEY (id),
FOREIGN KEY (artist_id) REFERENCES artists (id) # 외래키를 걸어줄 칼럼과 참조할 테이블과 칼럼을 순서대로 적어줍니다.
);
마찬가지로 외래키 설정이 잘 되었는지DESC
쿼리문으로 확인한다.
DESC songs;
⭐️ artist_id
를 보면 Key에 MUL
이 들어있는 것을 확인할 수 있다. 다른 테이블의 기본 키를 참조하는 외래키는 이처럼 MUL
로 표현 된다. MULTIPLE
이라는 뜻 입니다. 여러 행이 동일한 값을 가질 수 있음을 의미한다. (ex. 여러 노래가 동일한 artist_id
를 가질 수 있습니다. 한 아티스트가 여러 노래를 가지고 있기 때문이다.)
DML 은 Data Manipulation Language 의 약자로써 데이터를 조작하는 쿼리문들을 말한다. INSERT, UPDATE, DELETE
문이 대표적인 쿼리문이다. 쿼리문의 이름에서도 알 수 있듯이 INSERT
는 데이터를 테이블에 넣는 것을 의미하고, UPDATE
는 이미 테이블에 들어간 데이터를 수정하고, DELETE
는 데이터를 테이블에서 삭제한다.
INSERT INTO artists (name) VALUES ('Radio Head');
# INSERT INTO 뒤에는 테이블 명과 칼럼값을 소괄호로 감싸 줍니다.
# VALUES 뒤에는 실제로 넣을 값을 소괄호로 감싸주고 앞서 테이블의 칼럼을 지정한 순서대로 데이터를 넣으면 됩니다.
INSERT INTO artists (name) VALUES ('Pink Floid');
INSERT INTO artists (name) VALUES ('새소년');
테이블을 전체 조회하는 쿼리문은 다음과 같다.
SELECT * FROM artists; # * 는 와일드카드로써 테이블의 모든 칼럼을 조회하겠다는 의미와 같습니다.
테이블에 데이터를 넣은 후에 Pink Floid 의 철자가 틀렸다는 것을 확인됐다. 이미 테이블에 들어간 데이터를 수정하기 위해서는 어떤 쿼리문을 사용해야 할까?
바로 UPDATE
를 사용하면 된다.
UPDATE artists SET name='Pink Floyd' WHERE id=2;
# UPDATE 쿼리문은 데이터를 수정할 테이블을 기입합니다.
# 바꾸고자 하는 칼럼값에 새롭게 업데이트 할 데이터를 대입합니다.
# WHERE 문은 프로그래밍 언어의 if 문이라고 생각하면 됩니다. 조건을 주는 쿼리문 입니다.
# 이 예제에서는 id=2 즉, artists 테이블의 id가 2번인 데이터에 대해서 UPDATE를 하겠다는 의미입니다.
다시 한 번 테이블의 전체 데이터를 조회하는 쿼리문으로 데이터가 잘 수정되었는지 확인한다.
SELECT * FROM artists;
DELETE FROM artists WHERE name='새소년';
# DELETE 쿼리문은 테이블의 이름과 WHERE 문으로 조건을 걸어주면 됩니다.
SELECT * FROM artists;
DQL은 Data Query Language 의 약자로 데이터를 쿼리하는데 사용되는 SQL문을 뜻한다. 쿼리를 한다는 말이 무엇일까? Query 의 사전적 의미는 묻다, 질문하다 라는 뜻이다. 데이터베이스의 상황에 빗대어 보면, 데이터베이스 서버에게 데이터를 달라고 요청하는 것 이라고 해석할 수 있다. DQL이 우리가 가장 많이 사용하게 될 쿼리문이 되지 않을까 싶다. 실제로 프론트/백엔드 간의 소통을 위한 API를 구현할 때, 데이터베이스에 저장된 데이터를 쿼리해서 가져온 데이터를 응답으로 보내주는 경우가 많다.
설명이 길었지만, 실제로는 SELECT
문 자체가 DQL
의 대표적인 쿼리문이라고 할 수 있다. 테이블에 저장된 데이터를 꺼내오는 핵심 쿼리문이다.
데이터를 조회하기 위해서는 데이터가 있어야 하기 때문에 데이터를 만들었다. 😎
# artists 테이블에 들어갈 데이터
INSERT INTO artists (name) VALUES ('Radio Head');
INSERT INTO artists (name) VALUES ('Pink Floyd');
INSERT INTO artists (name) VALUES ('새소년');
# songs 테이블에 들어갈 데이터, artists 테이블과 1:N 관계
INSERT INTO songs (title, artist_id, lyrics) VALUES ('All I need', 1, 'I\'m the next act\nWaiting in the wings');
INSERT INTO songs (title, artist_id, lyrics) VALUES ('Videotape', 1, 'When I\'m at the pearly gates\nThis will be on my videotape, my videotape');
INSERT INTO songs (title, artist_id, lyrics) VALUES ('Comfortably Numb', 2, 'Hello? (Hello? Hello? Hello?\nIs there anybody in there?\nJust nod if you can hear me\nIs there anyone home?');
INSERT INTO songs (title, artist_id, lyrics) VALUES ('Wish you were here', 2, 'So, so you think you can tell\nHeaven from hell?');
INSERT INTO songs (title, artist_id, lyrics) VALUES ('파도', 3, '파도가 넘실넘실\n흐려진 달 사이로\n사람들 숨 쉬네\n절망이 없다');
INSERT INTO songs (title, artist_id, lyrics) VALUES ('난춘', 3, '그대 나의 작은 심장에 귀 기울일 때에\n입을 꼭 맞추어내 숨을 가져가도 돼요');
INSERT 문을 통해서 데이터를 각각의 테이블에 삽입 했을 때에는 SELECT * FROM
문으로 확인해본다.
SELECT * FROM artists;
SELECT * FROM songs;
또, 원하는 칼럼만 표시해 달라는 쿼리문을 작성할 수 있다.
현재 songs 테이블에 들어간 노래 제목만 뽑아내고 싶을 땐 다음과 같은 쿼리문을 보내서 얻을 수 있다.
SELECT songs.title FROM songs;
가사와 함께 보고싶을 때는 다음과 같이 ,
로 구분해서 나열 해 주면 여러 칼럼의 값을 테이블에서 얻을 수 있다.
SELECT songs.title, songs.lyrics FROM songs;
이제 WHERE, LIKE
와 같은 조건을 보겠다.
WHERE
문에는 앞서 살펴보았듯, 조건을 걸어줄 수 있다. 만약 "파도"라는 노래의 가사가 궁금하다면 다음과 같은 쿼리문을 작성할 수 있다.
SELECT songs.lyrics FROM songs WHERE songs.title = '파도';
WHERE
문은 프로그래밍 언어처럼 여러가지 연산자를 가집니다. 다양한 연산자는 다음 링크에서 확인 가능! 🧐
LIKE
문을 사용하면 문자열에 대해 검색하기가 훨씬 수월하다. 예를들어, 노래 가사의 일부 만으로도 노래를 검색하고 싶을때 LIKE
문을 사용할 수 있다. LIKE
문은 특수문자를 사용해서 문자열을 검색하는데, 다양한 특수문자와 해당하는 의미는 다음 링크에서 확인 가능! 🤓
'넘실넘실' 이라는 가사로 노래제목과 나머지 가사를 찾고싶다면 아래의 쿼리문을 사용하면 된다.
SELECT songs.title, songs.lyrics FROM songs WHERE songs.lyrics LIKE '%넘실넘실%';
# 위에서의 WHERE문은 = 연산자를 사용해서 정확한 값으로 비교를 했지만
# LIKE 문을 사용하면 이 처럼 넘실넘실이 포함된 데이터를 쿼리할 수 있습니다.
LIKE
를 사용하여 다음과 같은 쿼리문도 작성할 수 있다.
SELECT songs.title, songs.lyrics FROM songs WHERE songs.title LIKE 'All%';
# songs.title의 값이 All 로 시작하면 쿼리문에 의해 데이터가 조회됩니다.
SELECT songs.title, songs.lyrics FROM songs WHERE songs.lyrics LIKE '%가져가도 돼요';
# songs.lyrics의 값이 가져가도 돼요로 끝나면 쿼리문에 의해 데이터가 조회됩니다.