[SQL] Practice 2 & ์๋ธ์ฟผ๋ฆฌ
Categories: Database
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
์ฟผ๋ฆฌ์ค์ต [๋ํ๊ต ๊ด๋ฆฌ์์คํ ]
๊ณ ๊ธ-3
-
๋์ ์ฟผ๋ฆฌ
1 2 3 4 5 6 7 8
4. **๋ฌธ์ **: ๊ฐ ๊ต์๊ฐ ๋ด๋นํ๋ ๊ฐ์์ ์๋ฅผ ์กฐํํ์ธ์. SELECT p.name ,COUNT(c.course_id) from Courses c RIGHT JOIN Departments d ON d.department_id = c.department_id RIGHT JOIN professors p ON p.professor_id =d.department_id group by p.professor_id;
-
Reference ์ฟผ๋ฆฌ
1 2 3 4 5 6 7
[Reference ์ฝ๋] **SELECT P.name, COUNT(SE.section_id) FROM Professors P LEFT JOIN Sections SE ON P.professor_id = SE.professor_id GROUP BY P.name;**
-
[์ค๋ต์ด์ ]
๊ฐ์ countํ ๋ ๋๋ ๊ฐ์๊ฐ course์ด๊ธฐ ๋๋ฌธ์ course ๊ธฐ์ค์ผ๋ก ํ๋๋ฐ
ํ ๊ฐ์๋ ์ฌ๋ฌ section์ ๊ฐ์ง ์ ์๊ณ
section์์ ๋ด๋น ๊ต์ ์ ๋ณด๊ฐ ๋ฐฐ์ ๋์ด ์๊ธฐ ๋๋ฌธ์
section ๊ธฐ์ค์ผ๋ก ์ธ๋๊ฒ ๋ง์.
๊ณ ๊ธ-4
- ๋ฌธ์ : ๊ฐ ํ๊ณผ๋ณ๋ก ํ๊ท ํ์ ์ด ๊ฐ์ฅ ๋์ ๊ฐ์๋ฅผ ์กฐํํ์ธ์.
-
๋์ ์ฟผ๋ฆฌ
1 2 3 4 5 6 7
select AVG(c.credits) from courses c join departments d on d.department_id =c.department_id group by d.department_id order by d.department_id desc limit 1;
-
Reference ์ฟผ๋ฆฌ
1 2 3 4 5 6 7 8
SELECT d.name,c.title, c.credit from departaments d join courses c ON c.deaprtment_id = d.department_id WHERE c.credits in (SELECT MAX(c2.credits)from courses c2 WHERE c2.department_id=c.department_id group by c2.department_id);
-
[์ค๋ต์ด์ ]
์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ ์ค ๋ ๋ชฐ๋๊ณ ๋ฌธ์ ๋ ํ๊ณผ๋ณ๋ก ํ๊ท ํ์ ์ด ๊ฐ์ฅ ๋์ ๊ฐ์์ธ๋ฐ
ํ๊ณผ๋ณ์ด ์๋, ํ๊ท ํ์ ์ค ๊ฐ์ฅ ๋์ ํ๊ณผ ํ๋๋ง Selectํ๋ค.
์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ๋ SQL ๋ฌธ์ฅ ๋ด์์ ๋ค๋ฅธ SQL ๋ฌธ์ฅ์ ํฌํจํ๋ ๊ตฌ์กฐ
- ์ฃผ๋ก ๊ดํธ
()
๋ก ๋๋ฌ์ธ์ฌ ์์ : ๊ดํธ ๋ด ๋ฌธ์ฅ์ด ์๋ธ์ฟผ๋ฆฌ
- ์ฃผ๋ก ๊ดํธ
-
CRUD ์ค์์
Create
Read - SELECT๋ ์ฌ๊ธฐ์ ํด๋น, ์๋ธ์ฟผ๋ฆฌ๋ SELECT๋ฐ์ ๋ชป์
Update
Delete
- ์๋ธ์ฟผ๋ฆฌ๋ from์ , join์ , having ์ ์์๋ ๋ณ์นญ์ ๊ผญ ๋ง๋ค์ด ์ฃผ์ด์ผ ํจ.
- ์๋ธ์ฟผ๋ฆฌ๋ order by๋ ์ฌ์ฉ ๋ชปํจ.
์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ
- ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ: ํ๋์ ํ๋ง ๋ฐํ. ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ
- ๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ: ๋ ๊ฐ ์ด์์ ํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ, ์ฐ์ฐ์๋ก๋
IN
,ANY
,ALL
,EXISTS
๋ฑ์ด ์ฌ์ฉ - ๋ค์ค ์ด ์๋ธ์ฟผ๋ฆฌ: ๋ ๊ฐ ์ด์์ ์ด์ ๋ฐํํ๋ ๊ฒฝ์ฐ
์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉ์์น
SELECT ์
-
์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- Users ํ ์ด๋ธ์์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ --๊ทธ๋ค์ ๋์ถ ๊ฑด์๋ฅผ ์ ํํ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ SELECT username, -- ๊ฐ ์ฌ์ฉ์๋ณ ๋์ถ ๊ธฐ๋ก ์๋ฅผ ๊ณ์ฐํ๋ ์๋ธ์ฟผ๋ฆฌ (SELECT COUNT(*) FROM LoanRecords WHERE user_id = Users.user_id) AS loans_count FROM Users;
-
ํด๋น ๊ตฌ๋ฌธ์ ์๋๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ.
1 2 3 4 5
select u.username, count(l.record_id) from users u left join loanrecords l on l.user_id = u.user_id group by u.user_id;
-
์คํ๊ฒฐ๊ณผ
loans_count : ๊ฐ ์ฌ์ฉ์์ ๋์ถ ๊ฑด์
-
FROM์
-
์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-- Users ํ ์ด๋ธ๊ณผ LoanRecords ํ ์ด๋ธ์ ์กฐ์ธํ์ฌ ์ฌ์ฉ์๋ณ ๋์ถ ๊ฑด์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ SELECT user_data.username, -- ์ฌ์ฉ์ ์ด๋ฆ ์ ํ loan_count.loans -- ๋์ถ ๊ฑด์ ์ ํ FROM Users AS user_data -- Users ํ ์ด๋ธ์ user_data๋ผ๋ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ JOIN ( -- LoanRecords ํ ์ด๋ธ์์ ๊ฐ user_id๋ณ๋ก ๋์ถ ๊ฑด์๋ฅผ ์ง๊ณํ๋ ์๋ธ์ฟผ๋ฆฌ SELECT user_id, COUNT(*) AS loans -- ๋์ถ ๊ฑด์๋ฅผ ๊ณ์ฐํ์ฌ loans๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐํ FROM LoanRecords GROUP BY user_id -- user_id๋ณ๋ก ๊ทธ๋ฃนํ ) AS loan_count -- ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ loan_count๋ผ๋ ๋ณ์นญ ๋ถ์ฌ ON user_data.user_id = loan_count.user_id; -- Users ํ ์ด๋ธ์ user_id์ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ user_id๋ฅผ ๋งค์นญํ์ฌ ์กฐ์ธ
-
์คํ๊ฒฐ๊ณผ
-
WHERE์
-
์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
WHERE ์ -- Users ํ ์ด๋ธ์์ ์ฌ์ฉ์ ์ด๋ฆ์ ์กฐํ SELECT username -- ์ฌ์ฉ์ ์ด๋ฆ์ ์ ํ FROM Users WHERE user_id IN ( -- Users ํ ์ด๋ธ์ user_id๊ฐ ์๋ธ์ฟผ๋ฆฌ์์ ์ ํ๋ user_id์ ํฌํจ๋๋ ๊ฒฝ์ฐ๋ง ์กฐํ -- LoanRecords ํ ์ด๋ธ์์ ๋ฐ๋ฉ ๋ ์ง๊ฐ NULL์ธ ๋์ถ ๊ธฐ๋ก์ user_id๋ฅผ ์ ํ SELECT user_id FROM LoanRecords WHERE return_date IS NULL -- ๋ฐ๋ฉ ๋ ์ง๊ฐ ์๋ (์ฆ, ์์ง ๋ฐ๋ฉ๋์ง ์์) ๋์ถ ๊ธฐ๋ก์ ํํฐ๋ง );
HAVAING ์
- HAVING์ ์ ์กฐ๊ฑด๋ฌธ์ธ๋ฐ WHERE์ ์ GROUP BY ์ ์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ค๋ฉด
- HAVING์ ์ GROUPํ ํ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ๊ฑธ์ด ์ฒ๋ฆฌ
- ์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
-- ๋์ถ ๊ธฐ๋ก ํ ์ด๋ธ์์ ์ฌ์ฉ์๋ณ ๋์ถ ๊ฑด์๋ฅผ ๊ณ์ฐํ๊ณ , ์ด ๊ฑด์๊ฐ ์ ์ฒด ์ฌ์ฉ์์ ํ๊ท ๋์ถ ๊ฑด์๋ณด๋ค ๋ง์ ์ฌ์ฉ์๋ฅผ ์กฐํ SELECT user_id, -- ์ฌ์ฉ์ ID COUNT(*) AS loan_count -- ๋์ถ ๊ฑด์ FROM LoanRecords GROUP BY user_id -- ์ฌ์ฉ์ ID๋ณ๋ก ๊ทธ๋ฃนํ HAVING COUNT(*) > ( -- ๊ฐ ์ฌ์ฉ์์ ๋์ถ ๊ฑด์๊ฐ ์๋ธ์ฟผ๋ฆฌ์์ ๊ณ์ฐ๋ ํ๊ท ๋์ถ ๊ฑด์๋ณด๋ค ํด ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ๋ฅผ ํฌํจ SELECT AVG(loan_count) -- ํ๊ท ๋์ถ ๊ฑด์ ๊ณ์ฐ FROM (SELECT COUNT(*) AS loan_count -- ๊ฐ ์ฌ์ฉ์๋ณ ๋์ถ ๊ฑด์ FROM LoanRecords GROUP BY user_id) AS average_loans -- ์ด์ค ์๋ธ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ฌ์ฉ์๋ณ ๋์ถ ๊ฑด์๋ฅผ ๋จผ์ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ท ์ ๊ณ์ฐ );
INSERT ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- LoanRecords ํ
์ด๋ธ์ ์๋ก์ด ๋์ถ ๊ธฐ๋ก์ ์ฝ์
INSERT INTO LoanRecords (user_id, book_id, loan_date)
SELECT
user_id,
-- Books ํ
์ด๋ธ์์ ์์๋ก ์ ํ๋ ํ ๊ถ์ ์ฑ
์ book_id๋ฅผ ๊ฐ์ ธ์ด
(SELECT book_id FROM Books ORDER BY RAND() LIMIT 1),
CURDATE() -- ๋์ถ ๋ ์ง๋ฅผ ํ์ฌ ๋ ์ง๋ก ์ค์
FROM
Users
WHERE
-- ํ์ฌ ๋ฐ๋ฉ๋์ง ์์ ์ฑ
์ ๊ฐ์ง ๋์ถ ๊ธฐ๋ก์ด ์๋ ์ฌ์ฉ์๋ง ์ ํ
NOT EXISTS (
SELECT *
FROM LoanRecords
WHERE user_id = Users.user_id AND return_date IS NULL
);
- ์๋ธ์ฟผ๋ฆฌ (
SELECT book_id FROM Books...
):- ์ด ๋ถ๋ถ์
Books
ํ ์ด๋ธ์์ ์์์ ์ฑ ํ๋๋ฅผ ์ ํํ๋ค. ORDER BY RAND()
๊ตฌ๋ฌธ์ ๋ชจ๋ ์ฑ ์ค์์ ๋ฌด์์๋ก ํ๋๋ฅผ ์ ํํ๊ฒ ํ๊ณ ,LIMIT 1
์ ๋จ ํ๋์ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋๋ก ์ ํ- ์ด๋ ๊ฒ ์ ํ๋ ์ฑ
์
book_id
๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ฝ์ ๊ณผ์ ์ ์ฌ์ฉ๋๋ค.
- ์ด ๋ถ๋ถ์
- ์ธ๋ถ SELECT ์ฟผ๋ฆฌ:
Users
ํ ์ด๋ธ์์ ์ฌ์ฉ์๋ฅผ ์ ํ- ์ด๋,
WHERE
์ ์ ํฌํจ๋NOT EXISTS
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ - ํ์ฌ ๋์ถ ์ค์ธ ์ฑ
์ด ์๋(์ฆ,
return_date
๊ฐNULL
์ธ ๋์ถ ๊ธฐ๋ก์ด ์๋) ์ฌ์ฉ์๋ง์ ๋์์ผ๋ก ํ๋ค. - ๊ฒฐ๊ตญ ๋ฐ๋ฉ๋์ง ์์ ์ฑ ์ ๊ฐ์ง ์ฌ์ฉ์๋ ์๋ก์ด ์ฑ ์ ๋์ถ๋ฐ์ง ๋ชปํ๊ฒ ํ๋ค.
- INSERT INTO LoanRecords:
- ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํ์ฌ
LoanRecords
ํ ์ด๋ธ์ ์๋ก์ด ๋์ถ ๊ธฐ๋ก์ ์ถ๊ฐํ๋ค.. - ๊ฐ ๊ธฐ๋ก์๋ ์ฌ์ฉ์ ID(
user_id
), ๋ฌด์์๋ก ์ ํ๋ ์ฑ ์ ID(book_id
), ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ ์ง(CURDATE()
)๊ฐ ๋์ถ ๋ ์ง๋ก ์ค์ ๋๋ค
- ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํ์ฌ
- WHERE EXIST / WHERE NOT EXIST
EXIST
๋ ์๋ธ์ฟผ๋ฆฌ์ 1๊ฑด์ด๋ผ๋ ์กด์ฌํ๋ฉด TRUE๋ฅผ ๋ฐํํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค.NOT EXISTS
๋ EXISTS์ ๋ฐ๋๋ก ์๋ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค.- NOT EXISTS๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ 1๊ฑด์ด๋ผ๋ ์ฐพ์ผ๋ฉด ๊ฒ์์ ๋ฉ์ถ๊ณ TRUE๋ฅผ ๋ฐํํ๋ค.
- NOT์ด ๋ถ์๊ธฐ ๋๋ฌธ์ (TRUE โ FALSE, FALSE โ TRUE) ๋ฐํ ๊ฐ์ด ๋ฐ๋๋ก ๋ฐ๋์ด์ ์๋ธ์ฟผ๋ฆฌ์ ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ง ์กฐํ
-
์คํ๊ฒฐ๊ณผ
๋ค๋ค ๋ฐ๋ฉ์ ์ํด์ ์๋ก์ด ์ฑ ์ ๋์ถ ๋ฐ์ ์ ์์.
UPDATE ์
1
2
3
4
5
6
7
8
9
-- LoanRecords ํ
์ด๋ธ์ return_date๋ฅผ ์
๋ฐ์ดํธ
UPDATE LoanRecords
SET return_date = CURDATE() -- ๋ฐ๋ฉ ๋ ์ง๋ฅผ ํ์ฌ ๋ ์ง๋ก ์ค์
WHERE loan_date = (
-- ์ฌ์ฉ์๋ณ๋ก ๊ฐ์ฅ ์ด๋ฅธ ๋์ถ ๋ ์ง๋ฅผ ์ฐพ๋ ์๋ธ์ฟผ๋ฆฌ
SELECT MIN(loan_date)
FROM LoanRecords
WHERE user_id = LoanRecords.user_id -- ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ฌ์ฉ์ ID์ ์ผ์นํ๋ ์ฌ์ฉ์ ID๋ฅผ ๊ฐ์ง ๋์ถ ๊ธฐ๋ก ์ค์์
);
Comment
sql ์์ฑํ๋ ๊ฒ์ด ์๊ฐ๋ณด๋ค ์ฌ์ด ๊ฒ๋ง ํด์๋์ง ์ฌํ๊ป ์ํํ๊ฒ ์ ํด์๋๋ฐ ์๋ธ์ฟผ๋ฆฌ, Having์ ๋ฑ.. ๊ฐ์๊ธฐ ๊ธ ์ด๋ ค์์ง ๊ธฐ๋ถ์ด๋ค ~~ ๊ทธ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฏธ ๋ฐ์ดํฐ๋ฃ๊ณ ๊ฒฐ๊ณผ ๋ฐ๋ก๋ฐ๋ก ํ์ธํ ์ ์์ด์ ์ดํดํ๋๋ฐ ํฐ ๋์์ด ๋๋ ๊ฒ ๊ฐ๋ค.
Leave a comment