VIEW

Explain

  • 가상 테이블로 일부분만 데이터로 보고자 할때 사용합니다.

  • 실제 데이터를 저장하고 있지는 않습니다.

  • 한마디로 특정 컬럼의 데이터를 보여주는 역할만 합니다.

  • 뷰를 사용함으로 쿼리를 더 단순하게 만들수 있습니다.

  • 한번 생성된 뷰는 수정이 불가능 하며 인덱스설정이 불가능 합니다.

Syntax

1
CREATE VIEW <뷰이름> AS (QUERY)

Example

  • 국가코드와 국가이름이 있는 뷰

    1
    2
    3
    CREATE VIEW code_name AS
    SELECT code, name
    FROM country
  • city 테이블에 국가 이름 추가

    1
    2
    3
    4
    SELECT *
    FROM city
    JOIN code_name
    ON city.countrycode = code_name.code

INDEX

Explain

  • 정의 : 테이블에서 데이터를 검색할때 빠르게 찾을수 있도록 해주는 기능입니다.

  • 장점 : 검색속도가 빨라짐

  • 단점 : 저장공간을 10% 정도 더 많이 차지 INSERT, DELETE, UPDATE 할때 속도가 느려짐

  • 사용법 : SELECT시 WHERE 절에 들어가는 컬럼을 Index로 설정하면 좋다.

  • 내부 작동 원리 (B-Tree)

    • 루트노드와 리프노드의 계층적 구조로 루트노드를 이용하여 리프노드에서의 데이터를 빠르게 찾을수 있는 자료구조 알고리즘.

Syntax

1
CREATE INDEX <인덱스 이름> AS <테이블 이름(필드 이름)>

Example

  • employees 데이터 베이스에서 실행

  • 실행계획을 확인하여 인덱스를 사용하는지 확인

    1
    2
    3
    4
    5
    6
    7
    8
    9
    EXPLAIN
    SELECT *
    FROM salaries
    WHERE from_date < "1986-01-01"

    EXPLAIN
    SELECT *
    FROM salaries
    WHERE to_date < "1986-01-01"
  • 인덱스 확인

    1
    SHOW INDEX FROM salaries;
  • 인덱스 생성

    1
    2
    3
    4
    5
    CREATE INDEX fdate
    ON salaries (from_date)

    CREATE INDEX tdate
    ON salaries (to_date)
  • 여러개의 컬럼을 가지는 인덱스 생성도 가능

    1
    2
    CREATE INDEX ftdate
    ON salaries (from_date, to_date)
  • 인덱스 삭제

    1
    2
    3
    4
    5
    6
    7
    8
    DROP INDEX fdate
    ON salaries

    DROP INDEX tdate
    ON salaries

    DROP INDEX ftdate
    ON salaries
  • 여러개의 컬럼을 조건으로 WHERE절에 사용하는 경우 인덱스 확인

  • 인덱스가 하나의 컬럼에 있을때 보다 둘다 있을때가 더 빠름

    1
    2
    3
    4
    EXPLAIN
    SELECT *
    FROM salaries
    WHERE from_date < "1986-01-01" AND to_date < "1986-01-01"

TRIGGER

정의 : 특정 테이블을 감시하고 있다가 설정된 조건의 쿼리가 실행되면 미리 지정한 쿼리가 자동으로 실행되도록하는 방법

Syntax

1
2
3
4
5
6
create trigger {trigger name}
{before | after} {insert | update |delete}
on <table name> for each row
begin
<excute query>
end

Example

  • database 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table data1 (
    id varchar(20),
    msg varchar(50) not null
    );

    create table data_backup (
    id varchar(20),
    msg varchar(50) not null
    );
  • Trigger 생성

    1
    2
    3
    4
    5
    6
    7
    create trigger backup
    before delete on data1
    for each row
    begin
    insert into data_backup(id, msg)
    values(old.id, old.msg);
    end

Comment and share

Sub Query

sub query는 query 문 안에 있는 query를 의미합니다.

SELECT절, FROM절, WHERE 등에 사용이 가능합니다.

