๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/DB

DB ์ •๋ฆฌ

by DevIseo 2022. 4. 17.

CRUD

๐Ÿ•๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (์˜๋ฏธ, ๋ช…๋ น์–ด)

  • ์˜๋ฏธ
  • Django๊ฐ€ model์— ์ƒ๊ธด ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Migration ์‹คํ–‰ ๋ฐ DB ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
    • makemigrations
      • model์— ๋ณ€๊ฒฝํ•œ ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(like์„ค๊ณ„๋„)๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ
    • migrate
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ DB์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ์„ค๊ณ„๋„๋ฅผ ์‹ค์ œ DB์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •
      • ๋ชจ๋ธ์—์„œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค๊ณผ DB์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์ด๋ฃธ
    • sqlmigrate
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋Œ€ํ•œ SQL ๊ตฌ๋ฌธ์„ ๋ณด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด SQL ๋ฌธ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜์–ด ๋™์ž‘ํ• ์ง€ ๋ฏธ๋ฆฌ ํ™•์ธ ๊ฐ€๋Šฅ
    • showmigrations
      • ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ๋“ค์ด migrate๋๋Š”์ง€ ์•ˆ๋๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”ORM ํŠน์ง•

์šฐ๋ฆฌ๋Š” DB๋ฅผ ๊ฐ์ฒด๋กœ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ORM์„ ์‚ฌ์šฉ

ํ˜„๋Œ€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์š”์ ์€ ์›น ๊ฐœ๋ฐœ์˜ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ(์ƒ์‚ฐ์„ฑ)

  • ์ •์˜
    • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ ์‹œ์Šคํ…œ ๊ฐ„ (Django-SQL) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ 
  • ์žฅ์ 
    • SQL์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•ด๋„ DB์กฐ์ž‘์ด ๊ฐ€๋Šฅ
    • SQL์˜ ์ ˆ์ฐจ์  ์ ‘๊ทผ์ด ์•„๋‹Œ ๊ฐ์ฒด ์ง€ํ–ฅ์  ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋†’์€ ์ƒ์‚ฐ์„ฑ
  • ๋‹จ์ 
    • ORM ๋งŒ์œผ๋กœ ์™„์ „ํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

๐ŸŸ์ •๋ ฌ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

  • ORDER BY clause
    • ์กฐํšŒ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ •๋ ฌ
    • SELECT๋ฌธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ
    • ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์œ„ํ•œ 2๊ฐ€์ง€ KEYWORD
      • ASC - ์˜ค๋ฆ„์ฐจ์ˆœ (default)
      • DESC - ๋‚ด๋ฆผ์ฐจ์ˆœ
    SELECT * FROM ํ…Œ์ด๋ธ” ORDER BY ์ปฌ๋Ÿผ ASC;
    SELECT * FROM ํ…Œ์ด๋ธ” ORDER BY ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2 DESC;
    
    #user์—์„œ ๋‚˜์ด์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ์ƒ์œ„ 10๊ฐœ๋งŒ ์กฐํšŒํ•œ๋‹ค๋ฉด?
    SELECT * FROM users ORDER BY age ASC LIMIT 10;
    
    #๊ณ„์ขŒ ์ž”์•ก ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ํ•ด๋‹น ์œ ์ €์˜ ์„ฑ๊ณผ ์ด๋ฆ„์„ 10๊ฐœ๋งŒ ์กฐํšŒํ•œ๋‹ค๋ฉด?
    SELECT last_name, first_name FROM users ORDER BY balance DESC LIMIT 10;
    

๐ŸŒญ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

SELECT MAX(์ปฌ๋Ÿผ) FROM ํ…Œ์ด๋ธ” ์ด๋ฆ„;

#๊ณ„์ขŒ ์ž”์•ก(balance)์ด ๊ฐ€์žฅ ๋†’์€ ์‚ฌ๋žŒ๊ณผ ๊ทธ ์•ก์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด?
SELECT first_name, MAX(balance) FROM users;

๐ŸฟMigrate๋ช…๋ น์–ด

