ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL. 95 SQL DDL, DML, DQL
    TIL 2021. 1. 11. 21:27
    728x90

    이전까지는 Django 프레임워크를 이용하여 MySQL DB에 접근하여 CRUD를 사용 하였다.

    기본적으로 MySQL에 원하는 데이터를 생성하고 수정하는 등의 업무를 수행하기 위해선

    원래대로 라면, SQL 문을 알아야 하고 이를 이용해 CRUD등과 같은 업무를 수행할 수 가 있다

     

    이전 Django 대해 알아볼 당시 한번 언급하였던 Django ORM 개념으로

    내가 작성한 Python 문 -> SQL 문으로 데이터베이스가 알아 들을수 있는 문법으로 자동으로 변환시켜 준다. (migrations.py)

     

    하지만 기본적으로 SQL 문은 가장 기본적으로 데이터베이스에 사용되는 언어이므로 반드시 숙지하고 있어햐 한다.

    언제까지 Django ORM을 사용하여 이러한 과정을 Django에게 떠넘기게 된다면 SQL문 바보가 될것이다.

     


    DDL (Data Define Language)

    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 로 설정합니다.
    ); # 쿼리문은 ; 로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성할 수 있습니다.
    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) # 외래키를 걸어줄 칼럼과 참조할 테이블과 칼럼을 순서대로 적어줍니다.
    );

    DML (Data Manipulation Language)

    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 ('새소년');
    UPDATE artists SET name='Pink Floyd' WHERE id=2;
    # UPDATE 쿼리문은 데이터를 수정할 테이블을 기입합니다.
    # 바꾸고자 하는 칼럼값에 새롭게 업데이트 할 데이터를 대입합니다.
    # WHERE 문은 프로그래밍 언어의 if 문이라고 생각하면 됩니다. 조건을 주는 쿼리문 입니다.
    # 이 예제에서는 id=2 즉, artists 테이블의 id가 2번인 데이터에 대해서 UPDATE를 하겠다는 의미입니다.
    DELETE FROM artists WHERE name='새소년';
    # DELETE 쿼리문은 테이블의 이름과 WHERE 문으로 조건을 걸어주면 됩니다. 

    DQL (Data Query Language)

    설명이 길었지만, 실제로는 SELECT 문 자체가 DQL의 대표적인 쿼리문이라고 할 수 있습니다. 테이블에 저장된 데이터를 꺼내오는 핵심 쿼리문 입니다. 이번 튜토리얼에서는 단순한 SELECT 문을 넘어서 JOIN을 통한 테이블 결합과 WHERE, LIKE 로 조건을 주어서 데이터를 쿼리하는 것 까지 실습해 보겠습니다.

    설명이 길었지만, 실제로는 SELECT 문 자체가 DQL의 대표적인 쿼리문이라고 할 수 있습니다. 테이블에 저장된 데이터를 꺼내오는 핵심 쿼리문 입니다. 이번 튜토리얼에서는 단순한 SELECT 문을 넘어서 JOIN을 통한 테이블 결합과 WHERE, LIKE 로 조건을 주어서 데이터를 쿼리하는 것 까지 실습해 보겠습니다.

    # 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 songs; 쿼리문을 통한 결과를 보면 가사가 너무 길기 때문에 한 눈에 보기가 어렵습니다. 이럴때는 원하는 칼럼만 표시해 달라는 쿼리문을 작성할 수 있습니다. 현재 songs 테이블에 들어간 노래제목들만 뽑아내고 싶을 땐 다음과 같은 쿼리문을 날릴 수 있습니다.

    SELECT songs.title FROM songs;

     


    가사와 함께 보고싶을 때는 다음과 같이 , 로 구분해서 나열 해 주면 여러 칼럼의 값을 테이블에서 뽑아올 수 있습니다.

    SELECT songs.title, songs.lyrics FROM songs;


    WHERE 조건문

    이제 WHERE, LIKE 와 같은 조건으로 조금 더 다양한 쿼리문을 실습 해 봅시다.

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

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


    WHERE + LIKE 조건문

    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의 값이 가져가도 돼요로 끝나면 쿼리문에 의해 데이터가 조회됩니다.


    JOIN

    우리는 분명 테이블을 두개 생성 했는데 지금까지는 하나의 테이블에 대해서만 SELECT 문을 사용하지 않았나요? 쿼리문 하나로 연관성이 있는 두개의 테이블을 결합시킬때는 어떻게 할까요? 바로 JOIN 문을 사용하면 됩니다.

    JOIN 은 두개의 테이블을 결합할 때 사용 되는데 위의 밴다이어그램에 표현된 것 처럼 집합 개념으로 생각하면 이해하기 어렵지 않습니다. **교집합, 즉 연결성이 있는 부분(칼럼)**으로 두 개의 테이블을 결합 할 수 있습니다.

    우리가 위에서 작성한 두개의 테이블 artists 테이블과 songs 테이블의 연결성이 있는 칼럼은 어떤 칼럼 일까요? 바로 songs 테이블에서 Foreign Key로 지정한 artist_id 입니다.

     

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


    JOIN + WHERE + LIKE 조건문

    물론 우리가 앞서 배웠던 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 artists.name = '새소년'; # 새소년의 노래들만 조회할 수 있습니다.


    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가 들어간 데이터만 조회합니다.

     

    출처 : WECODE

    wecode.co.kr/?utm_source=google_ads&utm_medium=Search%20ads&utm_campaign=Hero_SA&gclid=CjwKCAiAi_D_BRApEiwASslbJ1egGS8Ldg106BIJGuztbCr-ycQzqnQd1fKbBJyEhE-WrTmUSLmVehoCG_gQAvD_BwE

     

    728x90

    'TIL' 카테고리의 다른 글

    TIL 100 달성  (0) 2021.01.16
    TIL.91 Javascript_Filter 함수  (0) 2021.01.07
    TIL.86 Mocking, Patching  (0) 2021.01.02
    TIL.85 Unit_test_실습_2  (0) 2021.01.01
    TIL.84 Unit Test_실습  (0) 2020.12.31
Designed by Tistory.