Example

  • 전체 나라수, 전체 도시수, 전체 언어수를 출력 ( SELECT 절에 사용 )

    SUB QUERY 사용시 JOIN TABLE 크기를 줄일 수 있다

    1
    2
    3
    4
    5
    SELECT
    (SELECT count(name) FROM city) AS total_city,
    (SELECT count(name) FROM country) AS total_country,
    (SELECT count(DISTINCT(Language)) FROM countrylanguage) AS total_language
    FROM DUAL
  • 800만 이상되는 도시의 국가코드, 이름, 도시인구수를 출력 ( FROM 절에 사용 )

    • SUB QUERY를 안 쓸때

      • city table row : 4079
      • coutnry table row : 239
      • JOIN TABLE : 4079 * 239
        1
        2
        3
        4
        5
        6
        7
        8
        SELECT *
        FROM
        city
        JOIN
        (SELECT code, name
        FROM country) AS country
        ON city.countrycode = country.code
        HAVING city.population > 8000000;
    • SUB QUERY를 쓸 때

      • city table row : 10
      • coutnry table row : 239
      • JOIN TABLE : 10 * 239
        1
        2
        3
        4
        5
        6
        7
        8
        9
        SELECT *
        FROM
        (SELECT countrycode, name, population
        FROM city
        WHERE population > 8000000) AS city
        JOIN
        (SELECT code, name
        FROM country) AS country
        ON city.countrycode = country.code;

  • 800만 이상 도시의 국가코드, 국가이름, 대통령이름을 출력( WHERE 절에 사용 )

    1
    2
    3
    4
    5
    SELECT code, name, HeadOfState
    FROM country
    WHERE code IN (
    SELECT DISTINCT(countrycode) FROM city WHERE population > 8000000
    )

Comment and share

JOIN

  • JOIN은 여러개의 테이블에서 데이터를 모아서 보여줄 때 사용됩니다.

  • JOIN에는 INNER JOIN, LEFT JOIN, RIGHT JOIN이 있습니다.

    스크린샷 2020-10-26 오후 9 18 54