python manage.py makemigrations #migrations ํŒŒ์ผ ์ƒ์„ฑ
python manage.py showmigrations
python manage.py migrate #DB๋ฐ˜์˜(๋ชจ๋ธ๊ณผ DB์˜ ๋™๊ธฐํ™”)

python manage.py sqlmigrate app_name 0001
  • Migration ์‹คํ–‰ ๋ฐ DB ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
    • makemigrations
      • model์— ๋ณ€๊ฒฝํ•œ ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(like์„ค๊ณ„๋„)๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ
    • migrate
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ DB์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ์„ค๊ณ„๋„๋ฅผ ์‹ค์ œ DB์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •
      • ๋ชจ๋ธ์—์„œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค๊ณผ DB์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์ด๋ฃธ
    • sqlmigrate
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋Œ€ํ•œ SQL ๊ตฌ๋ฌธ์„ ๋ณด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด SQL ๋ฌธ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜์–ด ๋™์ž‘ํ• ์ง€ ๋ฏธ๋ฆฌ ํ™•์ธ ๊ฐ€๋Šฅ
    • showmigrations
      • ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ๋“ค์ด migrate๋๋Š”์ง€ ์•ˆ๋๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿฅ“ ์ฐธ์กฐ ๋˜๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์ง€์›Œ์กŒ์„ ๋•Œ, ์ฐธ๊ณ  ํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”๋„ ์ง€์›Œ์ง€๋Š” ๋ช…๋ น์–ด

class Comment(models.Model):
	article =  models.ForeignKey(Article, on_delete=models.CASCADE)

on_delete ์˜ต์…˜ ์ค‘ **CASCADE**

  • ๋ถ€๋ชจ ๊ฐ์ฒด(์ฐธ์กฐ ๋œ ๊ฐ์ฒด)๊ฐ€ ์‚ญ์ œ ๋์„ ๋•Œ ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋„ ์‚ญ์ œ

๐Ÿณํ…Œ์ด๋ธ”์„ ์ง€์šฐ๋Š” ๋ช…๋ น์–ด

DROP TABLE

DROP TABLE ํ…Œ์ด๋ธ”๋ช…;

๐Ÿง‡ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด

ALTER TABLE

ALTER TABLE ๊ธฐ์กดํ…Œ์ด๋ธ”์ด๋ฆ„ RENAME TO ์ƒˆ๋กœ์šดํ…Œ์ด๋ธ”์ด๋ฆ„;
  1. table ์ด๋ฆ„ ๋ณ€๊ฒฝ
  2. ํ…Œ์ด๋ธ”์˜ ์ƒˆ๋กœ์šด column ์ถ”๊ฐ€
  3. column์ด๋ฆ„ ์ˆ˜์ •
ALTER TABLE ํ…Œ์ด๋ธ” ์ด๋ฆ„ ADD COLUMN ์ปฌ๋Ÿผ์ด๋ฆ„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ค์ •; 
ALTER TABLE news ADD COLUMN created_at TEXT NOT NULL; -->์˜ค๋ฅ˜ ๋ฐœ์ƒ 
#์˜ค๋ฅ˜ ๋ฐœ์ƒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ 1.NOT NULL ์„ค์ •์—†์ด ์ถ”๊ฐ€, 2.๊ธฐ๋ณธ๊ฐ’ ์„ค์ • 
#1. 
ALTER TABLE news ADD COLUMN created_at TEXT;
#2
ALTER TABLE news ADD COLUMN subtitle TEXT NOT NULL DEFAULT '์†Œ์ œ๋ชฉ';

#column์ด๋ฆ„ ์ˆ˜์ •
ALTER TABLE table_name RENAME COLUMN current_name TO new_name;

๐Ÿฅž ์™ธ๋ž˜ํ‚ค์— ๋Œ€ํ•œ ์ดํ•ด

ํ•˜๋‚˜์˜ ๊ฒŒ์‹œ๊ธ€์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋Œ“๊ธ€์ด ์ž‘์„ฑ ๋  ์ˆ˜ ์žˆ์Œ

๋”ฐ๋ผ์„œ Article 1(์ฐธ์กฐ๋˜๋Š”) : Comment N(์ฐธ์กฐํ•˜๋Š”)

