๐ PostgreSQL ๊ธฐ๋ณธ โ ฆ - ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ ์ด๋ธ ์กฐ์ธ
๐ PostgreSQL ๊ธฐ๋ณธ โ
ฆ - ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ ์กฐ์ธ
๐
ใ์ค์ฉ SQLใ
์ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Join
์ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ ์ฐ๊ฒฐํ๊ธฐ
ANSI SQL
ํ์ค์ ์ผ๋ถ์ธJOIN
์ON
์ ๋ถ์ธ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ํ ์ด๋ธ์ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐํ๋ค.- ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์์ฑํ๋ค.
1
2
3
SELECT *
FROM table_a JOIN table_b
ON table_a.key_column = table_b.foreign_key_column;
- ์ฐธ๊ณ ๋ก
>=
,>
์ ๊ฐ์ ํํ์๋ ๋ถ์ธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ฏ๋ก ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
ํค ์ด๋ก ํ ์ด๋ธ ์กฐ์ธํ๊ธฐ
ํ ์ด๋ธ ์์ฑํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE departments (
dept_id integer,
dept text,
city text,
CONSTRAINT dept_key PRIMARY KEY (dept_id),
CONSTRAINT dept_city_unique UNIQUE (dept, city)
);
CREATE TABLE employees (
emp_id integer,
first_name text,
last_name text,
salary numeric(10,2),
dept_id integer REFERENCES departments (dept_id),
CONSTRAINT emp_key PRIMARY KEY (emp_id)
);
INSERT INTO departments
VALUES
(1, 'Tax', 'Atlanta'),
(2, 'IT', 'Boston');
INSERT INTO employees
VALUES
(1, 'Julia', 'Reyes', 115300, 1),
(2, 'Janet', 'King', 98000, 1),
(3, 'Arthur', 'Pappas', 72700, 2),
(4, 'Michael', 'Taylor', 89500, 2);
dept_id | dept | city |
---|---|---|
1 | Tax | Atlanta |
2 | IT | Boston |
dept_id
์ด์ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ค.- ์ฌ๊ธฐ์ ๊ธฐ๋ณธ ํค๋ ํ ์ด๋ธ์ ๊ฐ ํ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ์ด ๋๋ ์ด ๋ชจ์์ด๋ค.
- ์ ํจํ ๊ธฐ๋ณธ ํค ์ด์ ๋ค์ ์ ์ฝ ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค.
- ์ด ๋๋ ์ด ๋ชจ์์ ๊ฐ ํ์ ๋ํด ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
- ์ด ๋๋ ์ด ๋ชจ์์๋ ๊ฒฐ์ธก๊ฐ์ด ์์ด์ผ ํ๋ค.
CONSTRAINT
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌdepartments
๋ฐemployees
ํ ์ด๋ธ์ ๋ํ ๊ธฐ๋ณธ ํค๋ฅผ ์ ์ํ๋ค.
emp_id | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1 | Julia | Reyes | 115,300 | 1 |
2 | Janet | King | 98,000 | 1 |
3 | Arthur | Pappas | 72,700 | 2 |
4 | Michael | Taylor | 89,500 | 2 |
emp_id
๋ ๊ธฐ๋ณธ ํค,dept_id
์ด์departments
ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐํ๋ ์ธ๋ ํค์ด๋ค.- ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐธ์กฐํ๋ ์ด์ ํด๋น ๊ฐ์ด ์ด๋ฏธ ์กด์ฌํ๊ณ ์์ด์ผ ํ๋ค.
- ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฐํํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ํค์ ๋ฌ๋ฆฌ ์ธ๋ ํค ์ด์ ๋น์ด ์์ ์ ์์ผ๋ฉฐ, ์ค๋ณต๋ ๊ฐ์ด ํ์ฉ๋๋ค.
- ๊ฐ๋ น ๋ ํ
์ด๋ธ ๊ฐ์ ํตํด
Julia
์ ๋ถ์ID
๋ 1์ด๊ณ , ํด๋น ๋ถ์๋Atlanta
์Tax
๋ถ์์์ ์ ์ ์๋ค.
dept | location | first_name | last_name | salary |
---|---|---|---|---|
Tax | Atlanta | Julia | Reyes | 115,300 |
Tax | Atlanta | Janet | King | 98,000 |
IT | Boston | Arthur | Pappas | 72,700 |
IT | Boston | Michael | Taylor | 89,500 |
departments
ํ ์ด๋ธ๊ณผemployees
ํ ์ด๋ธ๋ก ๋๋๋ฏ ๊ผญ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑ ์์๋ก ๋๋ ์ผ ํ ๊น?- ์์ ๊ฐ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ํ ์ด๋ธ์ ํตํฉํ์ฌ ๊ด๋ฆฌํ๋ค๋ฉด ๋ค์ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ฌ๋ฌ ํญ๋ชฉ์ ๋ฐ์ดํฐ๋ฅผ ํ ํ
์ด๋ธ์ ์กฐ์ธํ ๋ ํ์ฐ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๋ฐ๋ณตํด์ผ ํ๋ค.
- ์๋ฐฑ๋ง ๊ฐ์ ํ์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ๋์ด๋ ๊ฒฝ์ฐ ์ค๋ณต๋๋ ๋ฐ์ดํฐ๋ก ์ธํด ๋ฆฌ์์ค๋ฅผ ํฌ๊ฒ ๋ญ๋นํ๊ฒ ๋๋ค.
- ๊ด๋ จ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ ํ
์ด๋ธ์ ๋ฃ๋ ๊ฒ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
- ๋ถ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ค๋ฉด, ํ ์ด๋ธ์ ๊ฐ ํ์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๊ฒ ๋๋ค.
- ๊ทธ๋ฐ๋ฐ, ์ผ๋ถ ํ๋ง ์๋ชป ์ ๋ฐ์ดํธํ๊ฒ ๋๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ํ์ง๋ง ํ ์ด๋ธ์ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค๋ฉด, ๋ถ์ ํ ์ด๋ธ์ ํ ํ๋ง ๊ฐ์ ๋ฐ๊พธ๋ฉด ๋๋ค.
- ์ ๋ณด๊ฐ ์ฌ๋ฌ ํ
์ด๋ธ์ ๊ฑธ์ณ ์ ๊ทํ๋์๋ค๊ณ ํด์ ์ ์ฒด์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด ์ด๋ ต์ง ์๋ค.
JOIN
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
JOIN
์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ
์ด๋ธ ์ฟผ๋ฆฌํ๊ธฐ
- ์ฟผ๋ฆฌ์์ ํ
์ด๋ธ์ ์กฐ์ธํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ง์ ํ ์ด์ ๋ํด
ON
์ ์ ํํ์์true
๋ก ๋ฐํํ๋ ๊ฐ์ด ์๋ ๋ ํ ์ด๋ธ์ ํ์ ์ฐ๊ฒฐํ๋ค. - ๊ทธ๋ฌ๋ฉด ๋ ํ
์ด๋ธ์ ์ด์ ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ์์ฒญํ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ํฌํจ๋๊ฑฐ๋ ์กฐ์ธ๋ ํ
์ด๋ธ์ ์ด์ ์ฌ์ฉํ์ฌ
WHERE
์ ๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ ์๋ ์๋ค. JOIN
์ ์ฌ์ฉํ๋ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
1
2
3
4
SELECT *
FROM employees JOIN departments
ON employees.dept_id = departments.dept_id
ORDER BY employees.dept_id;
emp_id | first_name | last_name | salary | dept_id | dept_id | dept | city |
---|---|---|---|---|---|---|---|
1 | Julia | Reyes | 115,300 | 1 | 1 | Tax | Atlanta |
2 | Janet | King | 98,000 | 1 | 1 | Tax | Atlanta |
3 | Arthur | Pappas | 72,700 | 2 | 2 | IT | Boston |
4 | Michael | Taylor | 89,500 | 2 | 2 | IT | Boston |
- ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ์๋ ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์ด์ด ๋ํ๋๊ธฐ ๋๋ฌธ์,
dept_id
์ด์ด ๋ ๋ฒ ๋ฑ์ฅํ๋ค. - ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๋ ํ ์ด๋ธ์์ ์ํ๋ ์ด๋ง ๊ฒ์ํด์ผ ํ๋ค.
JOIN
์ ํ ์ดํดํ๊ธฐ
- ๋ค์์ ๋ค์ํ ์ข
๋ฅ์
JOIN
์ ๋ํ ์์์ด๋ค.
JOIN
INNER JOIN
์ผ๋ก ๋์ฒดํ ์ ์๋ค.- ๋ ํ ์ด๋ธ์ ์กฐ์ธ๋ ์ด์์ ์ผ์นํ๋ ๊ฐ์ด ์๋ ๋ ํ ์ด๋ธ์ ํ์ ๋ฐํํ๋ค.
LEFT JOIN
- ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ฐํํ๋ค.
SQL
์ด ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ์ ์ฐพ์ผ๋ฉด ํด๋น ํ์ ๊ฐ์ด ํฌํจ๋๋ค.- ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๊ฐ์ ํ์๋์ง ์๋๋ค. -
RIGHT JOIN
- ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ฐํํ๋ค.
SQL
์ด ์ผ์ชฝ ํ ์ด๋ธ์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ์ ์ฐพ์ผ๋ฉด ํด๋น ํ์ ๊ฐ์ด ํฌํจ๋๋ค.- ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ผ์ผ์ชฝ ํ
์ด๋ธ์ ๊ฐ์ ํ์๋์ง ์๋๋ค. -
FULL OUTER JOIN
- ๋ ํ ์ด๋ธ์์ ๋ชจ๋ ํ์ ๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์ผ์นํ๋ ํ์ ์ฐ๊ฒฐํ๋ค.
- ๋ฐ๋ ํ
์ด๋ธ์ ์ผ์นํ๋ ํ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ค๋ฅธ ํ
์ด๋ธ์ ๋ํ ๋น ๊ฐ์ด ํฌํจ๋๋ค. -
CROSS JOIN
- ๋ ํ ์ด๋ธ์์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๋ฐํํ๋ค.
JOIN
์ ์ดํด๋ณด๊ธฐ ์ํ ๋ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE district_2020 (
id integer CONSTRAINT id_key_2020 PRIMARY KEY,
school_2020 text
);
CREATE TABLE district_2035 (
id integer CONSTRAINT id_key_2035 PRIMARY KEY,
school_2035 text
);
INSERT INTO district_2020 VALUES
(1, 'Oak Street School'),
(2, 'Roosevelt High School'),
(5, 'Dover Middle School'),
(6, 'Webutuck High School');
INSERT INTO district_2035 VALUES
(1, 'Oak Street School'),
(2, 'Roosevelt High School'),
(3, 'Morrison Elementary'),
(4, 'Chase Magnet Academy'),
(6, 'Webutuck High School');
JOIN
(INNER JOIN
)
1
2
3
4
SELECT *
FROM district_2020 JOIN district_2035
ON district_2020.id = district_2035.id
ORDER BY district_2020.id;
- ์ ์ฝ๋์ ๊ฐ์ด
JOIN
์ ์ฌ์ฉํ ์ด์์ ์ผ์นํ๋ ํ์ ๋ฐํํ๋ ค๋ฉดJOIN
๋๋INNER JOIN
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. - ๋ ํ
์ด๋ธ์ ๋์์ ์กด์ฌํ๋ ํ๊ต
ID
๊ฐ ์ธ ๊ฐ์ด๋ฏ๋ก ์ฟผ๋ฆฌ๋ ํด๋นID
๋ฅผ ๊ฐ์ง ์ธ ๊ฐ์ ํ๋ง ๋ฐํํ๋ค. - ๋ํ
JOIN
ํค์๋ ์ผ์ชฝ์ ์ ์ ํ ์ด๋ธ์ ์ด์ด ๊ฒฐ๊ณผ ํ ์ด๋ธ์์ ์์ ํ์๋๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค. JOIN
ํค์๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ตฌ์กฐํ๋๊ณ , ์ ์ง ๊ด๋ฆฌ๊ฐ ์ ๋ ๋ฐ์ดํฐ์ ์์ ๋ ํ ์ด๋ธ ๋ชจ๋์ ์กด์ฌํ๋ ํ๋ง ์ฐพ์์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
JOIN
์์ USING
์ฌ์ฉํ๊ธฐ
1
2
3
4
SELECT *
FROM district_2020 JOIN district_2035
USING (id)
ORDER BY district_2020.id;
JOIN
์ON
์ ์ ์ฌ์ฉํ๋ ์ด ์ด๋ฆ์ด ๋์ผํ ๊ฒฝ์ฐUSING
ํค์๋๋ฅผ ์ฌ์ฉํด ์ค๋ณต ์ถ๋ ฅ์ ์ค์ด๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์ค์ผ ์ ์๋ค.- ๋ ์ด์์ ์ด์ ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ ์ผํ๋ก ๊ตฌ๋ถํ๋ค.
- ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
id | school_2020 | school_2035 |
---|---|---|
1 | Oak Street School | Oak Street School |
2 | Roosevelt High School | Roosevelt High School |
6 | Webutuck High School | Webutuck High School |
LEFT JOIN
๊ณผ RIGHT JOIN
JOIN
๊ณผ ๋ฌ๋ฆฌ ๊ฐ๊ฐ ํ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ฐํํ๋ฉฐ, ๋ค๋ฅธ ํ ์ด๋ธ์ ์ผ์นํ๋ ๊ฐ์ด ์๋ ํ์ด ์กด์ฌํ๋ค๋ฉด, ๊ฒฐ๊ณผ์ ํด๋น ํ์ ๊ฐ์ ํฌํจํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
-- LEFT JOIN
SELECT *
FROM district_2020 LEFT JOIN district_2035
ON district_2020.id = district_2035.id
ORDER BY district_2020.id;
-- RIGHT JOIN
SELECT *
FROM district_2020 RIGHT JOIN district_2035
ON district_2020.id = district_2035.id
ORDER BY district_2035.id;
id | school_2020 | id | school_2035 |
---|---|---|---|
1 | Oak Street School | 1 | Oak Street School |
2 | Roosevelt High School | 2 | Roosevelt High School |
5 | Dover Middle School | ย | ย |
6 | Webutuck High School | 6 | Webutuck High School |
JOIN
์ ์ผ์ชฝ์ ์๋ ํ 4๊ฐ๊ฐ ๋ชจ๋ ํ์๋๊ณ , ์ฐ์ธก ํ ์ด๋ธ์๋id
๊ฐ 5์ธ ํ์ด ์์ผ๋ฏ๋ก ๊ฐ์ ๋น์ ํ์ํ๋ค.
id | school_2020 | id | school_2035 |
---|---|---|---|
1 | Oak Street School | 1 | Oak Street School |
2 | Roosevelt High School | 2 | Roosevelt High School |
ย | ย | 3 | Morrison Elementary |
ย | ย | 4 | Chase Magnet Academy |
6 | Webutuck High School | 6 | Webutuck High School |
RIGHT JOIN
๋ ๋ง์ฐฌ๊ฐ์ง๋ค.JOIN
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉดON
๋์USING
์ ์ฌ์ฉํ ์ ์๋ค.- ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ํฉ์์
LEFT JOIN
๊ณผRIGHT JOIN
์ ์ฌ์ฉํ๊ฒ ๋๋ค.
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ํ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ด ํฌํจ๋๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
- ํ ์ด๋ธ ์ค ํ๋์์ ๊ฒฐ์ธก๊ฐ์ ๋ชจ๋ ์ฐพ์ผ๋ ค๋ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์๋ฉด ์๋ก ๋ค๋ฅธ ๋ ๊ธฐ๊ฐ์ ๋ํ๋ด๋ ํญ๋ชฉ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ ๊ฒฝ์ฐ
- ์กฐ์ธ๋ ํ ์ด๋ธ์ ์ผ๋ถ ํ์ ์ผ์นํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ
FULL OUTER JOIN
1
2
3
4
SELECT *
FROM district_2020 FULL OUTER JOIN district_2035
ON district_2020.id = district_2035.id
ORDER BY district_2020.id;
id | school_2020 | id | school_2035 |
---|---|---|---|
1 | Oak Street School | 1 | Oak Street School |
2 | Roosevelt High School | 2 | Roosevelt High School |
5 | Dover Middle School | ย | ย |
6 | Webutuck High School | 6 | Webutuck High School |
ย | ย | 4 | Chase Magnet Academy |
ย | ย | 3 | Morrison Elementary |
- ์ผ์น ์ฌ๋ถ์ ๊ด๊ณ ์์ด ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ณด๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
CROSS JOIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- ์ผ๋ฐ์ ์ธ ์ฌ์ฉ
SELECT *
FROM district_2020 CROSS JOIN district_2035
ORDER BY district_2020.id, district_2035.id;
-- ์ผํ(,) ๋์ฒด
SELECT *
FROM district_2020, district_2035
ORDER BY district_2020.id, district_2035.id;
-- JOIN ... ON true ๋์ฒด
SELECT *
FROM district_2020 JOIN district_2035 ON true
ORDER BY district_2020.id, district_2035.id;
- ์ผ์ชฝ ํ ์ด๋ธ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๊ฐ ํ์ ์ ๋ ฌํ์ฌ ๊ฐ๋ฅํ ๋ชจ๋ ํ ์กฐํฉ์ ๋ํ๋ธ๋ค.
- ๊ท๋ชจ๊ฐ ํฐ ํ
์ด๋ธ์์๋
CROSS JOIN
์ ํผํ๋ ๊ฒ์ด ์ข๋ค. - ๊ฐ๋ น ๊ฐ๊ฐ 25๋ง ๊ฐ์ ํ์ ๊ฐ์ง ๋ ํ
์ด๋ธ์
CROSS JOIN
ํ๋ค๋ฉด 625์ต ํ์ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํ๋ค.
NULL
์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ธก๊ฐ์ด ์๋ ํ ์ฐพ๊ธฐ
- ํ ์ด๋ธ์ ์กฐ์ธํ ๋๋ง๋ค ํ ํ ์ด๋ธ์ ํค ๊ฐ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ํ๋๋์ง, ๋๋ฝ๋ ๊ฐ์ ์๋์ง ์กฐ์ฌํด์ผ ํ๋ค.
- ์ด๋ค ์ด์ ์์๋ผ๋ ๋ถ์ผ์น๋ ์๊ธฐ๊ธฐ ๋ง๋ จ์ด๊ณ , ์ด๋ค ๋ฐ์ดํฐ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋์์ ์๋ ์๋ค.
- ์๋ฅผ ๋ค์ด ์์ ํ ํ ์ด๋ธ์๋ ์ด์ ์ ํ ํ ์ด๋ธ์๋ ์๋ ์ฝ๋๊ฐ ํฌํจ๋์์ ์ ์๋ค.
- ํ์ด ๋ง์ง ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ํ์ด๋ณผ ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ํ์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ง๋ง, ํฐ ํ ์ด๋ธ์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ ์ผ์นํ์ง ์๋ ๋ชจ๋ ํ์ ํ์ํ๋ ํํฐ๋ง ์ ๋ต์ด ํ์ํ๋ค.
- ์ด๋ฅผ ์ํด
NULL
ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
1
2
3
4
SELECT *
FROM district_2020 LEFT JOIN district_2035
ON district_2020.id = district_2035.id
WHERE district_2035.id IS NULL;
id | school_2020 | id | school_2035 |
---|---|---|---|
5 | Dover Middle School | ย | ย |
- ๊ฒฐ๊ณผ๋ ์ผ์ชฝ ํ ์ด๋ธ์ ํ ์ค ์ค๋ฅธ์ชฝ ํ ์ด๋ธ๊ณผ ์ผ์นํ์ง ์๋ ๊ฐ๋ง ํ์ํ๋ค.
- ์ด๋ฐ ์กฐ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ์ํฐ ์กฐ์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ํ ์ค ์ผ์ชฝ ํ
์ด๋ธ๊ณผ ์ผ์นํ์ง ์๋ ๊ฐ์ ํ์ํ๋ ค๋ฉด
RIGHT JOIN
์ผ๋ก ๋ฐ๊พธ๊ณ ,WHERE
์ ์district_2020.id IS NULL
๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
์ธ ๊ฐ์ง ์ ํ์ ํ ์ด๋ธ ๊ด๊ณ ์ดํดํ๊ธฐ
- ํ ์ด๋ธ ๊ด๊ณ์ ์ธ ๊ฐ์ง ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ผ๋์ผ ๊ด๊ณ
- ๋ ํ
์ด๋ธ์์
ID
๊ฐ ๊ฐ์ ํ์ด ํ๋์ฉ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ๋ ํ
์ด๋ธ์์
- ์ผ๋๋ค ๊ด๊ณ
- ํ ํ ์ด๋ธ์ ํค ๊ฐ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ ์ฌ๋ฌ ์ด๊ณผ ๋งค์นญ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ๊ฐ๋ น ์ ์กฐ์ ์ฒด ํ ์ด๋ธ๊ณผ ์๋์ฐจ ํ ์ด๋ธ์ ๊ทธ ์์๋ก ๋ค ์ ์๋ค.
- ๋ค๋๋ค ๊ด๊ณ
- ํ ํ ์ด๋ธ์ ์ฌ๋ฌ ํญ๋ชฉ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ ์ฌ๋ฌ ํญ๋ชฉ๊ณผ ๋งค์นญ๋๋ ๊ฒฝ์ฐ์ด๋ค.
์กฐ์ธ์์ ํน์ ์ด ์ ํํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- ์ค๋ฅ ๋ฐ์
SELECT id
FROM district_2020 LEFT JOIN district_2035
ON district_2020.id = district_2035.id;
-- ๋ณ์นญ ๋ฏธ์ฌ์ฉ
SELECT district_2020.id,
district_2020.school_2020,
district_2035.school_2035
FROM district_2020 LEFT JOIN district_2035
ON district_2020.id = district_2035.id
ORDER BY district_2020.id;
-- ๋ณ์นญ ์ฌ์ฉ
SELECT d20.id,
d20.school_2020,
d35.school_2035
FROM district_2020 AS d20 LEFT JOIN district_2035 AS d35
ON d20.id = d35.id
ORDER BY d20.id;
- ํน์ ์ด์ ์ ํํ๋ ค๋ฉด
SELECT
ํค์๋ ์ดํ ์ํ๋ ์ด ์ด๋ฆ์ ๋์ดํ๋ค. - ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋
id
๊ฐ ์ํ๋ ํ ์ด๋ธ์ ์ง์ ํ์ง ์์ ์ด๋ค ํ ์ด๋ธ์id
๋ฅผ ๋งํ๋ ๊ฑด์ง ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. - ์ค๋ฅ๋ฅผ ์์ ํ๋ ค๋ฉด
district_2020.id
์ ๊ฐ์ด ํ ์ด๋ธ ์ด๋ฆ์ ์ถ๊ฐํด์ผ ํ๋ค. AS
ํค์๋๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋จ์ถํ ์ ์์ผ๋ฉฐ, ๋ณ์นญ์ ์ฌ์ฉํ๋๋ผ๋AS
ํค์๋๋ ์๋ตํด๋ ๋๋ค.
์ฌ๋ฌ ํ ์ด๋ธ ์กฐ์ธํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE district_2020_enrollment (
id integer,
enrollment integer
);
CREATE TABLE district_2020_grades (
id integer,
grades varchar(10)
);
INSERT INTO district_2020_enrollment
VALUES
(1, 360),
(2, 1001),
(5, 450),
(6, 927);
INSERT INTO district_2020_grades
VALUES
(1, 'K-3'),
(2, '9-12'),
(5, '6-8'),
(6, '9-12');
- ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ๊ธฐ ์ํด ์ฐ์ ์์ ํ ์ด๋ธ์ ์์ฑํ์.
1
2
3
4
5
6
7
8
9
SELECT d20.id,
d20.school_2020,
en.enrollment,
gr.grades
FROM district_2020 AS d20 JOIN district_2020_enrollment AS en
ON d20.id = en.id
JOIN district_2020_grades AS gr
ON d20.id = gr.id
ORDER BY d20.id;
id | school_2020 | enrollment | grades |
---|---|---|---|
1 | Oak Street School | 360 | K-3 |
2 | Roosevelt High School | 1,001 | 9-12 |
5 | Dover Middle School | 450 | 6-8 |
6 | Webutuck High School | 927 | 9-12 |
- ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ ์กฐ์ธ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์ ๋ ๋ง์ ํ ์ด๋ธ์ ์กฐํํ ์ ์๋ค.
์งํฉ ์ฐ์ฐ์๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฒฐํฉํ๊ธฐ
- ์ด๋ค ์ธ์คํด์ค๋ ์กฐ์ธ ๊ฒฐ๊ณผ์ฒ๋ผ ๋ค์ํ ํ ์ด๋ธ์ ์ด์ด ๋๋ํ ๋ฐํ๋์ง ์๊ณ ํ๋์ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ๋ ฌํด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฌ์กฐ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋
ANSI SQL
ํ์ค์ธ ์งํฉ ์ฐ์ฐ์UNION
,INTERSECT
,EXCEPT
๊ฐ ์๋ค.
UNION
- ๋ ์ฟผ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ฉด, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ํ์ ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ์ถ๊ฐํ๊ณ ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ๊ฒฐํฉ๋ ๊ณ ์ ํ ์งํฉ์ ์์ฑํ๋ค.
- ๊ตฌ๋ฌธ์
UNION ALL
๋ก ์์ ํ๋ฉด ์ค๋ณต์ ํฌํจํ ๋ชจ๋ ํ์ด ๋ฐํ๋๋ค.
INTERSECT
- ๋ ์ฟผ๋ฆฌ์ ๋ชจ๋ ์กด์ฌํ๋ ํ๋ง ๋ฐํํ๊ณ , ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
EXCEPT
- ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ ์์ง๋ง, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ ์๋ ํ์ ๋ฐํํ๋ค.
- ์ค๋ณต์ด ์ ๊ฑฐ๋๋ค.
UNION
๊ณผ UNION ALL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- UNION
SELECT * FROM district_2020
UNION
SELECT * FROM district_2035
ORDER BY id;
-- UNION ALL
SELECT * FROM district_2020
UNION ALL
SELECT * FROM district_2035
ORDER BY id;
-- UNION ์ฟผ๋ฆฌ ์ปค์คํฐ๋ง์ด์ง
SELECT '2020' AS year,
school_2020 AS school
FROM district_2020
UNION ALL
SELECT '2035' AS year,
school_2035
FROM district_2035
ORDER BY school, year;
- ์ค๋ณต์ ์ ๊ฑฐํ๋ ค๋ฉด
UNION
, ์ค๋ณต์ ํฌํจํ๋ ค๋ฉดUNION ALL
, ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ์ฌ ํฉ์น๋ ๊ณผ์ ์์ ์ด์ ์ถ๊ฐํ ์๋ ์๋ค.
INTERSECT
์ EXCEPT
1
2
3
4
5
6
7
8
9
SELECT * FROM district_2020
INTERSECT
SELECT * FROM district_2035
ORDER BY id;
SELECT * FROM district_2020
EXCEPT
SELECT * FROM district_2035
ORDER BY id;
id | school_2020 |
---|---|
1 | Oak Street School |
2 | Roosevelt High School |
6 | Webutuck High School |
INTERSECT
ํค์๋๋ ๋ ํ ์ด๋ธ์ ์๋ ๊ณตํต ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๋ค.
id | school_2020 |
---|---|
5 | Dover Middle School |
EXCEPT
ํค์๋๋ ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ์์ง๋ง, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ ์๋ ํ๋ง์ ๋ฐํํ๊ณ , ์ค๋ณต์ ์ ๊ฑฐํ๋ค.- ์ด๋ฌํ ํค์๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฌํ ์ ์๋ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์กฐ์ธ๋ ํ ์ด๋ธ ์ด์์ ์ํ ๊ณ์ฐ ์ํํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE us_counties_pop_est_2010 (
state_fips text,
county_fips text,
region smallint,
state_name text,
county_name text,
estimates_base_2010 integer,
CONSTRAINT counties_2010_key PRIMARY KEY (state_fips, county_fips)
);
COPY us_counties_pop_est_2010
FROM 'C:\YourDirectory\us_counties_pop_est_2010.csv'
WITH (FORMAT CSV, HEADER);
SELECT c2019.county_name,
c2019.state_name,
c2019.pop_est_2019 AS pop_2019,
c2010.estimates_base_2010 AS pop_2010,
c2019.pop_est_2019 - c2010.estimates_base_2010 AS raw_change,
round( (c2019.pop_est_2019::numeric - c2010.estimates_base_2010)
/ c2010.estimates_base_2010 * 100, 1 ) AS pct_change
FROM us_counties_pop_est_2019 AS c2019
JOIN us_counties_pop_est_2010 AS c2010
ON c2019.state_fips = c2010.state_fips
AND c2019.county_fips = c2010.county_fips
ORDER BY pct_change DESC;
- ์ํ ํจ์๋ ์กฐ์ธ๋ ํ ์ด๋ธ์์๋ ์ฌ์ฉํ ์ ์๋ค.
county_name | state_name | pop_2019 | pop_2010 | raw_change | pct_change |
---|---|---|---|---|---|
McKenzie County | North Dakota | 15,024 | 6,359 | 8,665 | 136.3 |
Loving County | Texas | 169 | 82 | 87 | 106.1 |
Williams County | North Dakota | 37,589 | 22,399 | 15,190 | 67.8 |
Hays County | Texas | 230,191 | 157,103 | 73,088 | 46.5 |
Wasatch County | Utah | 34,091 | 23,525 | 10,566 | 44.9 |
Comal County | Texas | 156,209 | 108,520 | 47,689 | 43.9 |
Trousdale County | Tennessee | 11,284 | 7,864 | 3,420 | 43.5 |
raw_change
์ด์ 2019๋ ์ถ์ ์น์์ 2010๋ ์ถ์ ์น๋ฅผ ๋บ ๊ฐ์ด๋ค.pct_change
์ด์ 2010๋ ๊ณผ 2019๋ ์ฌ์ด์ ๋ณํ์จ์ ๊ณ์ฐํ ๊ฐ์ด๋ค.- ๋ ํ
์ด๋ธ์์ ์ฃผ ์ฝ๋์ ์นด์ดํฐ ์ฝ๋์ ์กฐํฉ์ด ๊ณ ์ ํ ์นด์ดํฐ๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์,
AND
๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ํตํด ๋ ์กฐ๊ฑด์ ๊ฒฐํฉํ๋ค.
This post is licensed under CC BY 4.0 by the author.