π PostgreSQL κΈ°λ³Έ 07 - κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μμ ν μ΄λΈ μ‘°μΈ
π PostgreSQL κΈ°λ³Έ 07 - κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μμ ν
μ΄λΈ μ‘°μΈ
π
γμ€μ© 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μ λν μμμ΄λ€.
JOININNER 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.