1:N์˜ ๊ด€๊ณ„์—์„œ N์˜ ์—ญํ• ์ด ํ•˜๋Š” ๊ณณ์ด ์™ธ๋ž˜ํ‚ค!

  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•œ ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ ์ค‘ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค
  • ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์†์„ฑ(ํ•„๋“œ) ์— ํ•ด๋‹นํ•˜๊ณ , ์ด๋Š” ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค(PK) ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋Š” ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ” ํ–‰ 1๊ฐœ์— ๋Œ€์‘
    • ์ด ๋•Œ๋ฌธ์— ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ–‰์„ ์ฐธ์กฐ ํ•  ์ˆ˜ X
  • ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ํ–‰ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๋™์ผํ•œ ํ–‰์„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Œ

ํŠน์ง•

  • ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ์œ ์ผํ•œ ๊ฐ’์„ ์ฐธ์กฐ (์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ)
  • ์™ธ๋ž˜ ํ‚ค์˜ ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ ์œ ์ผํ•œ ๊ฐ’์ด์–ด์•ผ ํ•จ!

์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์ฐธ์กฐ : ๊ฐ€๋ฆฌํ‚ค๋‹ค, ๋ฌด๊ฒฐ์„ฑ : ๋‹จ์ ์ด ์—†๋Š” ์„ฑ์งˆ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๊ณ„ ๋ชจ๋ธ์—์„œ ๊ด€๋ จ๋œ 2๊ฐœ์˜ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์ผ๊ด€์„ฑ
  • ์™ธ๋ž˜ํ‚ค๊ฐ€ ์„ ์–ธ๋œ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค ์†์„ฑ(์—ด)์˜ ๊ฐ’์€ ๊ทธ ํ…Œ์ด๋ธ”์˜ ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์œผ๋กœ ์กด์žฌ!
  • FK ๊ฐ’์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์ • ํ…Œ์ด๋ธ”์˜ PK ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ

ForeignKey field

  • 2๊ฐœ์˜ ์œ„์น˜ ์ธ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”
    1. ์ฐธ์กฐํ•˜๋Š” model class
    2. on_delete ์˜ต์…˜
  • migrate ์ž‘์—… ์‹œ ํ•„๋“œ ์ด๋ฆ„์— _id๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ด ์ด๋ฆ„์„ ๋งŒ๋“ฆ

๐Ÿž๊ทธ๋ฃน ์ง“๋Š” ๋ช…๋ น์–ด

GROUP BY

  • select๋ฌธ์˜ optional
  • ํ–‰ ์ง‘ํ•ฉ์—์„œ ์š”์•ฝ ํ–‰ ์ง‘ํ•ฉ์„ ๋งŒ๋“ฆ
  • WHERE์ ˆ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ WHERE์ ˆ ๋’ค์— ์ž‘์„ฑ
SELECT ์ปฌ๋Ÿผ1, aggregate_function(์ปฌ๋Ÿผ2) FROM ํ…Œ์ด๋ธ” GROUP BY ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2;

#users์—์„œ ๊ฐ ์„ฑ(last_name)์”จ๊ฐ€ ๋ช‡ ๋ช…์”ฉ ์žˆ๋Š”์ง€ ์กฐํšŒํ•œ๋‹ค๋ฉด?
SELECT last_name, COUNT(*) AS name_count FROM users GROUP BY last_name;

๐ŸฅDB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ป๋Š” ์žฅ์ 

  • ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ตœ์†Œํ™”
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ (์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ๋ณด์žฅ)
  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ
  • ๋ฐ์ดํ„ฐ ๋…๋ฆฝ์„ฑ (๋ฌผ๋ฆฌ์ / ๋…ผ๋ฆฌ์ )
  • ๋ฐ์ดํ„ฐ ํ‘œ์ค€ํ™”
  • ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ์œ ์ง€

๐Ÿฅจ PK (Primary Key; ๊ธฐ๋ณธํ‚ค) —2~3๋ฌธ์ œ

  • ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ ํ•จ
  • ๊ณ ์œ ํ•จ

