๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL

(12)
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / Pagila ์›น์•ฑ ์ž‘์„ฑํ•˜๊ธฐ (1) ์˜ํ™”์˜ post ๋ชฉ๋ก, ์ข‹์•„์š” ๊ธฐ๋Šฅ, ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Pagila ์›น์•ฑ ์‹ค์Šต์ด๋‹ค.์‹ค์Šต ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜Express - ์„œ๋ฒ„prisma - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ตPostgresql, supabase - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณธ ํฌ์ŠคํŠธ์—์„œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€๋ถ„์€ ๊ธฐ์กด์— ์ œ๊ณต๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฑ์—”๋“œ ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ–ˆ๋‹ค ์ดˆ๊ธฐ ์„ค์ • #๊นƒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑgit init#package.json ์ดˆ๊ธฐ ํŒŒ์ผ ์ƒ์„ฑnpm init -y#prisma ์„ค์น˜npm install prisma -D#prisma ์ดˆ๊ธฐ ์„ค์ •npx prisma npx prisma init package.json์— ์ถ”๊ฐ€ "type": "module", "main": "src/index.mjs", * mjs : ECMAScript ๋ชจ๋“ˆ(ESM)..
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / ORM, Prisma, 3Tier ORMObject-Relational Mapping, ๊ฐ์ฒด์™€ ๋กœ์šฐ๋ฅผ ์—ฐ๊ฒฐ(map)ํ•ด์ฃผ๋Š” ๋„๊ตฌNode.js๋‚˜ JAVA ๊ฐ™์€ ๊ณ ์ฐจ์›(High Level) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์–ด์ค€๋‹ค. ์žฅ์ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•จDB๊ฐ€ ๋…๋ฆฝ์  ex) : postgreSQL์„ ์“ฐ๋‹ค๊ฐ€ mySQL์„ ์“ฐ๋”๋ผ๋„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ๋ณด์•ˆ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ–์ถฐ์ ธ ์žˆ์Œ. - SQL Injection : ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋˜๋Š” ์•”ํ˜ธ์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์ž…๋ ฅ ๋˜๋Š” ์–‘์‹ ํ•„๋“œ์— SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์˜ ์ทจ์•ฝ์„ฑ์„ ์•…์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ณต๊ฒฉ ์œ ํ˜•- ORM์—๋Š” ์ด๋Ÿฐ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์–ด๋А ์ •๋„๋Š” ๋ฐฉ์–ดํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Œ. (๋ฌผ๋ก  raw query๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ์˜ ๊ฒฝ์šฐ์—๋Š” ์ทจ์•ฝ์ ์ด ์žˆ์œผ๋‚˜ ์•ˆ ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค์•ผ ๋‚ซ๋‹ค!) Pris..
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / JOIN JOINํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋ฒ•-- ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฌธselect *from A____ join B on A.pk = B.fk INNER JOIN๋‘ ํ…Œ์ด๋ธ” ๊ณตํ†ต์˜ row๋ฅผ ์กฐ์ธ (๊ต์ง‘ํ•ฉ) SQL๋ฌธ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.inner join์˜ ๊ฒฝ์šฐ inner๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹คselect * from book bjoin loan l on b.call_number = l.call_numberorder by b.call_number LEFT JOIN์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ๋กœ์šฐ๋ฅผ ์กฐ์ธ. left outer join์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.inner join์—์„œ๋Š” A์˜ pk์™€ B์˜ fk์˜ ๊ต์ง‘ํ•ฉ ๋ถ€๋ถ„์ด ์„ ํƒ๋๋‹ค๋ฉด,left join์—์„œ๋Š” A๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— B์˜ fk์— ์—†๋”๋ผ๋„ A์˜ pk์— ์žˆ๋‹ค๋ฉด ํฌํ•จํ•ด..
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ •๊ทœํ™”Normalization, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์ค€์ˆ˜ํ•˜๋ฉฐ ์ด์ƒ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ •๊ทœํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐœ๋…๊ฒฐ๊ณผ1NF (์ œ1์ •๊ทœํ˜•)์ปฌ๋Ÿผ์˜ ๊ฐ’์€ ์›์ž๊ฐ’(Atomic Value)๋งŒ ๊ฐ€์ ธ์•ผ ํ•จ๋ชจ๋“  ์ปฌ๋Ÿผ์ด *์›์ž๊ฐ’์„ ๊ฐ€์ง=> ์ค‘๋ณต๋œ ์ปฌ๋Ÿผ ์ œ๊ฑฐ=> ๋‹ค์ค‘๊ฐ’ ์ œ๊ฑฐ2NF(์ œ2์ •๊ทœํ˜•)๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์† ์ œ๊ฑฐ๊ธฐ๋ณธํ‚ค์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ์ „์ฒด์— ์ข…์†๋œ ๋น„๊ธฐ๋ณธ ์†์„ฑ๋งŒ ์กด์žฌ=> ๋ณตํ•ฉํ‚ค์ผ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ข…์†์„ฑ ์ œ๊ฑฐ3NF(์ œ3์ •๊ทœํ˜•)์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์† ์ œ๊ฑฐ๋น„๊ธฐ๋ณธ ์†์„ฑ์ด ๋‹ค๋ฅธ ๋น„๊ธฐ๋ณธ ์†์„ฑ์— ์˜์กดํ•˜์ง€ ์•Š์Œ=> ์†์„ฑ ๊ฐ„ ์ข…์†์„ฑ ์ œ๊ฑฐ, ๊ฐฑ์‹  ์ด์ƒ ๋ฐฉ์ง€BCNF(๋ณด์ด์Šค-์ฝ”๋“œ ์ •๊ทœํ˜•)๊ฒฐ์ •์ž(Determinant)๊ฐ€ ํ›„๋ณดํ‚ค๋ชจ๋“  ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณดํ‚ค=>ํ›„๋ณดํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ์— ์˜ํ•ด ๊ฒฐ..
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / SQL ๊ตฌ๋ฌธ ๋ฌธ๋ฒ• SQLStructured Query Language, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์–ธ์–ดSQL์€ ANSI์™€ ISO์—์„œ ํ‘œ์ค€ํ™”๋œ ์–ธ์–ด๋กœ, ๋Œ€๋ถ€๋ถ„์˜ RDBMS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•จ DDL(Data Definition Language)๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์œ„ํ•œ ์–ธ์–ด create : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ…Œ์ด๋ธ” ๋“ฑ ์ƒ์„ฑalter : ํ…Œ์ด๋ธ” ์ˆ˜์ •drop : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ…Œ์ด๋ธ” ์‚ญ์ œtruncate : ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”rename : ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ DML(Data Manipulation Language)๋ฐ์ดํ„ฐ ์กฐํšŒ, ์กฐ์ž‘์„ ์œ„ํ•œ ์–ธ์–ดselect : ๋ฐ์ดํ„ฐ ์กฐํšŒinsert : ๋ฐ์ดํ„ฐ ์‚ฝ์ž…update : ๋ฐ์ดํ„ฐ ์ˆ˜์ •delete : ๋ฐ์ดํ„ฐ ์‚ญ์ œ DCL(Data Contr..
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / ๊ฐœ์š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคDBMS(Database Management System), ๋ฐ์ดํ„ฐ ๋ชจ์Œ์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” SW ๋ฐ์ดํ„ฐ๋ฅผ ์—„๋ฐ€ํ•˜๊ฒŒ ๊ธฐ๋กํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์ง€ํ‚ด์šฉ๋„์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‹ค ๋™์‹œ ์ ‘๊ทผ ์ด์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋… ๋„์ž… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ข…๋ฅ˜1) ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ตฌ์กฐํ™”๋œ ํ…Œ์ด๋ธ” ํ˜•์‹ : ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ €์žฅ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ : ์ •ํ˜•ํ™”๋œ ํ…Œ์ด๋ธ”๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ •ํ™•์„ฑ, ์ผ๊ด€์„ฑ, ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•จ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์— ์œ ๋ฆฌ์ข…๋ฅ˜์˜ค๋ผํด์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์šฉ RDBMS.๋Œ€๊ทœ๋ชจ ๊ธฐ์—… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์ •๋ถ€์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ ๊ณ ์„ฑ๋Šฅ, ๊ณ ๊ฐ€์šฉ์„ฑ, ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จMSSQLMicrosoft์—์„œ ๊ฐœ๋ฐœํ•œ R..
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL๋ฌธ LV. 3 (2) *Oracle ๊ธฐ์ค€ 8. ์ฆ๊ฒจ์ฐพ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹๋‹น ์ •๋ณด ์ถœ๋ ฅํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/131123 ) REST_INFO ํ…Œ์ด๋ธ”์—์„œ ์Œ์‹์ข…๋ฅ˜๋ณ„๋กœ ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹๋‹น์˜ ์Œ์‹ ์ข…๋ฅ˜, ID, ์‹๋‹น ์ด๋ฆ„, ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์Œ์‹ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ๋”๋ณด๊ธฐ SELECT F.FOOD_TYPE, R.REST_ID, R.REST_NAME, F.FAVORITES FROM ( SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE ) F, REST_INFO R WHERE F.FOOD..
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL๋ฌธ LV. 3 (1) *Oracle ๊ธฐ์ค€, ์ •๋‹ต๋ฅ  ๋†’์€ ์ˆœ์œผ๋กœ 14๋ฌธ์ œ ์ค‘ ์ƒ์œ„ 7๋ฌธ์ œ๋งŒ 1. ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ(1) ( https://school.programmers.co.kr/learn/courses/30/lessons/59044 ) ์•„์ง ์ž…์–‘์„ ๋ชป ๊ฐ„ ๋™๋ฌผ ์ค‘, ๊ฐ€์žฅ ์˜ค๋ž˜ ๋ณดํ˜ธ์†Œ์— ์žˆ์—ˆ๋˜ ๋™๋ฌผ 3๋งˆ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ๋ณดํ˜ธ ์‹œ์ž‘์ผ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ์‹œ์ž‘์ผ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”๋ณด๊ธฐ SELECT I.NAME, I.DATETIME FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID WHERE O.ANIMAL_ID IS NULL ORDER BY I.DATETIME FETCH FIRST 3 ROWS ONLY; - ..