[DATABASE] DML

์„ฑ์žฅ์ผ๊ธฐยท2024๋…„ 7์›” 2์ผ

[SWCAMP] DB

๋ชฉ๋ก ๋ณด๊ธฐ
5/14

DML(Data Manipulation Language)

๐Ÿ’ก ๋ฐ์ดํ„ฐ ์กฐ์ž‘์–ธ์–ด, ํ…Œ์ด๋ธ”์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š”(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š”) SQL์˜ ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

INSERT

  • ์ƒˆ๋กœ์šด ํ–‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

  • ํ…Œ์ด๋ธ”์˜ ํ–‰์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.

    INSERT 
      INTO tbl_menu
    VALUES 
    (
      NULL, '๋ฐ”๋‚˜๋‚˜ํ•ด์žฅ๊ตญ'
    , 8500, 4
    , 'Y'
    );

    ์‹คํ–‰๊ฒฐ๊ณผ

  • NULL ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ(NULLABLE) ์ปฌ๋Ÿผ์ด๋‚˜ AUTO_INCREMENT๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ์„ ์ œ์™ธํ•˜๊ณ  INSERTํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์„œ INSERT ๊ฐ€๋Šฅํ•˜๋‹ค.(default ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด default๊ฐ’์ด ๋“ค์–ด๊ฐ)

    ์‹คํ–‰๊ฒฐ๊ณผ

    INSERT 
      INTO tbl_menu
    (
      menu_name, menu_price
    , category_code, orderable_status
    )
    VALUES 
    (
      '์ดˆ์ฝœ๋ฆฟ์ฃฝ', 6500
    , 7, 'Y'
    );

  • ์ปฌ๋Ÿผ์„ ๋ช…์‹œํ•˜๋ฉด INSERT ์‹œ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    INSERT 
      INTO tbl_menu
    (orderable_status, menu_price, menu_name, category_code)
    VALUES 
    ('Y', 5500, 'ํŒŒ์ธ์• ํ”Œํƒ•', 4);

    ์‹คํ–‰๊ฒฐ๊ณผ

SELECT * FROM tbl_menu;

์‹คํ–‰๊ฒฐ๊ณผ

  • MULTI INSERT
    INSERT 
      INTO tbl_menu 
    VALUES 
    (null, '์ฐธ์น˜๋ง›์•„์ด์Šคํฌ๋ฆผ', 1700, 12, 'Y'),
    (null, '๋ฉธ์น˜๋ง›์•„์ด์Šคํฌ๋ฆผ', 1500, 11, 'Y'),
    (null, '์†Œ์‹œ์ง€๋ง›์ปคํ”ผ', 2500, 8, 'Y');

    ์‹คํ–‰๊ฒฐ๊ณผ

UPDATE

  • ํ…Œ์ด๋ธ”์— ๊ธฐ๋ก๋œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.
  • ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํ–‰ ๊ฐฏ์ˆ˜๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.
    SELECT
           menu_code
         , category_code
      FROM tbl_menu
     WHERE menu_name = 'ํŒŒ์ธ์• ํ”Œํƒ•';

    ์‹คํ–‰๊ฒฐ๊ณผ

UPDATE tbl_menu
   SET category_code = 7
     , menu_name = '๋”ธ๊ธฐ๋ง›๋ถ•์–ด๋นต'
 WHERE menu_code = 24;

์‹คํ–‰๊ฒฐ๊ณผ

  • SUBQUERY๋ฅผ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋‹ค๋งŒ MySQL์€ Oracle๊ณผ ๋‹ฌ๋ฆฌ update๋‚˜ delete ์‹œ ์ž๊ธฐ ์ž์‹  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ ์‹œ 1093 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    UPDATE tbl_menu
       SET category_code = 6
     WHERE menu_code = (SELECT menu_code
                          FROM tbl_menu 
                         WHERE menu_name = 'ํŒŒ์ธ์• ํ”Œํƒ•');

    ์‹คํ–‰๊ฒฐ๊ณผ

DELETE

  • ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์‚ญ์ œํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

  • ํ…Œ์ด๋ธ”์˜ ํ–‰์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

  • LIMIT์„ ํ™œ์šฉํ•œ ํ–‰ ์‚ญ์ œ(offset ์ง€์ •์€ ์•ˆ๋จ)

    DELETE FROM tbl_menu
    ORDER BY menu_price
    LIMIT 2;

    ์‹คํ–‰๊ฒฐ๊ณผ

  • WHERE์ ˆ์„ ํ™œ์šฉํ•œ ๋‹จ์ผ ํ–‰ ์‚ญ์ œ

    DELETE
      FROM tbl_menu
     WHERE menu_code = 24;

    ์‹คํ–‰๊ฒฐ๊ณผ

  • ํ•ด๋‹น ํ…Œ์ด๋ธ” ์ „์ฒด ํ–‰ ์‚ญ์ œ

    DELETE FROM tbl_menu;
    
    -- (๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ์•ˆ ๋„์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด)
    DELETE FROM tbl_menu WHERE 1 = 1;

    ์‹คํ–‰๊ฒฐ๊ณผ