๐ŸฅฏRDB(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค)์˜ ์šฉ์–ด

  1. ์Šคํ‚ค๋งˆ(schema)
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋ฃŒ์˜ ๊ตฌ์กฐ, ํ‘œํ˜„๋ฐฉ๋ฒ•, ๊ด€๊ณ„๋“ฑ ์ „๋ฐ˜์ ์ธ ๋ช…์„ธ๋ฅผ ๊ธฐ์ˆ ํ•œ ๊ฒƒ
    • DB๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ์ง€ ๊ธฐ์ˆ , Django์˜ Model๊ณผ ๋น„์Šท
  2. ํ…Œ์ด๋ธ”(table)
    • ์—ด(์ปฌ๋Ÿผ/ํ•„๋“œ)์™€ ํ–‰(๋ ˆ์ฝ”๋“œ/๊ฐ’)์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ์กฐ์ง๋œ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ
  3. ์—ด(column) == field
    • ๊ฐ ์—ด์—๋Š” ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ์ง€์ •
  4. ํ–‰(row) == record
    • ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ํ˜•ํƒœ
  5. ๊ธฐ๋ณธํ‚ค(Primary Key)
    • ๊ฐ ํ–‰(๋ ˆ์ฝ”๋“œ)์˜ ๊ณ ์œ  ๊ฐ’
    • ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ๋ฐ ๊ด€๊ณ„ ์„ค์ • ์‹œ ์ฃผ์š”ํ•˜๊ฒŒ ํ™œ์šฉ!

๐Ÿง€SQL ๋ถ„๋ฅ˜, ๊ฐ ๋ถ„๋ฅ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ

๋ถ„๋ฅ˜ ๊ฐœ๋… ์˜ˆ์‹œ

DDL - ๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ตฌ์กฐ(ํ…Œ์ด๋ธ”, ์Šคํ‚ค๋งˆ)๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด CREATE
DROP
ALTER
DML - ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ,์กฐํšŒ,์ˆ˜์ •,์‚ญ์ œ ๋“ฑ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด INSERT
SELECT
UPDATE
DELETE
DCL - ๋ฐ์ดํ„ฐ ์ œ์–ด ์–ธ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด GRANT
REVOKE
COMMIT
ROLLBACK
  • DML(Data Manipulation Language)
    • INSERT : ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(์ถ”๊ฐ€)
    • SELECT : ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ
    • UPDATE : ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ 
    • DELETE : ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์‚ญ์ œ

๐Ÿฅ— SQL ํŠน์ง•

SELECT * FROM examples;
  1. ์ฟผ๋ฆฌ๋ฌธ์„ ๋‚ ๋ฆด ๋•Œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ!
  2. ์—ฌ๋Ÿฌ์ค„๋กœ ์ž‘์„ฑํ•ด๋„ ;(์„ธ๋ฏธ์ฝœ๋ก ) ์„ ๊ธฐ์ค€์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

; ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์„ ์ธ์‹!

  1. DDL, DML, DCL์ด ์žˆ๋‹ค

๐Ÿฅ™ ์˜ณ์ง€ ์•Š์€ ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ?

CREATE TABLE classmates (
id INTEGER PRIMARY KEY,
name TEXTi
age INTEGER
score INTEGER
);

#1
INSERT INTO classmates VALUES (1, "ssafy" , 20, 100);
#2
INSERT INTO classmates VALUES (1, 1, 100);
#3
INSERT INTO classmates VALUES (1, "ssafy" , 0);
#4
INSERT INTO classmates VALUES ("ssafy" , 20, 0);

#4 ๋ฒˆ — ์Šคํ‚ค๋งˆ์— id๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅํ•  column๋“ค์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ž…๋ ฅ๋˜ ์ง€ ์•Š์Œ.

๋”ฐ๋ผ์„œ, VALUES์— ๊ผญ ์ ์–ด์•ผํ•จ!!

๐ŸฅชDELETE ๋ช…๋ น์–ด

DELETE FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ WHERE ์กฐ๊ฑด;

