#TIL SQL DDL, DML, DQL

송정석·2022년 3월 16일
0

DDL (Data Define Language)

DDL 은 Data Define Language 의 약자로써 데이터베이스의 Schema(형태)를 정의할 수 있는 쿼리문을 의미한다. CREATE, ALTER, DROP 이 대표적인 쿼리문 문이다. DDL 에 속하는 쿼리문의 이름에서도 알 수 있듯 데이터를 구성하는 논리적인 구조(데이터베이스 또는 테이블)을 추가하고 수정하고 삭제할 수 있다. 또한 메타데이터(데이터에 대한 데이터)를 다루는 쿼리문이라고 할 수 있다

DB 생성 및 확인, 접근

CREATE DATABASE DB이름;		// Database 를 생성하는 명령어
SHOW DATABASES;				// 현재 MySQL 에 저장되어있는 데이터베이스를 보는 명령어
USE DB이름; 	// 생성한 데이터베이스에 접근하는 명령어

Table 생성 및 확인

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 로 설정한다.
); # 쿼리문은 ; 로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성할 수 있다.
DESC artists; # Description 을 축약해 놓은 명령어로써, 테이블의 정보를 보여준다.
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 songs;
CREATE DATABASE {database_name};
USE {database_name}
CREATE TABLE {table_name} (field_names);

DML (Data Manipulation Language)

DML 은 Data Manipulation Language 의 약자로써 데이터를 조작하는 쿼리문들을 뜻 한다. INSERT, UPDATE, DELETE 문이 대표적인 쿼리문들 이다. 쿼리문의 이름에서도 알 수 있듯이 INSERT 는 데이터를 테이블에 넣는 것을 의미하고, UPDATE 는 이미 테이블에 들어간 데이터를 수정하고, DELETE 는 데이터를 테이블에서 삭제한다.

INSERT INTO (table) : 테이블에 데이터 입력

INSERT INTO artists (name) VALUES ('Radio Head'); 
// INSERT INTO 뒤에는 테이블 명과 칼럼값을 소괄호로 감싸 준다.
// VALUES 뒤에는 실제로 넣을 값을 소괄호로 감싸주고 앞서 테이블의 칼럼을 
// 지정한 순서대로 데이터를 넣으면 된다.
INSERT INTO artists (name) VALUES ('Pink Floid');
INSERT INTO artists (name) VALUES ('새소년');

UPDATE (table) SET (column) : 데이터 수정

UPDATE artists SET name='Pink Floyd' WHERE id=2;
# UPDATE 쿼리문은 데이터를 수정할 테이블을 기입한다.
# 바꾸고자 하는 칼럼값에 새롭게 업데이트 할 데이터를 대입한다.
# WHERE 문은 프로그래밍 언어의 if 문이라고 생각하면 됩니다. 조건을 주는 쿼리문 이다.
# 이 예제에서는 id=2 즉, artists 테이블의 id가 2번인 데이터에 대해서 UPDATE를 하겠다는 의미다.
SELECT * FROM artists; // 변경 사항 조회해보기

DELETE FROM (table) : 테이블 삭제

DELETE FROM artists WHERE name='새소년';
// DELETE 쿼리문은 테이블의 이름과 WHERE 문으로 조건을 걸어주면 된다. 

SELECT * FROM artists;
`INSERT INTO {table_name} (column1, column2, ... ) 
VALUES 
(data1-1, data1-2, ... ), (data2-1, data2-2, ... );`

`UPDATE {table_name} SET {column_name}={new_data} WHERE {condition};`
`DELETE FROM {table_name} WHERE {condition};`

DQL (Data Query Language) & JOIN

