๐ข 7. Database
๐ซง ๋น์ ๊ทํ vs ์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ค๋ณต์ ์ต์ํํ๋๋ก ์ค๊ณ๋จ
- ๋น์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฝ๋ ์๊ฐ์ ์ต์ ํํ๋๋ก ์ค๊ณ๋จ
๐ซง SQL ๋ฌธ
- ํ์ ๋ฑ๋ก
- ๋ค๋ฅธ ์ง์๋ฌธ์ผ๋ก ๊ฐ์ธ๊ธฐ
SELECT StudentName, Students.StudentID, Cnt FROM { SELECT Students.StudentID, count(StudentCourse.CourseID) as [CNT] FROM Students LEFT JOIN StudentCourses ON Students.StudentID = StudentCOurse.StudentID GROUP BY Students.StudentID } T INNER JOIN Students on T.studentID = Students.StudentID
- StudentName ์ GROUP BY ์ ์ ์ถ๊ฐํ๊ธฐ
SELECT Students.StudentID, count(StudentCourse.CourseID) as [CNT] FROM Students LEFT JOIN StudentCourses ON Students.StudentID = StudentCOurse.StudentID GROUP BY Students.StudentID, Students.StudentID
- ์งํฉ ํจ์๋ก ๊ฐ์ธ๊ธฐ
SELECT max(StudnetName) as [StudentName], Students.StudentID, count(StudentCourse.CourseID) as [CNT] FROM Students LEFT JOIN StudentCourses ON Students.StudentID = StudentCOurse.StudentID GROUP BY Students.StudentID
- ์๊ฐ์ ์ ๊ตฌํ๊ธฐ
SELECT TeacherName, isnull(StudnetSize.Number, 0) FROM Teachers LEFT JOIN (SELECT TeacherID, count(StudnetCourses.CourseID) AS [Number] FROM Courses INNER JOIN StudentCourses ON Courses.CourseID = StudentCourses.CourseID GROUP BY Courses.TeacherID) StudentSzie ON Teachers.TeacherID = StudentSize.TeacherID ORDER BY StudentSize.Number DESC
๐ซง ์๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
- 1๋จ๊ณ: ๋ชจํธ์ฑ ์ฒ๋ฆฌ
- ์ ํํ ๋ฌด์์ ์ค๊ณํด์ผ ํ๋์ง ์ดํดํ๊ธฐ
- 2๋จ๊ณ: ํต์ฌ ๊ฐ์ฒด ์ ์
- ํต์ฌ ๊ฐ์ฒด ํ๋๋น ๋ณดํต ํ๋์ ํ ์ด๋ธ ์ฌ์ฉํจ
- 3๋จ๊ณ: ๊ด๊ณ ๋ถ์
- ํ ์ด๋ธ๋ผ๋ฆฌ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง ๋ถ์ํ๊ธฐ
- 4๋จ๊ณ: ํ์ ์กฐ์ฌ
- ์ํ๋ ์์ ๋ค์ ์ดํด๋ณด๊ณ , ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง ์ดํดํ๊ธฐ
๐ซง ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
- join ์ฐ์ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฃผ ๋๋ฆฌ๋ค๊ณ ๊ฐ์ฃผํ๊ธฐ
- ๋ฐ์ดํฐ๋ฅผ ๋น์ ๊ทํ ํด์ผ ํจ
๐ซง ๋ฉด์ ๋ฌธ์
- 14.1 ํ๋ ์ด์์ ์ง: ํ๋ ์ด์์ ์ง์ ๋์ฌํ ๋ชจ๋ ๊ฑฐ์ฃผ์์ ๋ชฉ๋ก์ ๊ตฌํ๋ SQL ์ง์๋ฌธ
SELECT TenantName
FROM Tenants
INNER JOIN
(SELECT TenantID FROM AptTenants GROUP BY TenantID HAVING count(*) > 1) C
ON Tenants.TenantID = C.TenantID
- 14.2 Open ์ํ์ธ Request: ๋ชจ๋ ๊ฑด๋ฌผ ๋ชฉ๋ก๊ณผ Status ๊ฐ Open ์ธ ๋ชจ๋ Request ์ ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT BuildingName, ISNULL(Count, 0) as 'Count'
FROM Buildings
WHERE Requests.Status = 'Open'
- 14.3 Request ๋ฅผ Close๋ก ๋ฐ๊พธ๊ธฐ: 11๋ฒ ๋น๋ฉ์์ ๋๊ท๋ชจ ๋ฆฌ๋ชจ๋ธ๋ง ๊ณต์ฌ ์งํ์ค์. ์ด ๊ฑด๋ฌผ์ ์๋ ๋ชจ๋ ์ง์ ๋ํ ๋ชจ๋ Request ์ Status ๋ฅผ Close ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ง์๋ฌธ ์์ฑํ๋ผ
1
2
3
UPDATE Requests
SET Status = 'Close'
WHERE AptID IN (SELECT AptID FROM Apartments WHERE BuildingID = 11)
14.4 JOIN: ์๋ก ๋ค๋ฅธ ์ข ๋ฅ์ JOIN ์ ์ด๋ค ๊ฒ๋ค์ด ์๋๊ฐ? ๊ฐ๊ฐ์ด ์ด๋ป๊ฒ ๋ค๋ฅด๊ณ , ์ด๋ค ์ํฉ์์ ์ด๋ค JOIN ๊ณผ ์ด์ธ๋ฆฌ๋์ง ์ค๋ช ํด๋ผ
Inner JOIN: ์๋ก ๋งค์นญ๋๋ ๊ฒ๋ง ์กฐํํ๋ค. (๊ต์งํฉ)
Outer JOIN: ๋งค์นญ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ข์ธก ๋๋ ์ฐ์ธก์ ๋ฐ์ดํฐ๋ ๊ฐ์ด ์กฐํํ๋ค.
Left Outer JOIN : LEFT OUTER JOIN B ํ ๊ฒฝ์ฐ A, B ํ ์ด๋ธ๊ฐ ์กฐ์ธ ์กฐ๊ฑด์ด ๋ง์ง ์๋ A์B ํ ์ด๋ธ ์ค A ํ ์ด๋ธ์ ๋ฌด์กฐ๊ฑด ๊ฒฐ๊ณผ๊ฐ์ ํฌํจ๋์ด ๋์ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ B์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ ๊ทธ ์์ฑ์ NULL๋ก ๋ฐํํ๋ค.
Right Outer JOIN : A์B ํ ์ด๋ธ ์ค B ํ ์ด๋ธ์ ๋ฌด์กฐ๊ฑด ๊ฒฐ๊ณผ๊ฐ์ ํฌํจ๋์ด ๋์ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ A์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ ๊ทธ ์์ฑ์ NULL๋ก ๋ฐํํ๋ค.
Full Outer JOIN : ์ข์ธก๊ณผ ์ฐ์ธก์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด JOINํ๋ค.
Natural JOIN: ๋ ํ ์ด๋ธ์ JOINํ ๋ ์ปฌ๋ผ๋ช , ํ์ ์ด ๊ฐ์ ๋ชจ๋ ์ปฌ๋ผ์ JOIN ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ค.
Self JOIN: ์๊ธฐ ์์ ์ ํ ์ด๋ธ์ JOINํ๋ ๊ฒ์ด๋ค.- employees ํ ์ด๋ธ์ด ์ฌ์๋ฒํธ, ์์ฌ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํน์ ์ฌ์์ ์์ฌ๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด Self JOIN์ ์ฌ์ฉํด์ผํ๋ค.
14.5 ๋น์ ๊ทํ: ๋น์ ๊ทํ๋ ๋ฌด์์ธ๊ฐ? ๊ทธ ์ฅ๋จ์ ์ ์ค๋ช ํด๋ผ
- ๋น์ ๊ทํ
- ์๋์ ์ผ๋ก ์ ๊ทํ ์์น์ ์๋ฐฐํ๋ ํ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ ํฅ์์ ์ํด, ๋ฐ์ดํฐ ์ค๋ณต์ ํ์ฉํ๊ณ ์กฐ์ธ์ ์ค์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ
- ์กฐํ ์๋๋ฅผ ํฅ์ ์ํค์ง๋ง, ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ฐ์ฑ์ ๋ฎ์์ง
- ์กฐํ ์ฑ๋ฅ์ ํฅ์ ์ํค๊ธฐ ์ํด ๋ฐ์ดํฐ ์ค๋ณต์ ํ์ฉํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํ ํ๋ ๊ณผ์
- ์ ๊ทํ๊ฐ ๋๋ ํ ์ฑ๋ฅ ์ด์๊ฐ ์์ ๋ ๊ฐ์ง๋ ๊ณผ์ ์ด๋ฉฐ, ์ ๊ทํ์ฒ๋ผ ์ผ์ ํ ๊ท์น ์กด์ฌ
- ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ ๊ทํ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์์ ์ค๋ณต, ํตํฉ, ๋ถ๋ฆฌ ๋ฑ์ ์ํํ๋ ๋ชจ๋ ๊ณผ์
๋ฐ์ ๊ทํ ๋์
- ์ํ ์๋๊ฐ ๋ง์ด ๋๋ฆฐ ๊ฒฝ์ฐ
- ํ ์ด๋ธ์ ์กฐ์ธ ์ฐ์ฐ์ ์ง๋์น๊ฒ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒ์ด ๊ธฐ์ ์ ์ผ๋ก ์ด๋ ค์ด ๊ฒฝ์ฐ
- ํ ์ด๋ธ์ ๋ง์ ๋ฐ์ดํฐ๊ฐ ์๊ณ , ๋ค๋์ ๋ฒ์ ํน์ ํน์ ๋ฒ์๋ฅผ ์์ฃผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋ฐ์ ๊ทํ์ ์ฅ์ ๊ณผ ๋จ์
- ์ฅ์
- ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์์
- ์กฐ์ธ์ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์๊ฐ์ด ์ต์ ํ
- ๋จ์
- ๋ฐ์ดํฐ์ ์ฝ์ , ์ญ์ , ์์ ๋ฑ ๊ฐฑ์ ์ ๋น์ฉ์ด ๋์์ง
- ๋ฐ์ดํฐ๊ฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ (์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ ์์)
- ๋ง์ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํจ
- ์ฅ์
- ๋น์ ๊ทํ
14.6 ๊ฐ์ฒด-๊ด๊ณ ๋ค์ด์ด๊ทธ๋จ: ํ์ฌ, ์ฌ๋, ์ง์์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ER ๋ค์ด์ด๊ทธ๋จ์ ๊ทธ๋ ค๋ผ
1
2
3
4
5
6
7
8
companyID int
companyName varchar(10)
peopleID int
peopleName varchar(10)
employeeID int
employeeName varchar(10)
- 14.7 ์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ: ํ์๋ค์ ์ฑ์ ์ ์ ์ฅํ๋ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๊ฐํด๋ณด์. ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๊ณํ๊ณ , ์ฑ์ ์ด ์ฐ์ํ ํ์(์์ 10%) ๋ชฉ๋ก์ ๋ฐํํ๋ sql ์ง์๋ฌธ์ ์์ฑํด๋ผ. ๋จ ํ์ ๋ชฉ๋ก์ ํ๊ท ์ฑ์ ์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์ผ ํ๋ค
1
SELECT ํ์, avg(์ฑ์ ) FROM ์ฑ์ ํ ORDER BY avg(์ฑ์ ) DESC;