#"๊ด‘์ฃผ" ํ…Œ์ด๋ธ”์—์„œ ID๊ฐ€ ~์ธ ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ ๋ฐฉ๋ฒ•
DELETE FROM ๊ด‘์ฃผ WHERE ID=3;
  • SQLite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ id๋ฅผ ์žฌ์‚ฌ์šฉ
  • ์žฌ์‚ฌ์šฉ ์—†์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋‹ค์Œ ํ–‰ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด?
    • AUTOINCREMENT
      • SQLite๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ’์ด๋‚˜ ์ด์ „์— ์‚ญ์ œ๋œ ํ–‰์˜ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
      CREATE TABLE ํ…Œ์ด๋ธ”์ด๋ฆ„ (
      id INTEGER PRIMARY KEY AUTOINCEMENT,
      ...
      );
      

๐ŸฅซDB์ •๋ ฌ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ORDER BY clause
    • ์กฐํšŒ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ •๋ ฌ
    • SELECT๋ฌธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ
    • ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์œ„ํ•œ 2๊ฐ€์ง€ KEYWORD
      • ASC - ์˜ค๋ฆ„์ฐจ์ˆœ (default)
      • DESC - ๋‚ด๋ฆผ์ฐจ์ˆœ
    SELECT * FROM ํ…Œ์ด๋ธ” ORDER BY ์ปฌ๋Ÿผ ASC;
    SELECT * FROM ํ…Œ์ด๋ธ” ORDER BY ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2 DESC;
    
    #user์—์„œ ๋‚˜์ด์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ์ƒ์œ„ 10๊ฐœ๋งŒ ์กฐํšŒํ•œ๋‹ค๋ฉด?
    SELECT * FROM users ORDER BY age ASC LIMIT 10;
    
    #๊ณ„์ขŒ ์ž”์•ก ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ํ•ด๋‹น ์œ ์ €์˜ ์„ฑ๊ณผ ์ด๋ฆ„์„ 10๊ฐœ๋งŒ ์กฐํšŒํ•œ๋‹ค๋ฉด?
    SELECT last_name, first_name FROM users ORDER BY balance DESC LIMIT 10;
    

๐Ÿ– COUNT์™€ LIMIT์„ ์กฐํ•ฉํ•ด 1~10์ด ์žˆ์„ ๋•Œ 4,5,6๋งŒ ๋ฝ‘์•„์ฃผ๋Š” ์ฟผ๋ฆฌ

  • SELECT
    • ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ
    • SELECT๋ฌธ์€ SQLite์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋ฌธ์ด๋ฉฐ ๋‹ค์–‘ํ•œ ์ ˆ(clause)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
      • ORDER BY, DISTINCT, WHERE, LIMIT, GROUP BY...
  • LIMIT
    • ์ฟผ๋ฆฌ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ํ–‰ ์ˆ˜๋ฅผ ์ œํ•œ
    • ํŠน์ • ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด OFFSETํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • WHERE
    • ์ฟผ๋ฆฌ์—์„œ ๋ฐ˜ํ™˜๋œ ํ–‰์— ๋Œ€ํ•œ ํŠน์ • ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ง€์ •
  • SELECT DISTINCT
    • ์กฐํšŒ ๊ฒฐ๊ณผ์—์„œ ์ค‘๋ณต ํ–‰์„ ์ œ๊ฑฐ
    • DISTINCT์ ˆ์€ SELECT ํ‚ค์›Œ๋“œ ๋ฐ”๋กœ ๋’ค์— ์ž‘์„ฑํ•ด์•ผ ํ•จ
SELECT ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ... FROM ํ…Œ์ด๋ธ”์ด๋ฆ„;
#์˜ˆ์‹œ
SELECT rowid, name FROM classmates;
#์›ํ•˜๋Š” ์ˆ˜๋งŒํผ ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ
SELECT ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ... FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ LIMIT ์ˆซ์ž;
#ํŠน์ • ๋ถ€๋ถ„์—์„œ ์›ํ•˜๋Š” ์ˆ˜ ๋งŒํผ ๋ฐ์ดํ„ฐ ์กฐํšŒ
SELECT ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ... FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ LIMIT ์ˆซ์ž OFFSET ์ˆซ์ž;
  • OFFSET
    • 0๋ถ€ํ„ฐ ์‹œ์ž‘!

