๋ฐ์ดํฐ๋ฒ ์ด์ค, 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; - .. ์ด์ 1 2 ๋ค์