CRUD
๐๋ง์ด๊ทธ๋ ์ด์ (์๋ฏธ, ๋ช ๋ น์ด)
- ์๋ฏธ
- Django๊ฐ model์ ์๊ธด ๋ณํ๋ฅผ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ
- Migration ์คํ ๋ฐ DB ์คํค๋ง๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ช
๋ น์ด
- makemigrations
- model์ ๋ณ๊ฒฝํ ๊ฒ์ ๊ธฐ๋ฐํ ์๋ก์ด ๋ง์ด๊ทธ๋ ์ด์ (like์ค๊ณ๋)๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ
- migrate
- ๋ง์ด๊ทธ๋ ์ด์ ์ DB์ ๋ฐ์ํ๊ธฐ ์ํด ์ฌ์ฉ
- ์ค๊ณ๋๋ฅผ ์ค์ DB์ ๋ฐ์ํ๋ ๊ณผ์
- ๋ชจ๋ธ์์์ ๋ณ๊ฒฝ ์ฌํญ๋ค๊ณผ DB์ ์คํค๋ง๊ฐ ๋๊ธฐํ๋ฅผ ์ด๋ฃธ
- sqlmigrate
- ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ SQL ๊ตฌ๋ฌธ์ ๋ณด๊ธฐ ์ํด ์ฌ์ฉ
- ๋ง์ด๊ทธ๋ ์ด์ ์ด SQL ๋ฌธ์ผ๋ก ์ด๋ป๊ฒ ํด์๋์ด ๋์ํ ์ง ๋ฏธ๋ฆฌ ํ์ธ ๊ฐ๋ฅ
- showmigrations
- ํ๋ก์ ํธ ์ ์ฒด์ ๋ง์ด๊ทธ๋ ์ด์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ
- ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ๋ค์ด migrate๋๋์ง ์๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธ ํ ์ ์์
- makemigrations
๐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๋๋์ง ์๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธ ํ ์ ์์
- makemigrations
๐ฅ ์ฐธ์กฐ ๋๊ณ ์๋ ํ ์ด๋ธ์ด ์ง์์ก์ ๋, ์ฐธ๊ณ ํ๊ณ ์๋ ํ ์ด๋ธ๋ ์ง์์ง๋ ๋ช ๋ น์ด
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 ์๋ก์ดํ
์ด๋ธ์ด๋ฆ;
- table ์ด๋ฆ ๋ณ๊ฒฝ
- ํ ์ด๋ธ์ ์๋ก์ด column ์ถ๊ฐ
- 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๊ฐ์ ์์น ์ธ์๊ฐ ๋ฐ๋์ ํ์
- ์ฐธ์กฐํ๋ model class
- 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(๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค)์ ์ฉ์ด
- ์คํค๋ง(schema)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ฃ์ ๊ตฌ์กฐ, ํํ๋ฐฉ๋ฒ, ๊ด๊ณ๋ฑ ์ ๋ฐ์ ์ธ ๋ช ์ธ๋ฅผ ๊ธฐ์ ํ ๊ฒ
- DB๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋ ์ง ๊ธฐ์ , Django์ Model๊ณผ ๋น์ท
- ํ
์ด๋ธ(table)
- ์ด(์ปฌ๋ผ/ํ๋)์ ํ(๋ ์ฝ๋/๊ฐ)์ ๋ชจ๋ธ์ ์ฌ์ฉํด ์กฐ์ง๋ ๋ฐ์ดํฐ ์์๋ค์ ์งํฉ
- ์ด(column) == field
- ๊ฐ ์ด์๋ ๊ณ ์ ํ ๋ฐ์ดํฐ ํ์์ด ์ง์
- ํ(row) == record
- ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ํํ
- ๊ธฐ๋ณธํค(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;
- ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆด ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์!
- ์ฌ๋ฌ์ค๋ก ์์ฑํด๋ ;(์ธ๋ฏธ์ฝ๋ก ) ์ ๊ธฐ์ค์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์,
; ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋์ ๋ฌธ์ฅ์ ์ธ์!
- 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, ... );
- AUTOINCREMENT
๐ฅซ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, ... );
- AUTOINCREMENT
๐ฑ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๋ ๋ง
- %(percent sign)
SELECT * FROM ํ
์ด๋ธ WHERE ์ปฌ๋ผ LIKE '์์ผ๋์นด๋ํจํด';
#usersํ
์ด๋ธ์์ ๋์ด๊ฐ 20๋์ธ ์ฌ๋๋ง ์กฐํ
SELECT * FROM users WHERE age LIKE '2_';
๋๊ธ