๐Ÿ“SQL ๊ธฐ๋ณธ ๋‹ค์ง€๊ธฐ(Insert,Update,Delete,Join)

Umji Youยท2021๋…„ 8์›” 16์ผ

MySQL

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

๐Ÿ“9์ผ์ฐจ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹ค์Šต

1. MySQL์—์„œ ์ง€์›ํ•˜๋Š” ์ปฌ๋Ÿผ ํƒ€์ž…

  • Numeric Type
    • INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
    • DECIMAL, NUMERIC
    • FLOAT, DOUBLE, BIT
  • Date and Time Type
    • DATE, DATETIME, TIMESTAMP,TIME, YEAR
  • String Type
    • CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, SET
  • JSON Type
    • ๋‹ค์–‘ํ•œ JSON ์กฐ์ž‘ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•จ
  • Spatial Type
    • ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์ค‘์‹ฌ์œผ๋กœํ•œ ์œ„์น˜ ๊ด€๋ จ ํƒ€์ž…

1. INSERT,DELETE,UPDATE

1๏ธโƒฃINSERT

INSERT INTO ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ• 2๊ฐ€์ง€
-- 1. ํ•„๋“œ ์ด๋ฆ„์„ ๋„ฃ์–ด์ค€๋‹ค.
INSERT INTO ํ…Œ์ด๋ธ”์ด๋ฆ„(ํ•„๋“œ์ด๋ฆ„1, ํ•„๋“œ์ด๋ฆ„2, ํ•„๋“œ์ด๋ฆ„3, ...) VALUES (๋ฐ์ดํ„ฐ๊ฐ’1, ๋ฐ์ดํ„ฐ๊ฐ’2, ๋ฐ์ดํ„ฐ๊ฐ’3, ...)

-- 2. ํ•„๋“œ ์ด๋ฆ„์„ ์ƒ๋žต.
INSERT INTO ํ…Œ์ด๋ธ”์ด๋ฆ„
   VALUES (๋ฐ์ดํ„ฐ๊ฐ’1, ๋ฐ์ดํ„ฐ๊ฐ’2, ๋ฐ์ดํ„ฐ๊ฐ’3, ...)
--  ํ•„๋“œ์˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ์™€ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ํ•„๋“œ์˜ ๊ฐ’์ด ์ž๋™ ๋Œ€์ž…

2์˜ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • NULL์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋œ ํ•„๋“œ
  • DEFAULT ์ œ์•ฝ ์กฐ๊ฑด์ด ์„ค์ •๋œ ํ•„๋“œ
  • AUTO_INCREMENT ํ‚ค์›Œ๋“œ๊ฐ€ ์„ค์ •๋œ ํ•„๋“œ

  • 2๊ฐ€์ง€ ํ…Œ์ด๋ธ”๋กœ ์‹ค์Šต
-- prod.vital ์ƒ์„ฑ 
create table prod.vital(
	user_id int not null,
    vital_id int primary key,
    date timestamp,
    weight int not null    
);

-- prod.alert ์ƒ์„ฑ 
create table prod.alert(
	alert_id int primary key,
    vital_id int,
    alert_type varchar(32),
    date timestamp,
    user_id int     
);
-- INSERT ์˜ˆ์‹œ
insert into prod.vital(user_id,vital_id,date,weight) values(100,4,'2021-01-01',100);

INSERT INTO prod.alert VALUES(1, 4, 'WeightIncrease', '2020-01-02', 101);
INSERT INTO prod.alert VALUES(2, NULL, 'MissingVital', '2020-01-04', 100);
INSERT INTO prod.alert VALUES(3, NULL, 'MissingVital', '2020-01-04', 101);


SELECT * FROM prod.alert WHERE vital_id = NULL; -- = ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.  
SELECT * FROM prod.alert WHERE vital_id IS NULL; -- is NULL ๋กœ ๋น„๊ตํ•ด์•ผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

SELECT * FROM prod.alert WHERE vital_id != NULL; -- != ๋Š” null ๋กœ ๋น„๊ต๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
SELECT * FROM prod.alert WHERE vital_id IS NOT NULL; 

2๏ธโƒฃDELETE