๐Ÿ Django ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ, DB ํ…Œ์ด๋ธ”์ด ์—†์„ ๋•Œ ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ?

  • no such table

๐ŸฅกAUTOINCREMENT์— ๋Œ€ํ•œ ์ดํ•ด

DELETE FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ WHERE ์กฐ๊ฑด;

#"๊ด‘์ฃผ" ํ…Œ์ด๋ธ”์—์„œ ID๊ฐ€ ~์ธ ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ ๋ฐฉ๋ฒ•
DELETE FROM ๊ด‘์ฃผ WHERE ID=3;
  • SQLite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ id๋ฅผ ์žฌ์‚ฌ์šฉ
  • ์žฌ์‚ฌ์šฉ ์—†์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋‹ค์Œ ํ–‰ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด?
    • AUTOINCREMENT
      • SQLite๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ’์ด๋‚˜ ์ด์ „์— ์‚ญ์ œ๋œ ํ–‰์˜ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
      CREATE TABLE ํ…Œ์ด๋ธ”์ด๋ฆ„ (
      id INTEGER PRIMARY KEY AUTOINCEMENT,
      ...
      );
      

๐ŸฑERD์— ๋Œ€ํ•œ ์ดํ•ด

+) Users๋ชจ๋ธ ์ฐธ์กฐํ•˜๊ธฐ

  • ์™œ get_user_model() ์ด ์•„๋‹Œ settings.AUTH_USER_MODEL์ผ๊นŒ? (๊ฒฐ๋ก ๋งŒ)
    • return์ด ๋‹ค๋ฆ„! 1.์€ string์ด๊ณ  2.๋Š” ๊ฐ์ฒด!

๐Ÿ›DISTINCT์— ๋Œ€ํ•œ ์ดํ•ด

  • SELECT DISTINCT
    • ์กฐํšŒ ๊ฒฐ๊ณผ์—์„œ ์ค‘๋ณต ํ–‰์„ ์ œ๊ฑฐ
    • DISTINCT์ ˆ์€ SELECT ํ‚ค์›Œ๋“œ ๋ฐ”๋กœ ๋’ค์— ์ž‘์„ฑํ•ด์•ผ ํ•จ
SELECT DISTINCT ์ปฌ๋Ÿผ FROM ํ…Œ์ด๋ธ” ์ด๋ฆ„;
#์˜ˆ์‹œ classmates ํ…Œ์ด๋ธ”์—์„œ age๊ฐ’ ์ „์ฒด๋ฅผ ์ค‘๋ณต์—†์ด ์กฐํšŒ
SELECT DISTINCT age From classmates;

 

+)LIKE operator

  • ํŒจํ„ด ์ผ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
  • SQLite๋Š” ํŒจํ„ด ๊ตฌ์„ฑ์„ ์œ„ํ•œ 2๊ฐœ์˜ wildcards๋ฅผ ์ œ๊ณต!
    • %(percent sign)
      • 0๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž
      • ์ด ์ž๋ฆฌ์— ๋ฌธ์ž์—ด์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
      • ex) 2% → 20๋Œ€ ๋งŒ์ด ์•„๋‹ˆ๋ผ 2์‚ด๋„ ํฌํ•จ
    • _(underscore)
      • ์ž„์˜์˜ ๋‹จ์ผ ๋ฌธ์ž
      • ๋ฐ˜๋“œ์‹œ ์ด ์ž๋ฆฌ์— ํ•œ ๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ!
      • ex) 2_ : 20๋Œ€ ๋งŒ
SELECT * FROM ํ…Œ์ด๋ธ” WHERE ์ปฌ๋Ÿผ LIKE '์™€์ผ๋“œ์นด๋“œํŒจํ„ด'; 

#usersํ…Œ์ด๋ธ”์—์„œ ๋‚˜์ด๊ฐ€ 20๋Œ€์ธ ์‚ฌ๋žŒ๋งŒ ์กฐํšŒ
SELECT * FROM users WHERE age LIKE '2_';

๋Œ“๊ธ€