DQL은 Data Query Language 의 약자로 데이터를 쿼리하는데 사용되는 SQL문을 뜻한다 쿼리를 한다는 말이 무엇일까? Query 의 사전적 의미는 묻다, 질문하다 라는 뜻 이다. 데이터베이스의 상황에 빗대어 보면, 데이터베이스 서버에게 데이터를 달라고 요청하는 것 이라고 해석할 수 있다. DQL이 우리가 가장 많이 사용하게 될 쿼리문이 되지 않을까 싶다. 실제로 프론트/백엔드 간의 소통을 위한 API를 구현할 때, 데이터베이스에 저장된 데이터를 쿼리해서 가져온 데이터를 응답으로 보내주는 경우가 많다.

SELECT

INSERT 문을 통해서 데이터를 각각의 테이블에 삽입 했을 때에는 SELECT * FROM 문으로 확인.

// 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입을 꼭 맞추어내 숨을 가져가도 돼요');
SELECT * FROM artists;
SELECT * FROM songs;
SELECT songs.title FROM songs;	// 노래제목들만 뽑아내고 싶을 때

WHERE 조건문

WHERE 문에는 앞서 살펴보았듯, 조건을 걸어줄 수 있다. 만약 파도 라는 노래의 가사가 궁금하다면 다음과 같은 쿼리문을 작성할 수 있다.

SELECT songs.lyrics FROM songs WHERE songs.title = '파도';

WHERE + LIKE 조건문

사용자는 노래 가사의 일부 만으로도 노래를 검색하고 싶어 한다. 이럴때 LIKE 문을 사용할 수 있다.

SELECT songs.title, songs.lyrics FROM songs WHERE songs.lyrics LIKE '%넘실넘실%';
// 위에서의 WHERE문은 = 연산자를 사용해서 정확한 값으로 비교를 했지만
// 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의 값이 가져가도 돼요로 끝나면 쿼리문에 의해 데이터가 조회된다.

JOIN

쿼리문 하나로 연관성이 있는 두개의 테이블을 결합시킬때는 어떻게 할까요? 바로 JOIN 문을 사용하면 된다.

https://www.w3schools.com/sql/sql_join_inner.asp
JOIN 은 두개의 테이블을 결합할 때 사용 되는데 위의 밴다이어그램에 표현된 것 처럼 집합 개념으로 생각하면 이해하기 어렵지 않다. 교집합, 즉 연결성이 있는 부분(칼럼)으로 두 개의 테이블을 결합 할 수 있다.
우리가 위에서 작성한 두개의 테이블 artists 테이블과 songs 테이블의 연결성이 있는 칼럼은 어떤 칼럼 일까요? 바로 songs 테이블에서 Foreign Key로 지정한 artist_id 이다.

artists 테이블

songs 테이블

두개의 테이블을 결합해서 현재까지 삽입된 아티스트와 노래의 정보를 모두 불러와서 아티스트의 이름, 노래의 제목과 가사를 데이터베이스에 쿼리 한다.

SELECT artists.name, songs.title, artists.id, songs.artist_id, songs.lyrics 
// 필요한 칼럼을 나열 합니다.
FROM artists # artists 테이블에
JOIN songs # songs 테이블을 결합시킵니다.
ON artists.id = songs.artist_id; # ON 뒤에는 교집합, 즉 연결성이 있는 부분(칼럼)을 적어줍니다.

JOIN + WHERE + LIKE 조건문

SELECT artists.id, artists.name, songs.title
FROM artists
JOIN songs
ON artists.id = songs.artist_id
WHERE artists.name = '새소년'; # 새소년의 노래들만 조회할 수 있습니다.

SELECT artists.id, artists.name, songs.title
FROM artists
JOIN songs
ON artists.id = songs.artist_id
WHERE songs.lyrics LIKE '%you%'; # 가사에 you 가 들어간 데이터만 조회합니다.

SELECT artists.id, artists.name, songs.title
FROM artists
JOIN songs
ON artists.id = songs.artist_id
WHERE songs.lyrics LIKE '%you%' OR songs.lyrics LIKE '%i%'; 
# 가사에 you 또는 i가 들어간 데이터만 조회합니다.

profile
Foot print

0개의 댓글