์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ ํ˜น์€ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์‚ญ์ œํ•œ๋‹ค.

  • DELETE FROM vs. TRUNCATE
    • ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
    • TRUNCATE์€ ์กฐ๊ฑด์—†์ด ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ. ์†๋„๊ฐ€ ๋น ๋ฅธ ๋Œ€์‹  ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ์‹œ ๋กค๋ฐฑ(rollback) ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
    • TRUNCATE๋Š” WHERE, ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • TRUNCATE๋Š” ์ „์ฒด ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ ์‚ญ์ œ์‹œ์—๋Š” ์—ฌ๋Ÿฌ๋ชจ๋กœ ์œ ๋ฆฌํ•˜๋‹ค.
  • DELETE๋ฅผ ์‹คํ–‰ํ•ด๋„ ํ…Œ์ด๋ธ”์€ ๋‚จ์•„์žˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
-- WHERE ์ ˆ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ์„ ์‚ญ์ œ
DELETE FROM ํ…Œ์ด๋ธ”์ด๋ฆ„
WHERE ํ•„๋“œ์ด๋ฆ„=๋ฐ์ดํ„ฐ๊ฐ’;

-- ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์‚ญ์ œ
DELETE FROM ํ…Œ์ด๋ธ”์ด๋ฆ„;
-- DELETE ์˜ˆ์‹œ
SELECT * FROM prod.vital;
DELETE FROM prod.vital WHERE weight <= 0;
DELETE FROM prod.vital WHERE vital_id = 5;
SELECT * FROM prod.vital;
DELETE FROM prod.vital;
SELECT * FROM prod.vital;

3๏ธโƒฃUPDATE

์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”์—์„œ ํŠน์ • ๋ ˆ์ฝ”๋“œ(๋“ค)์˜ ํ•„๋“œ ๊ฐ’ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
UPDATE ํ…Œ์ด๋ธ”์ด๋ฆ„
SET ํ•„๋“œ์ด๋ฆ„1=๋ฐ์ดํ„ฐ๊ฐ’1, ํ•„๋“œ์ด๋ฆ„2=๋ฐ์ดํ„ฐ๊ฐ’2, ...
WHERE ํ•„๋“œ์ด๋ฆ„=๋ฐ์ดํ„ฐ๊ฐ’
-- UPDATE ์˜ˆ์‹œ
update prod.vital set weight=1000 where vital_id = 4;
-- vital_id๊ฐ€ 4์ธ ๊ฐ’์˜ weight ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค.

2. JOIN

JOIN์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•ด ์ค€๋‹ค.

์ฃผ๋กœ SELECT๋ฌธ๊ณผ ํ•จ๊ป˜ ์“ฐ์ธ๋‹ค.

โš ๏ธJOIN์‹œ ๊ณ ๋ คํ•ด์•ผ ํ• ์ 

  • ๋จผ์ € ์ค‘๋ณต ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๊ณ  Primary Key์˜ uniqueness๊ฐ€ ๋ณด์žฅ๋จ์„ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.
  • ์กฐ์ธํ•˜๋Š” ํ…Œ์ด๋ธ”๋“ค๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•œ๋‹ค.
    • One to one
      • ์™„์ „ํ•œ one to one: session & session_channel
      • ํ•œ์ชฝ์ด ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๋˜๋Š” one to one
    • One to many? (order vs order_items)
      • ์ด ๊ฒฝ์šฐ ์ค‘๋ณต์ด ๋” ํฐ ๋ฌธ์ œ๋จ -> ์ฆํญ!!
    • Many to one?
      • ๋ฐฉํ–ฅ๋งŒ ๋ฐ”๊พธ๋ฉด One to many๋กœ ๋ณด๋Š” ๊ฒƒ๊ณผ ์‚ฌ์‹ค์ƒ ๋™์ผ.
    • Many to many?
      • ์ด๋Š” one to one์ด๋‚˜ one to many๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ณ€ํ™˜ํ•˜์—ฌ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์ด ๋œ ์œ„ํ—˜ํ•˜๋‹ค.
    • ์–ด๋А ํ…Œ์ด๋ธ”์„ ๋ฒ ์ด์Šค๋กœ ์žก์„์ง€ (From์— ์‚ฌ์šฉํ• ์ง€) ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ’ฟJOIN์˜ ์ข…๋ฅ˜

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
    • MySQL์€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ LEFT JOIN๊ณผ RIGHT JOIN์„ UNIONํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Œ
  • SELF JOIN
  • CROSS JOIN

image

1๏ธโƒฃINNER JOIN

INNER JOIN์€ ON ์ ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ON ์ ˆ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ๋งค์น˜๊ฐ€ ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋“ค๋งŒ ๋ฆฌํ„ดํ•œ๋‹ค.