MAKE TEST TABLE & DATA

  • create table & data
    1
    2
    3
    4
    5
    CREATE TABLE user (
    user_id int(11) unsigned NOT NULL AUTO_INCREMENT,
    name varchar(30) DEFAULT NULL,
    PRIMARY KEY (user_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    1
    2
    3
    4
    5
    6
    CREATE TABLE addr (
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    addr varchar(30) DEFAULT NULL,
    user_id int(11) DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT INTO user(name)
    VALUES ("jin"),
    ("po"),
    ("alice"),
    ("petter");

    INSERT INTO addr(addr, user_id)
    VALUES ("seoul", 1),
    ("pusan", 2),
    ("deajeon", 3),
    ("deagu", 5),
    ("seoul", 6);

INNER JOIN

  • 두 테이블 사이에 공통된 값이 없는 row는 출력하지 않는다.

  • 두 테이블을 합쳐 id, name, addr 출력

    1
    2
    3
    4
    SELECT id, user.name, addr.addr
    FROM user
    JOIN addr
    ON user.user_id = addr.user_id
  • world 데이터베이스에서 도시이름과 국가이름을 출력

    1
    2
    3
    4
    SELECT city.name AS country_name, country.name AS city_name
    FROM city
    JOIN country
    ON city.CountryCode = country.code
  • 아래와 같이 사용할수도 있다.

    1
    2
    3
    SELECT city.name AS country_name, country.name AS city_name
    FROM city, country
    WHERE city.CountryCode = country.code

LEFT JOIN

  • 왼쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다.

  • 두 테이블을 합쳐 id, name, addr 출력

    1
    2
    3
    4
    SELECT id, user.name, addr.addr
    FROM user
    LEFT JOIN addr
    ON user.user_id = addr.user_id

RIGHT JOIN

  • 오른쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다.

  • 두 테이블을 합쳐 id, name, addr 출력

    1
    2
    3
    4
    SELECT id, user.name, addr.addr
    FROM user
    RIGHT JOIN addr
    ON user.user_id = addr.user_id

JOIN과 DISDINCT의 사용

  • 지역과 대륙별 사용하는 언어 출력

    1
    2
    3
    4
    SELECT DISTINCT country.Region, country.continent, countrylanguage.Language
    FROM country
    JOIN countrylanguage
    ON countrylanguage.CountryCode = country.Code
  • 대륙과 지역별 사용하는 언어의 수 출력

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT sub1.region, sub1.continent, count(*) as count
    FROM (
    SELECT DISTINCT country.Region, country.continent, countrylanguage.Language
    FROM country
    JOIN countrylanguage
    ON countrylanguage.CountryCode = country.Code
    ) AS sub1
    GROUP BY sub1.region, sub1.continent

테이블 세개 조인하기

  • 국가별, 도시별, 언어의 사용율
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT country.name as country_name, city.name as city_name,
    countrylanguage.language, countrylanguage.percentage
    FROM country
    JOIN city
    ON country.code = city.countrycode
    JOIN countrylanguage
    ON country.code = countrylanguage.countrycode

    SELECT country.name as country_name, city.name as city_name,
    countrylanguage.language, countrylanguage.percentage
    FROM country, city, countrylanguage
    WHERE country.code = city.countrycode and country.code = countrylanguage.countrycode

UNION

UNION은 SELECT 문의 결과 데이터를 하나로 합쳐서 출력합니다.

컬럼의 갯수와 타입, 순서가 같아야 합니다.

UNION은 자동으로 distinct를 하여 중복을 제거해 줍니다.

중복제거를 안하고 컬럼 데이터를 합치고 싶으면 UNION ALL을 사용합니다.

또한 UNION을 이용하면 Full Outer Join을 구현할수 있습니다.

  • UNION

    • user 테이블의 name 컬럼과 addr 테이블의 addr 컬럼의 데이터를 하나로 함쳐서 출력
      1
      2
      3
      4
      5
      SELECT name
      FROM user
      UNION
      SELECT addr
      FROM addr
  • UNION ALL

    • 중복데이터를 제거하지 않고 결과 데이터 합쳐서 출력
      1
      2
      3
      4
      5
      SELECT name
      FROM user
      UNION ALL
      SELECT addr
      FROM addr
  • FULL OUTER JOIN

    • union을 이용하여 full outer join 구현
      1
      2
      3
      4
      5
      6
      7
      8
      9
      SELECT id, user.name, addr.addr
      FROM user
      LEFT JOIN addr
      ON user.user_id = addr.user_id
      UNION
      SELECT id, user.name, addr.addr
      FROM user
      RIGHT JOIN addr
      ON user.user_id = addr.user_id

Comment and share

Functions

  • CEIL, ROUND, TRUNCATE는 소수점 올림, 반올림, 버림 함수입니다.

    • CEIL

      CEIL는 실수 데이터를 올림 할 때 사용합니다.

    • 12.345를 올림하여 정수로 나타냄

      1
      SELECT CEIL(12.345)
    • 국가별 언어 사용 비율을 소수 첫번째자리에서 올림하여 정수로 나타냄

      1
      2
      SELECT CountryCode, Language, Percentage, CEIL(Percentage)
      FROM countrylanguage
    • ROUND

      ROUND는 실수데이터를 반올림 할 때 사용합니다.

      • 12.345를 소수 둘째자리까지 나타내고 소수 셋째자리에서 반올림

        1
        SELECT ROUND(12.345, 2)
      • 국가별 언어 사용 비율을 소수 첫번째자리에서 반올림하여 정수로 나타냄

        1
        2
        SELECT CountryCode, Language, Percentage, ROUND(Percentage, 0)
        FROM countrylanguage
    • TRUNCATE

      TRUNCATE는 실수 데이터를 버림 할 때 사용합니다.

      • 12.345를 소수 둘째자리까지 나타내고 소수 셋째자리에서 버림

        1
        SELECT TRUNCATE(12.345, 2)
      • 국가별 언어 사용 비율을 소수 첫번째자리에서 버림하여 정수로 나타냄

        1
        2
        SELECT CountryCode, Language, Percentage, TRUNCATE(Percentage, 0)
        FROM countrylanguage
        1
        2
        3
        SELECT CountryCode, Language, Percentage, ROUND(Percentage, 0),
        TRUNCATE(Percentage, 0)
        FROM countrylanguage
  • DATE_FORMAT

    DATE_FORMAT은 날짜 데이터에 대한 포멧을 바꿔줍니다.

    https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

    • sakila 데이터 베이스에서 월별 총 수입
      1
      2
      3
      SELECT DATE_FORMAT(payment_date, "%Y-%m") AS monthly, SUM(amount) AS amount
      FROM payment
      GROUP BY monthly

조건문 IF, IFNULL, CASE

  • SQL에서도 다른 언어에서 처럼 조건문 사용이 가능합니다. IF, CASE 에 대해서 설명합니다.

  • IF(조건, 참, 거짓)

- 도시의 인구가 100만이 넘으면 "big city" 그렇지 않으면 "small city"를 출력하는 city_scale 컬럼을 추가
    <!--hexoPostRenderEscape:<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">name</span>, population, <span class="keyword">IF</span>(population &gt; <span class="number">1000000</span>, <span class="string">&quot;big city&quot;</span>, <span class="string">&quot;small city&quot;</span>) <span class="keyword">AS</span> city_scale</span><br><span class="line"><span class="keyword">FROM</span> city</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  • IFNULL(참, 거짓)

    • 독립년도가 없는 데이터는 0으로 출력
      1
      2
      SELECT IndepYear, IFNULL(IndepYear, 0) as IndepYear
      FROM country
  • CASE

    1
    2
    3
    4
    CASE 
    WHEN (조건1) THEN (출력1)
    WHEN (조건2) THEN (출력2)
    END AS (컬럼명)
    • 나라별로 인구가 10억 이상, 1억 이상, 1억 이하인 컬럼을 추가하여 출력
      1
      2
      3
      4
      5
      6
      7
      SELECT name, population,
      CASE
      WHEN population > 1000000000 THEN "upper 1 bilion"
      WHEN population > 100000000 THEN "upper 100 milion"
      ELSE "below 100 milion"
      END AS result
      FROM country

Comment and share

INSERT

  • 테이블 이름 뒤에 오는 컬럼이름은 생략이 가능하며 대신에 VALUES 뒤에 value 값이 순서대로 와야 합니다.

    1
    2
    INSERT INTO <table_name>(<column_name_1>, <column_name_2>, ...)
    VALUES(<value_1>, <value_2>, ...)
  • test 데이터 베이스 선택

    1
    sql> USE test;
  • user1 테이블에 user_id, name, email, age, rdate를 입력

    1
    2
    3
    4
    5
    6
    7
    INSERT INTO user1(user_id, name, email, age, rdate)
    VALUES (1, "jin", "pdj@gmail.com", 30, now()),
    (2, "peter", "peter@daum.net", 33, '2017-02-20'),
    (3, "alice", "alice@naver.com", 23, '2018-01-05'),
    (4, "po", "po@gmail.com", 43, '2002-09-16'),
    (5, "andy", "andy@gmail.com", 17, '2016-04-28'),
    (6, "jin", "jin1224@gmail.com", 33, '2013-09-02');
  • city_2 테이블 생성

    1
    2
    3
    4
    5
    6
    CREATE TABLE city_2 (
    Name VARCHAR(50),
    CountryCode CHAR(3),
    District VARCHAR(50),
    Population INT
    )
  • select 절에서 나온 결과데이터를 Insert

    1
    2
    3
    4
    INSERT INTO city_2
    SELECT Name, CountryCode, District, Population
    FROM city
    WHERE Population > 8000000;

UPDATE SET

  • 업데이트시에는 항상 select-where로 변경할 데이터를 확인하고 update 해줘야 실수를 줄일수 있습니다. 또한 limit도 함께 사용해주면 좋습니다.
1
2
3
UPDATE <table_name>
SET <column_name_1> = <value_1>, <column_name_2> = <value_2>
WHERE <condition>
  • jin 이름을 가지고 있는 사람의 나이를 20, 이메일을 pdj@daum.net으로 변경
    1
    2
    3
    sql> UPDATE user1
    SET age=20, email="pdj@daum.net"
    WHERE name="jin"

DELETE, DROP, TRUNCATE

  • 조건을 설정하여 데이터를 삭제할수 있습니다.
1
2
DELETE FROM <table_name>
WHERE <condition>
  • 2016-01-01 이전 데이터 삭제 (DML)

    1
    2
    sql> DELETE FROM user1
    WHERE rdate < "2016-01-01"
  • 테이블 구조를 남기고 모든 데이터를 삭제 (DLL)

    1
    sql> TRUNCATE FROM user1
  • 테이블 전체를 모두 삭제 (DLL)

    1
    sql> DROP FROM user1

Comment and share

Constraint : 제약조건

데이터 베이스의 테이블을 생성할때 각 컬럼은 각각의 제약조건을 갖습니다.

  • NOT NULL

    NULL 값 (비어있는 값)을 저장할수 없습니다.

  • UNIQUE

    같은 값을 저장할수 없습니다.

  • PRIMARY KEY

    • NOT NULL과 UNIQUE 의 제약조건을 동시에 만족해야 합니다.

    • 그러므로 컬럼에 비어 있는 값과 동일한 값을 저장할수 없습니다.

    • 하나의 테이블에 하나의 컬럼만 조건을 설정할수 있습니다.

  • AUTO_INCREMENT

    주로 테이블의 PRIMARY KEY 데이터를 저장할때 자동으로 숫자를 1씩 증가시켜 주는 기능으로 사용합
    니다.

  • FOREIGN KEY

    다른 테이블과 연결되는 값이 저장됩니다.

    • 테이블 수정으로 FK 설정

      1
      2
      3
      4
      alter table money
      add constraint fk_user
      foreign key (user_id) # money의 user_id
      references user (user_id); # user의 user_id
    • 테이블 생성시 FK 설정

      1
      2
      3
      4
      5
      6
      create table money(
      money_id int primary key auto_increment,
      income int,
      user_id int,
      foreign key (user_id) references user(user_id)
      );
  • ON DELETE, ON UPDATE 설정

    • 참조를 받는 데이터가 수정하거나 삭제될때 참조 하는 데이터를 설정(수정,삭제 등등)

    • CASECADE : 참조 받는 데이터가 수정, 삭제하면, 참조하는 데이터도 수정 삭제

    • SET NULL : 참조 받는 데이터가 수정 삭제하면, 참조하는 데이터는 NULL로 수정

  • DEFAULT

    데이터를 저장할때 해당 컬럼에 별도의 저장값이 없으면 DEFAULT로 설정된 값이 저장됩니다.

    1
    2
    3
    4
    5
    6
    7
    create table money(
    money_id int primary key auto_increment,
    income int,
    user_id int,
    foreign key (user_id) references user(user_id)
    on update cascade on delete set null
    );

Comment and share

DATA TYPE

데이터 베이스의 테이블을 생성할때 각 컬럼은 데이터 타입을 가집니다.

reference : https://dev.mysql.com/doc/refman/5.7/en/data-types.html

Numberic

reference : https://dev.mysql.com/doc/refman/5.7/en/numeric-types.html

  • 정수 타입 ( integer types )

    스크린샷 2020-10-26 오후 7 05 55

  • 실수 (floating-point types)

    소수점을 나타내기 위한 데이터 타입으로 아래의 두가지 데이터 타입이 있습니다.

    두가지의 데이터 타입은 데이터 저장공간의 차이가 있습니다.

    FLOAT (4byte), DOUBLE (8byte)

    또한 아래와 같이 고정 소수점 타입으로도 사용이 가능합니다.

    FLOAT(M,D), DOUBLE(M,D)

Date & Time

reference : https://dev.mysql.com/doc/refman/5.7/en/date-and-time-types.html

  • DATE

    DATE는 날짜를 저장하는 데이터 타입이며, 기본 포멧은 “년-월-일” 입니다.

  • DATETIME

    DATETIME은 날짜와 시간을 저장하는 데이터 타입이며, 기본 포멧은 “년-월-일 시:분:초” 입니다.

  • TIMESTAME

    TIMESTAME는 날짜와 시간을 저장하는 데이터 타입이며,

    DATETIME과 다른점은 날짜를 입력하지 않으면 현재 날짜와 시간을 자동으로 저장할수 있는 특징이 있습니다.

  • TIME

    TIME은 시간을 저장하는 데이터 타입이며, 기본 포멧은 “시:분:초” 입니다.

  • YEAR

    YEAR는 연도를 저장할수 있는 데이터 타입입니다.

    YEAR(2)는 2자리의 연도를 저장할수 있으며 YEAR(4)는 4자리의 연도를 저장할수 있습니다.

String

reference
https://dev.mysql.com/doc/refman/5.7/en/string-types.html

  • CHAR & VARCHAR

    스크린샷 2020-10-26 오후 7 06 06

  • TEXT

    • CHAR와 VARCHAR는 대체로 크기가 작은 문자열을 저장할때 사용되며 크기가 큰 문자열을 저장할 때는 TEXT를 사용합니다.

    • TEXT의 타입에 따라서 아래와 같이 크기를 가집니다.

      스크린샷 2020-10-26 오후 7 06 14

Comment and share

DATABASE-DDL

in DATABASE, DDL

CREATE USE ALTER DROP

USE

  • test 데이터 베이스 선택

    1
    USE test;
  • 현재 데이터 베이스 확인

    1
    SELECT DATABASE()

CREATE

  • 데이터 베이스 생성

    1
    CREATE DATABASE <database_name>;
  • test 데이터 베이스 생성

    1
    CREATE DATABASE test;
  • 테이블 생성

    1
    2
    3
    4
    5
    CREATE TABLE <table_name> (
    column_name_1 column_data_type_1 column_constraint_1,
    column_name_2 column_data_type_2 column_constraint_2,
    ...
    )
  • 제약조건이 없는 user1 테이블 생성

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE user1(
    user_id INT,
    name Varchar(20),
    email Varchar(30),
    age INT(3),
    rdate DATE
    )
  • 제약조건이 있는 user2 테이블 생성

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE user2(
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    name Varchar(20) NOT NULL,
    email Varchar(30) UNIQUE NOT NULL,
    age INT(3) DEFAULT '30',
    rdate TIMESTAMP
    )

ALTER

Database

  • 사용중인 데이터베이스의 인코딩 방식 확인

    1
    SHOW VARIABLES LIKE "character_set_database"
  • test 데이터 베이스의 문자열 인코딩을 utf8으로 변경

    1
    2
    ALTER DATABASE world CHARACTER SET = ascii
    ALTER DATABASE world CHARACTER SET = utf8

Table

  • ALTER를 이용하여 Table의 컬럼을 추가하거나 삭제하거나 수정할수 있습니다.

  • ADD

    • user2 테이블에 TEXT 데이터 타입을 갖는 tmp 컬럼을 추가

      1
      ALTER TABLE user2 ADD tmp TEXT
  • MODIFY

    • user2 테이블에 INT 데이터 타입을 갖는 tmp 컬럼으로 수정

      1
      ALTER TABLE user2 MODIFY COLUMN tmp INT
  • DROP

    • user2 테이블의 tmp 컬럼을 삭제

      1
      ALTER TABLE user2 DROP tmp

DROP

  • DATABASE

    • tmp 데이터 베이스 생성

      1
      2
      CREATE DATABASE tmp;
      SHOW DATABASES;
    • tmp 데이터 베이스 삭제

      1
      2
      DROP DATABASE tmp;
      SHOW DATABASES;
  • TABLE

    • tmp 데이터 베이스 생성

      1
      CREATE DATABASE tmp;
    • tmp 데이터 베이스 선택

      1
      USE tmp;
    • tmp 테이블 생성

      1
      CREATE TABLE tmp( id INT );
    • tmp 테이블 삭제

      1
      DROP TABLE tmp;

Comment and share

SELECT

정의 : 데이터를 검색할때 사용되는 문법

SELECT FROM

  • 기본 포멧

    SELECT <column_name_1>, <column_name_2>, ... FROM <table_name>

  • 전체 컬럼 데이터 조회

    1
    2
    sql> SELECT *
    FROM world.country
  • code, name 세개의 컬럼 데이터 조회

    1
    sql> SELECT code, name FROM world.country
  • 데이터 베이스 선택 : FROM 절에 world. 을 사용할 필요가 없다.

    1
    2
    sql> USE world;
    sql> SELECT * FROM country
  • alias : 컬럼의 이름을 변경할수 있습니다.

    1
    sql> SELECT code as country_code, name as country_name FROM country
  • 데이터 베이스, 테이블, 컬럼 리스트 확인

    1
    2
    3
    sql> SHOW DATABASES;
    sql> SHOW TABLES;
    sql> DESC city;

WHERE

특정 조건을 주어 데이터를 검색하는데 사용되는 문법

  • 비교연산 - 인구가 1억이 넘는 국가를 출력

    1
    SELECT * FROM country WHERE Population >= 100000000
  • 논리 연산 : AND, OR - 인구가 7000만에서 1억인 국가를 출력

    1
    2
    SELECT * FROM country
    WHERE Population >= 70000000 AND Population <= 100000000
  • 범위 연산 : BETWEEN

    • 인구가 7000만에서 1억인 국가를 출력

      1
      2
      SELECT * FROM country
      WHERE Population BETWEEN 70000000 AND 100000000
    • 아시아와 아프리카 대륙의 국가 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent = "Asia" OR Continent = "Africa"
  • 특정 조건을 포함 : IN, NOT IN

    • 아시아와 아프리카 대륙의 국가 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent IN ("Asia", "Africa")
    • 아시아와 아프리카 대륙의 국가가 아닌 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent NOT IN ("Asia", "Africa")
    • 아시아와 아프리카 대륙의 국가가 아닌 데이터를 출력 (논리연산 사용)

      1
      2
      SELECT * FROM country
      WHERE Continent != "Asia" AND Continent != "Africa"
  • 특정 문자열이 포함된 데이터 출력 : LIKE

    • 정부형태에 Republic이 포함된 데이터 출력
      1
      2
      SELECT * FROM country
      WHERE GovernmentForm LIKE "%Republic%"

ORDER BY

특정 컬럼의 값으로 데이터 정렬에 사용되는 문법

  • 오름차순 인구순으로 국가의 리스트를 출력 (ASC는 생략이 가능)

    1
    SELECT * FROM country ORDER BY population ASC
  • 내림차수 인구순으로 국가의 리스트를 출력

    1
    SELECT * FROM country ORDER BY population DESC
  • 국가 코드를 알파벳 순으로 정렬하고 같은 국가 코드를 가지면 인구순으로 내림차순으로 정렬

    1
    SELECT * FROM city ORDER BY CountryCode ASC, Population DESC

LIMIT

LIMIT은 조회하는 데이터의 수를 제한할수 있습니다.

  • 인구가 많은 상위 5개 국가 데이터를 출력

    1
    SELECT * FROM country ORDER BY population DESC LIMIT 5
  • 인구가 많은 상위 6위 ~ 8위의 3개 국가 데이터를 출력

    1
    SELECT * FROM country ORDER BY population DESC LIMIT 5, 3

GRUOP BY, HAVING

GROUP BY는 여러개의 동일한 데이터를 가지는 특정 컬럼을 합쳐주는 역할을 하는 명령입니다.

SQL에는 아래와 같은 그룹함수가 있습니다.
COUNT, MAX, MIN, AVG, VAR_SAMP, STDDEV

  • COUNT

    • city 테이블의 CountryCode를 묶고 각 코드마다 몇개의 데이터가 있는지 확인
      1
      2
      sql> SELECT CountryCode, COUNT(CountryCode) FROM city
      GROUP BY CountryCode
    • countrylanguage 테이블에서 전체 언어가 몇개 있는지 구하시오.
      • DISTINCT 중복을 제거해주는 문법
        1
        2
        sql > SELECT COUNT(DISTINCT(Language)) as language_count
        FROM countrylanguage
  • MAX

    • 대륙별 인구수와 GNP 최대 값을 조회
      1
      2
      3
      4
      5
      6
      7
      8
              sql> SELECT continent, MAX(Population) as Population, MAX(GNP) as GNP
      FROM country GROUP BY continent
      ```
      - MIN
      - 대륙별 인구수와 GNP 최소 값을 조회 (GNP와 인구수가 0이 아닌 데이터 중에서)
      ```
      sql> SELECT continent, MIN(Population) as Population, MIN(GNP) as GNP FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
  • SUM

    • 대륙별 총 인구수와 총 GNP
      1
      2
      3
      sql> SELECT continent, SUM(Population) as Population, SUM(GNP) as GNP
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
  • AVG

    • 대륙별 평균 인구수와 평균 GNP 결과를 인구수로 내림차순 정렬
      1
      2
      3
      4
      sql> SELECT continent, AVG(Population) as Population, AVG(GNP) as GNP
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
      ORDER BY Population DESC
  • HAVING

    GROUP BY에서 반환되는 결과에 조건을 줄수 있습니다.

    • 대륙별 전체인구를 구하고 5억이상인 대륙만 조회

      1
      2
      3
      sql> SELECT continent, SUM(Population) as Population FROM country
      GROUP BY continent
      HAVING Population > 500000000
    • 대륙별 평균 인구수, 평균 GNP, 1인당 GNP한 결과를 1인당 GNP가 0.01 이상인 데이터를 조회하고 1인당 GNP를 내림차순으로 정렬

      1
      2
      3
      4
      5
      sql> SELECT continent, AVG(Population) as Population, AVG(GNP) as GNP, AVG(GNP) / AVG(Population) * 1000 as AVG
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
      HAVING AVG > 0.01
      ORDER BY AVG DESC
  • WITH ROLLUP

    • 고객과 스탭별 매출과 고객별 매출의 총합을 출력
      1
      2
      sql> SELECT customer_id, staff_id, SUM(amount) as amount FROM payment
      GROUP BY customer_id, staff_id WITH ROLLUP

Comment and share

MYSQL 설치 (AWS에서 작업)

  1. AWS EC2 인스턴스에 Ubuntu OS에 MySQL 5.7.x 버전 설치

  2. EC2 인스턴스 생성

    • t2.micro
    • Ubuntu 18.04 버전
    • 보안그룹에서 3306 포트 추가
  3. EC2 인스턴스에 접속

  4. pem 파일 400 권한으로 변경

    1
    $ ssh -i (PEM File location) ubuntu@(AWS Public IP)
  5. apt-get 업데이트

    1
    2
    $ sudo apt-get update -y 
    $ sudo apt-get upgrade -y
  6. MySQL Server 설치

    1
    $ sudo apt-get install -y mysql-server mysql-client
  7. MySQL secure 설정

    1
    2
    3
    4
    5
    6
    $ sudo mysql_secure_installation 
    Would you like to setup VALIDATE PASSWORD plugin? N
    New password: rada
    Re-enter new password: rada Remove anonymous users? Y
    Disallow root login remotely? N
    Remove test database and access to it? Reload privilege tables now? Y
  8. MySQL 패스워드 설정

    1
    2
    3
    4
    5
    6
    $ sudo mysql
    mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITHmysql_native_password BY 'rada';
    mysql> FLUSH PRIVILEGES;
    mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
    mysql> exit
  9. 설정한 패스워드를 입력하여 접속

    1
    2
    $ mysql -u root -p  
    Enter password: rada
  10. 외부접속 설정

    1
    $ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    • bind-address를 127.0.0.1을 0.0.0.0 으로 변경

      bind-address = 0.0.0.0 (모든 IP에서 접속가능)

  11. 외부접속 패스워드 설정

    1
    mysql> grant all privileges on *.* to root@'%' identified by 'rada';
  12. 서버 시작 종료 상태 확인

    1
    2
    3
    4
    $ sudo systemctl start mysql.service
    $ sudo systemctl stop mysql.service
    $ sudo systemctl restart mysql.service
    $ sudo systemctl status mysql.service
  13. 설정 후 서버 재시작으로 설정 내용 적용

    1
    $ sudo systemctl restart mysql.service
  14. password 변경 : rada로 패스워드를 변경하는 경우

    1
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rada';

샘플 데이터 추가 (Local에서 작업)

  1. 서버로 sql 파일을 전송

    1
    $ scp -i ~/.ssh/rada.pem ~/Desktop/sql/* ubuntu@15.164.231.87:~/
  2. 데이터 베이스 생성

    1
    2
    3
    4
    5
    $ mysql -u root -p
    sql> create database world;
    sql> create database sakila;
    sql> create database employees;
    sql> quit
  3. 데이터 베이스에 데이터 추가

    1
    2
    3
    4
    $ mysql -u root -p world < world.sql
    $ mysql -u root -p sakila < sakila-schema.sql
    $ mysql -u root -p sakila < sakila-data.sql
    $ mysql -u root -p employees < employees.sql

Mysql Workbench 사용법

Comment and share

  • page 1 of 1

Yechan Kim

author.bio


author.job