๐ฆ 7. Database
7. Database
SQL ๋ฌธ์ ๊ณผ ๊ทธ ๋ณ์ข ๋ค
- ๋ช ์์ JOIN
1
2
3
SELECT CourseName, TeacherName
FROM Courses INNER JOIN Teachers
ON Courses.TeacherID = Teachers.TeacherID
- ๋ฌต์์ JOIN
1
2
3
SELECT CourseName, TeacherName
FROM Courses, Teachers
WHERE Courses.TeacherID = Teachers.TeacherID
์ด ๋์ ๋๋ฑํ๋ค. ์ด๋ ์ชฝ์ ์ฌ์ฉํ ๊ฒ์ด๋ ํ๋ ๊ฒ์ ๊ฐ์ธ ์ทจํฅ์ ๋ฌธ์ ์ด๋ค.
๋น์ ๊ทํ vs. ์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค : ์ค๋ณต์ ์ต์ํํ๋๋ก ์ค๊ณ๋จ
- ๋น์ ๊ทํ ๋ฐ์ดํฐ๋ฒ ์ด์ค : ์ฝ๋ ์๊ฐ์ ์ต์ ํํ๋๋ก ์ค๊ณ๋จ
Courses ๋ Teachers ์ ๊ฐ์ ์๋ฃ๋ฅผ ํฌํจํ๋ ์ ํ์ ์ธ ์ ๊ทํ DB๋ ์ธ๋ํค๋ฅผ ๊ฐ์ ์ปฌ๋ผ์ด ์๋ค.
์ด ์ค๊ณ์ ์ฅ์ ์ ๊ต์ฌ ์ ๋ณด๋ฅผ DB์ ํ ๋ฒ๋ง ์ ์ฅํด๋ ๋๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด ์๋น์์ ์ผ์์ ์ง์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด JOIN์ ๋ง์ด ํ๊ฒ ๋๋ ๋จ์ ์ด ์๋ค.
๋น์ ๊ทํ DB์์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณตํด์ ์ ์ฅํ ์ ์๋ค.
๊ฐ์ ์ง์๋ฅผ ์์ฃผ ๋ฐ๋ณตํด์ผ ํ๋ค๋ ์ฌ์ค์ ๋ฏธ๋ฆฌ ์๊ณ ์์ผ๋ฉด, ๊ต์ฌ์ ์ด๋ฆ ์ ๋ณด๋ฅผ Courses ํ ์ด๋ธ์ ์ค๋ณตํด ์ ์ฅํ ์๋ ์๋ค.
๋์ ๊ท๋ชจ ํ์ฅ์ฑ์ ์คํํ๊ธฐ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ด๋ค.
SQL ๋ฌธ
1
2
3
4
Courses: CourseID*, CourseName, TeacherID
Teachers: TeacherID*, TeacherName
Students: StudentID*, StudentName
StudentCourses: CourseID*, StudentID*
์ง์ #1: ํ์ ๋ฑ๋ก
๋ชจ๋ ํ์์ ๋ฝ๊ณ ๊ฐ ํ์์ด ์ผ๋ง๋ ๋ง์ ๊ฐ์๋ฅผ ์๊ฐํ๊ณ ์๋์ง ํ์ธํ๋ ์ง์๋ฌธ์ ๋ง๋ค์ด๋ณด์.
- ๋ค๋ฅธ ์ง์๋ฌธ์ผ๋ก ๊ฐ์ธ๊ธฐ
1
2
3
4
5
6
7
SELECT StudentName, Students.StudentID, Cnt
FROM (
SELECT Students.StudentID, count(StudentCourses.CourseID) as [cnt]
FROM Students LEFT JOIN StudentCourses
ON Students.StudentID = StudentCourses.StudentID
GROUP BY Students.StudentID
) T INNER JOIN Sudents on T.studentID = Students.StudentID
- StudentNAme ์ GROUP BY ์ ์ ์ถ๊ฐํ๊ธฐ
1
2
3
4
SELECT StudentName, Students.StudentID, count(StudentCourses.CourseID) as [cnt]
FROM Students LEFT JOIN StudentCourses
ON Students.StudentID = StudentCourses.StudentID
GROUP BY Students.StudentID, Students.StudentName
- ์งํฉ ํจ์๋ก ๊ฐ์ธ๊ธฐ
1
2
3
4
5
SELECT max(StudentName) as [StudentName], Students.StudentID,
count(StudentCourses.CourseID) as [count]
FROM Students LEFT JOIN StudentCourses
ON Students.StudentID = StudentCourses.StudentID
GROUP BY Students.StudentID
์ง์ #2: ์๊ฐ์ ์ ๊ตฌํ๊ธฐ
1
2
3
4
5
6
7
8
SELECT TeacherName, isnull(StudentSize.Number, 0)
FROM Teachers LEFT JOIN
(SELECT TeacherID, count(StudentCourses.CourseID) AS [Number]
FROM Courses INNER JOIN StudentCourses
ON Courses.CourseID = StudnetCourses
GROUP BY Courses.TeacherID) StudentSize
ON Teachers.TeacherID = StudentSize.TeacherID
ORDER BY StudentSize.Number DESC
์๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
1๋จ๊ณ: ๋ชจํธ์ฑ ์ฒ๋ฆฌ
์ค๊ณ๋ฅผ ์์ํ๊ธฐ ์ ์ ์ ํํ ๋ฌด์์ ์ค๊ณํด์ผ ํ๋์ง ์ดํดํด์ผ ํ๋ค.
2๋จ๊ณ: ํต์ฌ ๊ฐ์ฒด ์ ์
๊ทธ ๋ค์์ผ๋ก, ์ด ์์คํ ์ ํต์ฌ ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ณธ๋ค.
ํต์ฌ ๊ฐ์ฒด ํ๋๋น ๋ณดํต ํ๋์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
3๋จ๊ณ: ๊ด๊ณ ๋ถ์
ํต์ฌ ๊ฐ์ฒด์ ์ค๊ณฝ์ ์ก๊ณ ๋๋ฉด ํ ์ด๋ธ๋ผ๋ฆฌ ์ด๋ค ๊ด๊ณ๊ฐ ์์์ง ์ดํด๋ณธ๋ค.
4๋จ๊ณ: ํ์ ์กฐ์ฌ
ํํ๊ฒ ์ํ๋ ์์ ๋ค์ ์ดํด๋ณด๊ณ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง ์ดํดํด์ผ ํ๋ค.
๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
๋๊ท๋ชจ์ ๊ท๋ชจ ํ์ฅ์ฑ์ด ๋์ DB๋ฅผ ์ค๊ณํ ๋์ JOIN ์ฐ์ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฃผ ๋๋ฆฌ๋ค๊ณ ๊ฐ์ฃผํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ ๊ทํํด์ผ ํ๋ค.
๋ฉด์ ๋ฌธ์
14.1 ํ๋ ์ด์์ ์ง
ํ๋ ์ด์์ ์ง์ ๋์ฌํ ๋ชจ๋ ๊ฑฐ์ฃผ์์ ๋ชฉ๋ก์ ๊ตฌํ๋ SQL ์ง์๋ฌธ์ ์์ฑํ๋ผ.
1
2
3
4
5
SELECT *
FROM Tenants
INNER JOIN TenantApartments
ON Tenants.TenantID = TenantApartments
GROUP BY Tenents.TenentID
14.2 Open ์ํ์ธ Request
๋ชจ๋ ๊ฑด๋ฌผ ๋ชฉ๋ก๊ณผ Status ๊ฐ Open ์ธ ๋ชจ๋ Request ๊ฐ์๋ฅผ ๊ตฌํ๋ผ.
1
2
3
4
5
6
SELECT Buildings.BuildingName, count(*) as [cnt]
FROM Buildings
INNER JOIN Requests
ON Buildings.BuildingID = Requests.BuildingID
and Requests.status = 'Open'
GROUP BY Building.BuildingID
14.3 Request ๋ฅผ Close๋ก ๋ฐ๊พธ๊ธฐ
11๋ฒ ๋น๋ฉ์์ ๋๊ท๋ชจ ๋ฆฌ๋ชจ๋ธ๋ง ๊ณต์ฌ๋ฅผ ์งํ ์ค์ด๋ค.
์ด ๊ฑด๋ฌผ์ ์๋ ๋ชจ๋ ์ง์ ๋ํ ๋ชจ๋ Request ์ Status ๋ฅผ Close ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ง์๋ฌธ์ ์์ฑํ๋ผ.
1
2
3
UPDATE Requests
SET Status = 'Close'
WHERE Requests.BuildingID = 11
14.4 JOIN
์๋ก ๋ค๋ฅธ ์ข ๋ฅ์ JOIN ์ ์ด๋ค ๊ฒ๋ค์ด ์๋๊ฐ? ๊ฐ๊ฐ์ด ์ด๋ป๊ฒ ๋ค๋ฅด๊ณ , ์ด๋ค ์ํฉ์์ ์ด๋ค JOIN ๊ณผ ์ด์ธ๋ฆฌ๋์ง ์ค๋ช ํ๋ผ.
- LEFT JOIN : ๊ธฐ์ค ํ ์ด๋ธ์์ ๋งคํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์, ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ NULL ์ฒ๋ฆฌ
- RIGHT JOIN : ์๋ ํ ์ด๋ธ์์ ๋งคํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด. ์กด์ฌํ์ง ์๋ ๊ธฐ์ค ๋ฐ์ดํฐ๋ NULL ์ฒ๋ฆฌ
- INNER JOIN : ๊ต์งํฉ, ์๋ก ๋งคํ๋๋ ๊ฒ๋ง ์กฐํ, ๋๋จธ์ง๋ ์ฌ๋ผ์ง
- FULL JOIN : ํฉ์งํฉ, ๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ด
14.5 ๋น์ ๊ทํ
๋น์ ๊ทํ๋ ๋ฌด์์ธ๊ฐ? ๊ทธ ์ฅ๋จ์ ์ ์ค๋ช ํ๋ผ.
DB ์์์ ์ค๋ณต์ผ๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํจ
๋ฐ์ดํฐ์ ์ค๋ณต์ผ๋ก ์ผ๊ด์ฑ์ด ์์ด์ง ์ ์์ง๋ง, JOIN ์ ํ์ง ์์ ์ฝ๊ธฐ ์ฑ๋ฅ์ด ํฅ์๋จ.
14.6 ๊ฐ์ฒด-๊ด๊ณ ๋ค์ด์ด๊ทธ๋จ
ํ์ฌ, ์ฌ๋, ์ง์์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ER ๋ค์ด์ด๊ทธ๋จ์ ๊ทธ๋ ค๋ผ.
1
2
3
4
5
6
7
8
companyID BIGINT
companyName VARCHAR(50)
personID BIGINT
personeName VARCHAR(50)
employee BIGINT
employeeName VARCHAR(50)