์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ์ฑ„์›Œ์ง„ ์ƒํƒœ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.

  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
FROM ์ฒซ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ด๋ฆ„
INNER JOIN ๋‘๋ฒˆ์งธํ…Œ์ด๋ธ”์ด๋ฆ„
ON ์กฐ๊ฑด

FROM ์ฒซ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ด๋ฆ„
JOIN ๋‘๋ฒˆ์งธํ…Œ์ด๋ธ”์ด๋ฆ„
ON ์กฐ๊ฑด
  • ON ์ ˆ์—์„œ๋Š” WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MySQL์—์„œ๋Š” JOIN, INNER JOIN, CROSS JOIN์ด ๋ชจ๋‘ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
-- inner join
select * from prod.vital v
join prod.alert a on a.vital_id = v.vital_id;
 -- ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ๋“ค๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค. (๊ณตํ†ต๋œ ๋ถ€๋ถ„)

2๏ธโƒฃLEFT JOIN

LEFT JOIN์€ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ, ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ์กฐํ•ฉํ•˜๋Š” JOIN์ด๋‹ค.

์™ผ์ชฝ ํ…Œ์ด๋ธ”(Base)์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋“ค์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ๋Š” ์™ผ์ชฝ ๋ ˆ์ฝ”๋“œ์™€ ๋งค์นญ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฑ„์›Œ์ง„ ์ƒํƒœ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.

  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
FROM ์ฒซ๋ฒˆ์งธํ…Œ์ด๋ธ”์ด๋ฆ„
LEFT JOIN ๋‘๋ฒˆ์งธํ…Œ์ด๋ธ”์ด๋ฆ„
ON ์กฐ๊ฑด
-- left join
select * from prod.vital v
left join prod.alert a on a.vital_id = v.vital_id; -- inner์™€์˜ ์ฐจ์ด์ ์€ ์˜ค๋ฅธ์ชฝ์— ํ•ด๋‹นํ•˜๋Š” ์ชฝ๋“ค์€ null ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ ธ์„œ ๋‚˜์˜จ๋‹ค.

3๏ธโƒฃFULL JOIN

์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋“ค์„ ๋ฆฌํ„ดํ•จ

๋งค์นญ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์–‘์ชฝ ํ…Œ์ด๋ธ”๋“ค์˜ ๋ชจ๋“  ํ•„๋“œ๋“ค์ด ์ฑ„์›Œ์ง„ ์ƒํƒœ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ
-- outter join => ์ด 6๊ฐœ์˜ ๊ฐ’์„ return  ํ•œ๋‹ค.
select * from prod.vital v
left join prod.alert a on a.vital_id = v.vital_id
union -- union all ์„ ํ•˜๊ฒŒ๋˜๋ฉด ์ค‘๋ณต๋˜๋Š”๊ฒƒ ๊นŒ์ง€ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค. 
select * from prod.vital v
right join prod.alert a on a.vital_id = v.vital_id; 
  • ๊ฒฐ๊ณผ
    แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-08-16 แ„‹แ…ฉแ„’แ…ฎ 4 22 25

4๏ธโƒฃCROSS JOIN

์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋“ค์˜ ์กฐํ•ฉ์„ ๋ฆฌํ„ดํ•จ

  • ์ฝ”๋“œ ์˜ˆ์‹œ
-- cross join => ๊ฐ๊ฐ 3, 4๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค. (3*4 = 12 ๊ฐœ) 
select * from prod.vital v cross join prod.alert a;
  • ๊ฒฐ๊ณผ
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-08-16 แ„‹แ…ฉแ„’แ…ฎ 4 25 03

5๏ธโƒฃSELF JOIN

๋™์ผํ•œ ํ…Œ์ด๋ธ”์„ alias(๋ณ„๋ช…)๋ฅผ ๋‹ฌ๋ฆฌํ•ด์„œ ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•œ๋‹ค.

-- self join 
select * from prod.vital v
join prod.vital v2 on v.vital_id = v2.vital_id;
  • ๊ฒฐ๊ณผ
    • ๊ฐ™์€ ๊ฐ’์„ ๋‘๋ฒˆ ์ถœ๋ ฅํ•œ๋‹ค.(๊ฐ™์€ ํ…Œ์ด๋ธ”)
profile
๊พธ์ค€ํ•œ ๊ธฐ๋ก์„ ํ•˜์ž

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