REPLACE

  • INSERT ์‹œ PRIMARY KEY ๋˜๋Š” UNIQUE KEY๊ฐ€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
  • REPLACE๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.
    -- INSERT INTO tbl_menu VALUES (17, '์ฐธ๊ธฐ๋ฆ„์†Œ์ฃผ', 5000, 10, 'Y'); -- ์—๋Ÿฌ ๋ฐœ์ƒ
    REPLACE INTO tbl_menu VALUES (17, '์ฐธ๊ธฐ๋ฆ„์†Œ์ฃผ', 5000, 10, 'Y');

    ์‹คํ–‰๊ฒฐ๊ณผ

  • INTO๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ ํ•˜๋‹ค.
    REPLACE tbl_menu VALUES (17, '์ฐธ๊ธฐ๋ฆ„์†Œ์ฃผ', 6500, 10, 'Y');

    ์‹คํ–‰๊ฒฐ๊ณผ

  • UPDATE ์‹œ WHERE ๊ตฌ๋ฌธ ์—†์ด UPDATE๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    REPLACE tbl_menu
        SET menu_code = 2
          , menu_name = '์šฐ๋Ÿญ์ฅฌ์Šค'
          , menu_price = 2000
          , category_code = 9
          , orderable_status = 'N';

    ์‹คํ–‰๊ฒฐ๊ณผ

  • DML ์ž‘์—…์ด ๋๋‚˜๋ฉด db_script๋ฅผ ๋‹ค์‹œ ์ „์ฒด ์‹คํ–‰ํ•ด์„œ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

TRANSACTION

๐Ÿ’ก TRANSACTION์€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„์ด๋‹ค.

์‹œ์ž‘, ์ง„ํ–‰, ์ข…๋ฃŒ ๋‹จ๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋งŒ์•ฝ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑ(์‹œ์ž‘ ์ด์ „ ๋‹จ๊ณ„๋กœ ๋˜๋Œ๋ฆฌ๋Š” ์ž‘์—…)์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ œ๋Œ€๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปค๋ฐ‹(์ดํ›„ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š์Œ)์„ ์ง„ํ–‰ํ•œ๋‹ค.

MySQL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ์ปค๋ฐ‹ ์„ค์ •์ด ๋˜์–ด ์žˆ์–ด(๋กค๋ฐฑ์ด ์•ˆ๋จ). ๋กค๋ฐฑ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋™ ์ปค๋ฐ‹ ์„ค์ •์„ ํ•ด์ œํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Transaction ํ™œ์šฉ

  • MySQL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ commit์ด ์ž๋™์œผ๋กœ ๋˜๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ์กฐ์ ˆํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด autocommit ์„ค์ •์„ ๋ฐ”๊ฟ” ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • autocommit ํ™œ์„ฑํ™”

    SET autocommit = 1; 
    -- ๋˜๋Š” 
    SET autocommit = ON;

    ์‹คํ–‰๊ฒฐ๊ณผ

  • autocommit ๋น„ํ™œ์„ฑํ™”

    SET autocommit = 0; 
    -- ๋˜๋Š” 
    SET autocommit = OFF;

    ์‹คํ–‰๊ฒฐ๊ณผ

  • START TRANSACTION ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ  DML ์ž‘์—… ์ˆ˜ํ–‰ ํ›„ COMMIT ๋˜๋Š” ROLLBACK์„ ํ•˜๋ฉด ๋œ๋‹ค.

  • COMMIT ์ดํ›„์—๋Š” ROLLBACK์„ ํ•ด๋„ ROLLBACK์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

    START TRANSACTION;
    
    SELECT * FROM tbl_menu;
    INSERT INTO tbl_menu VALUES (null, '๋ฐ”๋‚˜๋‚˜ํ•ด์žฅ๊ตญ', 8500, 4, 'Y');
    UPDATE tbl_menu SET menu_name = '์ˆ˜์ •๋œ ๋ฉ”๋‰ด' WHERE menu_code = 5;
    DELETE FROM tbl_menu WHERE menu_code = 7;
    
    -- COMMIT; 
    ROLLBACK;

    ์‹คํ–‰๊ฒฐ๊ณผ

profile
์—”์ง€๋‹ˆ์–ด๋กœ์˜ ์„ฑ์žฅ์ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€