์๋ธ์ฟผ๋ฆฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ์กฐํ์ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ค์ํ ๋๊ตฌ์ ๋๋ค. ์ด ํฌ์คํธ์์๋ MariaDB ์๋ธ์ฟผ๋ฆฌ์ ๋ํ ๊ธฐ๋ณธ ๊ฐ๋ , ์ข ๋ฅ, ์์ฑ ๋ฐ ์ฌ์ฉ๋ฒ, ์ค์ ์์ , ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
์์ ๋ฐ์ดํฐ๐ฆ
์๋๋ ๊ฐ ์์ ์์ ์ฌ์ฉํ ์์ ๋ฐ์ดํฐ ํ
์ด๋ธ์
๋๋ค:
Employees ํ ์ด๋ธ
employee_id | name | department_id | salary |
---|---|---|---|
1 | Alice | 101 | 50000 |
2 | Bob | 102 | 60000 |
3 | Charlie | 101 | 55000 |
4 | David | 103 | 45000 |
5 | Eve | 102 | 70000 |
Departments ํ
์ด๋ธ
department_id | name | location_id |
---|---|---|
101 | Sales | 1700 |
102 | IT | 1700 |
103 | HR | 1800 |
Locations ํ
์ด๋ธ
location_id | city |
---|---|
1700 | London |
1800 | Paris |
Job_History ํ
์ด๋ธ
department_id | job_id | end_date |
---|---|---|
101 | 1 | 2023-03-15 |
102 | 2 | 2024-01-01 |
103 | 3 | 2022-12-31 |
์๋ธ์ฟผ๋ฆฌ๋ ๋ฌด์์ธ๊ฐโ
์ ์: ์๋ธ์ฟผ๋ฆฌ(Subquery)๋ SQL ๋ฌธ ์์ ํฌํจ๋ ๋ ๋ค๋ฅธ SQL ๋ฌธ์
๋๋ค. ์ฃผ๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๊ฑฐ๋ ํน์ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฉ๋: ์๋ธ์ฟผ๋ฆฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฒ์, ์กฐ๊ฑด๋ถ ๋ฐ์ดํฐ ์กฐํ, ์ง๊ณ ํจ์์ ๊ฒฐํฉ๋ ๋ฐ์ดํฐ ๋ถ์ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์์
SELECT *
FROM `employees`
WHERE `salary` > (
SELECT AVG(`salary`)
FROM `employees`
);
์ ์์ ๋ ์ ์ฒด ์ง์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์กฐํํฉ๋๋ค.
๊ฒฐ๊ณผ
employee_id | name | department_id | salary |
---|---|---|---|
2 | Bob | 102 | 60000 |
3 | Charlie | 101 | 55000 |
4 | Eve | 102 | 70000 |
์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ๐
๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ
๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ๋ ํ๋์ ๊ฐ์ด๋ ํ๋์ ํ๋ง์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๋๋ค. ์ด๋ WHERE ๊ตฌ๋ฌธ์ด๋ SELECT ๊ตฌ๋ฌธ์ ์ผ๋ถ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฅ ๋์ ๊ฐ์ ์ฐพ๊ฑฐ๋ ์กฐ๊ฑด์ ๋ง๋ ํ ๊ฐ์ง ๊ฐ์ ์ฐพ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์
Sales ๋ถ์์ ์ํ ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`
FROM `employees`
WHERE `department_id` = (
SELECT `department_id`
FROM `departments`
WHERE `name` = 'Sales'
);
๊ฒฐ๊ณผ
name |
---|
Alice |
Bob |
๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ
๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๋๋ค. ์ด๋ IN, ANY, ALL ๋ฑ์ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์งํฉ์ ํฌํจ๋๋ ๊ฐ๋ค์ ์ฐพ๊ฑฐ๋, ์ฌ๋ฌ ํ์ ๋น๊ตํ ๋ ์ ์ฉํฉ๋๋ค.
์์
London์ ์์นํ ๋ถ์์ ์ํ ์ง์์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`
FROM `employees`
WHERE `department_id` IN (
SELECT `department_id`
FROM `departments`
WHERE `location_id` = (
SELECT `location_id`
FROM `locations`
WHERE `city` = 'London'
)
);
๊ฒฐ๊ณผ
name |
---|
Alice |
Bob |
Charlie |
Eve |
IN, ALL, ANY๋ ์๋ธ์ฟผ๋ฆฌ๋ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋์ด ํน์ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ์กฐ๊ฑด์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ์ญํ ์ ๊ฐ๋จํ ์ค๋ช ํ๊ฒ ์ต๋๋ค:
- IN: IN ์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์์ ํน์ ๊ฐ์ด ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, WHERE column_name IN (subquery)์ ๊ฐ์ด ์ฌ์ฉ๋์ด column_name์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ANY: ANY ์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์ค ํ๋ ์ด์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, WHERE column_name > ANY (subquery)์ ๊ฐ์ด ์ฌ์ฉ๋์ด column_name์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์ค ์ด๋ค ๊ฐ๋ณด๋ค ํฐ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ALL: ALL ์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ๋ชจ๋ ๊ฐ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, WHERE column_name > ALL (subquery)์ ๊ฐ์ด ์ฌ์ฉ๋์ด column_name์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์์ ๋ชจ๋ ๊ฐ๋ณด๋ค ํฐ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ํ ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ์์ ๋ฅผ ํตํด IN, ALL, ANY ์ฐ์ฐ์๋ฅผ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์์
ํ์๋ค์ ์ฑ์ ์ ์ ์ฅํ ํ
์ด๋ธ์ด ์์ต๋๋ค. ์ด ํ
์ด๋ธ์์ ํน์ ๊ณผ๋ชฉ์ ์ฑ์ ์ด ํน์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
students ํ ์ด๋ธ
student_id | name | score |
---|---|---|
1 | Alice | 85 |
2 | Bob | 70 |
3 | Charlie | 95 |
4 | David | 60 |
5 | Eve | 75 |
1. IN ์ฐ์ฐ์ ์์ :
SELECT `name`
FROM `students`
WHERE `score` IN (85, 95);
์ด ์ฟผ๋ฆฌ๋ ์ฑ์ ์ด 85 ๋๋ 95์ธ ํ์์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ๋ "Alice"์ "Charlie"๊ฐ ๋ฉ๋๋ค.
2. ANY ์ฐ์ฐ์ ์์ :
SELECT name
FROM students
WHERE score > ANY (SELECT score FROM students WHERE name = 'Bob');
์ด ์ฟผ๋ฆฌ๋ "Bob"์ ์ฑ์ ๋ณด๋ค ๋์ ์ฑ์ ์ ๋ฐ์ ํ์์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ๋ "Alice", "Charlie", "Eve"๊ฐ ๋ฉ๋๋ค.
3. ALL ์ฐ์ฐ์ ์์ :
SELECT name
FROM students
WHERE score > ALL (SELECT score FROM students WHERE name = 'David');
์ด ์ฟผ๋ฆฌ๋ "David"์ ์ฑ์ ๋ณด๋ค ๋์ ์ฑ์ ์ ๋ชจ๋ ๋ฐ์ ํ์์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ๋ "Alice", "Charlie", "Eve"๊ฐ ๋ฉ๋๋ค.
๋ค์ค ์ด ์๋ธ์ฟผ๋ฆฌ
๋ค์ค ์ด ์๋ธ์ฟผ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ด์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๋๋ค. ์ด๋ฌํ ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก ์ธ๋ถ ์ฟผ๋ฆฌ์์ ๋ณต์์ ์ด ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ ๋ ๋ค์ค ์ด์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์์
'2023-01-01' ์ดํ์ ์ข ๋ฃ๋ ๋ถ์์ ์ง๋ฌด์ ์ํ ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`
FROM `employees`
WHERE (`department_id`, `job_id`) IN (
SELECT `department_id`, `job_id`
FROM `job_history`
WHERE `end_date` > '2023-01-01'
);
๊ฒฐ๊ณผ
name |
---|
Charlie |
Eve |
์๊ด ์๋ธ์ฟผ๋ฆฌ
์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ ๋ด์์ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ด์ ์ฐธ์กฐํ์ฌ ์๋ํ๋ ํน๋ณํ ์ ํ์ ์๋ธ์ฟผ๋ฆฌ์
๋๋ค. ์ด๋ฌํ ์๋ธ์ฟผ๋ฆฌ๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋์ํ๋ฉฐ, ์ธ๋ถ ์ฟผ๋ฆฌ์ ํ๋ง๋ค ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์ฃผ๋ก ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํํฐ๋ง๋๊ฑฐ๋ ์ง๊ณ๋๋ ์ํฉ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ธ๋ถ ์ฟผ๋ฆฌ์ ๋ด๋ถ ์๋ธ์ฟผ๋ฆฌ ๊ฐ์ ์ํธ์์ฉ์ ํตํด ๋ณด๋ค ์ ์ฐํ๊ณ ์ ๊ตํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
์์
๊ฐ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`
FROM `employees` AS `e`
WHERE `salary` > (
SELECT AVG(`salary`)
FROM `employees`
WHERE `department_id` = `e`.`department_id`
);
๊ฒฐ๊ณผ
name |
---|
Bob |
Eve |
์๋ธ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ์ฌ์ฉ๋ฒ๐
1. ๊ธฐ๋ณธ ๋ฌธ๋ฒ: ์๋ธ์ฟผ๋ฆฌ๋ ๊ดํธ ()๋ก ๊ฐ์ธ์ ์์ฑํฉ๋๋ค.
2. SELECT ๋ฌธ ๋ด ์๋ธ์ฟผ๋ฆฌ:
์์
๊ฐ ์ง์์ ํ๊ท ๊ธ์ฌ์ ํจ๊ป ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`,
(SELECT AVG(`salary`) FROM `employees`) AS `avg_salary`
FROM `employees`;
๊ฒฐ๊ณผ
name | avg_salary |
---|---|
Alice | 56000 |
Bob | 56000 |
Charlie | 56000 |
David | 56000 |
Eve | 56000 |
3. WHERE ์ ๋ด ์๋ธ์ฟผ๋ฆฌ:
์์
HR ๋ถ์์ ์ํ ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `name`
FROM `employees`
WHERE `department_id` = (
SELECT `department_id`
FROM `departments`
WHERE `name` = 'HR'
);
๊ฒฐ๊ณผ
name |
---|
David |
4. FROM ์ ๋ด ์๋ธ์ฟผ๋ฆฌ:
์์
๊ฐ ์ง์์ ๋ถ์ ์ด๋ฆ๊ณผ ํจ๊ป ์ง์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค.
SELECT `e`.`name`, `d`.`department_name`
FROM `employees` AS `e`
JOIN (
SELECT `department_id`, `name` AS `department_name`
FROM `departments`
) AS `d` ON `e`.`department_id` = `d`.`department_id`;
๊ฒฐ๊ณผ
name | department_name |
---|---|
Alice | Sales |
Bob | IT |
Charlie | Sales |
David | HR |
Eve | IT |
์ฑ๋ฅ ์ต์ ํ๐
1. ์๋ธ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์ : ์๋ธ์ฟผ๋ฆฌ๋ ๋๋๋ก ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ํนํ ์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฐ ํ๋ง๋ค ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฏ๋ก ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
2. ์ต์ ํ ํ:
- ์ธ๋ฑ์ค ์ฌ์ฉ: ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ๋ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ์ฌ ์กฐํ ์๋๋ฅผ ๋์ ๋๋ค.
- JOIN ์ฌ์ฉ: ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋ธ์ฟผ๋ฆฌ ๋์ JOIN์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์ํฉ๋๋ค.
3. ๋์ ์ ์: JOIN์ ์ฌ์ฉํ ๋์ฒด ๋ฐฉ๋ฒ
SELECT `e`.`name`, `d`.`name`
FROM `employees` AS `e`
JOIN `departments` AS `d` ON `e`.`department_id` = `d`.`department_id`
WHERE `d`.`location_id` = 1700;
์์ ์ฝ๋๋ ๋ค์์ ์ํํฉ๋๋ค:
- employees ํ ์ด๋ธ๊ณผ departments ํ ์ด๋ธ์ ์กฐ์ธํฉ๋๋ค. ์ด๋ฅผ ์ํด employees ํ ์ด๋ธ์ e๋ผ๋ ๋ณ์นญ์ผ๋ก, departments ํ ์ด๋ธ์ d๋ผ๋ ๋ณ์นญ์ผ๋ก ์ง์ ํฉ๋๋ค.
- ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก๋ employees ํ ์ด๋ธ์ department_id์ departments ํ ์ด๋ธ์ department_id๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์กฐ๊ฑด์ ์์๋ departments ํ ์ด๋ธ์ location_id๊ฐ 1700์ธ ํ๋ง์ ์ ํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ก๋ employees ํ ์ด๋ธ์ ์ง์ ์ด๋ฆ๊ณผ ๊ทธ๋ค์ด ์ํ ๋ถ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
๊ฒฐ๊ณผ
e.name | d.name |
---|---|
Alice | Sales |
Bob | IT |
Charlie | Sales |
Eve | IT |