6์ฅ. SQL ๋ฌธ์ ๊ธฐ๋ณธ
SELECT ๋ฌธ์ ์ดํด
- SELECT
- INSERT, UPDATE, DELETE
- VIEW
- SUBQUERY
- JOIN
- ์ฒดํฌํฌ์ธํธ
๐ง SQL์ ์ ์ฌ์ฉํ ๊น?
์์ฆ์ ORM์ผ๋ก ์์ ์ ๋ง์ด ํ๋๊น SQL.. ์์ธํ ๋ชฐ๋ผ๋ ๋๋๊ฑฐ ์๋๊น? SQL์ ์์์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
โ๏ธ ORM์ SQL์ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ, ์ ๊ทผ์ฑ์ ์ํด ๋ง๋ค์ด์ง ํ๋์ ๋๊ตฌ
- ORM์ด ์ ๋์ค๊ฒ ๋์๋์ง
- SQL ๋์์๋ฆฌ๋ ์ด๋ป๊ฒ ๋๊ฑด์ง
- ORM์ด ์์ ๋๋ ์ด๋ป๊ฒ ํด์ผํ๋์ง
์ ์ผ ์ค์ํ ๊ฒ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ, DB์ ์ง์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ๊ฑฐ๋ ํํฐ๋ง ํ ์ ์์ด์ผ ํฉ๋๋ค.
SELECT ๋ฌธ
- MySQL CLI๋ฅผ ์คํํ์ฌ ๋ก๊ทธ์ธ์ ํ ํ
- MySQL ์๋ฒ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชฉ๋ก ํ์
mysql> show databases;
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ
mysql> use DB๋ช
;
- ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ๋ชฉ๋ก ํ์
mysql> show tables;
์ฐ์ฐ์ ์ฐ์ ์์(MySQL)
์ฐ์ฐ์ | ์ฐ์ ์์ |
INTERVAL | ๋์ |
BINARY, COLLATE | |
-(๋จํญ ๊ฐ์ฐ), ~(๋จํญ ๋นํธ ๋ฐ์ ) | |
^ | |
*, /, DIV, %, MOD | |
-, + | |
& | |
| | |
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN | |
BETWEEN, CASE, WHEN, THEN, ELSE | |
NOT | |
&&, AND | |
XOR | |
||, OR | |
=(๋์ ๋ฑํธ), := | ๋ฎ์ |
SQL์ ๊ธฐ์ด์ ์ธ ๊ธฐ์ ๊ท์น
- SQL ๋ฌธ์ ๋ง์ง๋ง์ ๋๋ฆฌ๋ฏธํฐ๋ฅผ ๋ถ์ธ๋ค (๋๋ถ๋ถ ์ธ๋ฏธ์ฝ๋ก )
- ํค์๋๋ case-sensitive ํ์ง ์๋ค (select์ SELECT๋ ๊ฐ๋ค)
- ์ ์๋ ๊ทธ๋๋ก ์ด๋ค. ๋ฌธ์์ด, ๋ ์ง ๋ฐ ์๊ฐ์ ์์ ๋ฐ์ดํ๋ก ๊ฐ์ผ๋ค
- ๋จ์ด๋ ๋ฐ๊ฐ ์คํ์ด์ค๋ ๊ฐํ์ผ๋ก ๊ตฌ๋ณํ๋ค
DISTINCT
์ ํํ ํ์์ ์ค๋ณต๋ ๊ฐ์ด ์๊ณ ์ด๋ฅผ ์์ ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ
SELECT DISTINCT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด;
ORDER BY
SELECT ~ FROM ํ
์ด๋ธ๋ช
ORDER BY ์ ๋ ฌํค1[, ์ ๋ ฌํค2, ... DESC/ASC];
- ํ์ ์์๋ฅผ ํ์คํ ๊ฐ๊ฒ ํ๋ ค๋ฉด ํ์ ์ ๋ ฌํค๋ฅผ uniqueํ๊ฒ ์ ํด์ผ ํจ
- ์ ๋ ฌํค๊ฐ ๊ฐ์ ๊ฐ์ ํ์ด ๋ณต์ ๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ํ๋ค์ ์์๋ ์ผ์ ํ์ง ์๊ธฐ ๋๋ฌธ
- ๊ธฐ๋ณธ๊ฐ : ASC(์ค๋ฆ์ฐจ์)
์ง์ฝํจ์
๊ธฐ๋ณธ์ ์ผ๋ก NULL์ ์ ์ธํ๊ณ ์ง๊ณ
COUNT ํจ์๋ง์ 'COUNT(*)'๋ก ํ๊ธฐ(NULL์ ํฌํจํ ์ ์ฒด ํ ์ง๊ณ)
- COUNT ํ ์ด๋ธ ํ์
- SUM ํ ์ด๋ธ ์์น ๋ฐ์ดํฐ ํฉ๊ณ
- AVG ํ ์ด๋ธ ์์น ๋ฐ์ดํฐ ํ๊ท
- MAX ํ ์ด๋ธ ์์์ด ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ
- MIN ํ ์ด๋ธ ์์์ด ๋ฐ์ดํฐ ์ต์๊ฐ
- (MySQL only) GROUP_CONCAT ๋ฌธ์์ด ๊ฒฐํฉ, ์ฝค๋ง๋ก ๊ตฌ๋ถ
# GROUP_CONCAT๊ณผ DISTINCT๋ก ์ค๋ณต ํํผ
# ์ค๋ณต์ด ์์ด์ง๊ณ ํ์ ๊ตฌ์ญ์ด 1ํ๋ง ์กฐํ
mysql> SELECT GROUP_CONCAT(DISTINCT district) FROM CITY WHERE COUNTRYCODE='KOR';
GROUP BY
๋ฐ์ดํฐ๋ฅผ ๋ช ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์ง์ฝํ๋ ๊ฒ
SELECT ~ FROM ํ
์ด๋ธ๋ช
GROUP BY ์ปฌ๋ผ๋ช
1 [, ์ปฌ๋ผ๋ช
2, ...];
- GROUP BY๋ก ์ง์ ํ ์ด : ์ง์ฝ ํค, ๊ทธ๋ฃนํ ํค
- ๋ณต์ ์ด์ ์ฝค๋ง๋ก ๊ตฌ๋ถํด ์ง์
HAVING
๊ทธ๋ฃน๋ง๋ค ์ง์ฝํ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์ ํํ๋ ๊ฒ
SELECT ~ FROM GROUP BY ~ HAVING ๊ทธ๋ฃน์ ๊ฐ์ ๋ํ ์กฐ๊ฑด;
์์ฑ ์์
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
์คํ ์์
- FROM
- ON, WHERE
- JOIN, GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT (MySQL) / ROWNUM (Oracle)
UPDATE, INSERT, DELETE ๋ฌธ
UPDATE
UPDATE ํ
์ด๋ธ๋ช
SET ์ปฌ๋ผ๋ช
1=๊ฐ1[,์ปฌ๋ผ๋ช
2=๊ฐ2,...] WHERE ์กฐ๊ฑด;
- ๊ฐฑ์ ํ๋ ์ด์ ๋ํดํธ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ : ๊ฐ ๋์ 'DEFAULT' ํค์๋๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐฑ์ ๋จ
INSERT
- INSERT๋ ํ ๋จ์๋ก ์ํ๋๋ฏ๋ก ํ
์ด๋ธ ์ ์๋ฅผ ์ ํํ ํ์ธ ํ ์คํ๋์ด์ผ ํจ
- \G๋ ; ๋์ ์ ์ฌ์ฉํ ์ ์๋ ๋๋ฆฌ๋ฏธํฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ก๋ก ๋ณด๊ธฐ ์ฝ๊ฒ ํจ
SHOW CREATE TABLE ํ
์ด๋ธ๋ช
\G
# ํ
์ด๋ธ ์ ์ ์์ฒด๊ฐ ์๋ ๋จ์ํ ์ด ์ ๋ณด ์กฐํ์ฉ (Oracle ํธํ)
DESC ํ
์ด๋ธ๋ช
;
- INSERT๋ฌธ
# ๊ธฐ๋ณธ
INSERT INTO ํ
์ด๋ธ๋ช
(์ปฌ๋ผ1[,์ปฌ๋ผ2,...]) VALUES (๊ฐ1[,๊ฐ2,...]);
# Multi row insert (MySQL)
INSERT INTO city (name, code, district) VALUES ('Gimpo', 'KOR', 'Kyonggi'),
('Seongnam', 'KOR', 'Kyonggi'), ('Hwaseong', 'KOR', 'Kyonggi');
# ์์ฃผ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ
INSERT INTO ํ
์ด๋ธ1 SELECT FROM ํ
์ด๋ธ2; # SELECT๋ฌธ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ ์ฝ๋๋ก ์
๋ ฅ
DELETE
DELETE FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด;
VIEW
๊ฐ์์ ํ ์ด๋ธ, ์ ๊ทผ์ด ํ์ฉ๋ ๋ฐ์ดํฐ๋ง ๋ณด์ฌ์ค ์ ์์(ํ ์ด๋ธ๊ณผ ๋์ผํ์ง๋ง ํ ์ด๋ธ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ ๊ฐ์ง๊ณ ์์ง ์์)
VIEW ์ธ์ ์ธ๊น? VIEW์ ์ด์
์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ ๋ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ํํ์!
- ํธ๋ฆฌ์ฑ : ๋ณต์กํ SELECT ๋ฌธ์ ์ผ์ผ์ด ๋งค๋ฒ ๊ธฐ์ ํ ํ์๊ฐ ์๋ค. ๋ฐ์ดํฐ ์ ์ฅ ์์ด(๊ธฐ์ต์ฅ์น์ ์ฉ๋์ ์ฌ์ฉํ์ง ์๊ณ ) ์คํํ ์ ์๋ค.
- ๋ณด์์ฑ : ํ์ํ ์ด๊ณผ ํ๋ง ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ ์๋ค. ๋ฏผ๊ฐํ ์ปฌ๋ผ์ ๋ง์คํนํ๊ธฐ
- ๋ ๋ฆฝ์ฑ : ๊ธฐ์กด ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ํจ๊ป ๋ณ๊ฒฝ, ๊ฐฑ์ ์์๋ ๋ทฐ ์ ์์ ๋ฐ๋ฅธ ๊ฐฑ์ ์ผ๋ก ํ์ ํ ์ ์๋ค. ๋ทฐ๋ฅผ ์ ๊ฑฐ(DROP VIEW)ํด๋ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
VIEW ์์ฑ
CREATE VIEW ๋ทฐ์ด๋ฆ(์ด๋ช
1[, ์ด๋ช
2, ...]) AS SELECT๋ฌธ;
VIEW ์ ๋ ฅ, ๊ฐฑ์ ์ ํ
- ๊ฐฑ์ ๋ถ๊ฐ
- ์ด๋ค ํ์ด ๋์ํ๋์ง ๋ชจ๋ฅด๊ฑฐ๋ ์ด๋ค ๊ฐ์ ๋ฃ์ผ๋ฉด ์ข์์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ
- ์ฝ์
๋ถ๊ฐ
- 2๊ฐ์ง ์ด์ ํ ์ด๋ธ์ ์กฐํฉํด ์์ฑํ ๋ทฐ๋ฅผ ๊ฐฑ์ ํ ๋ ์ด๋ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ฉด ์ข์์ง ์ ์ ์๋ ๊ฒฝ์ฐ
- ์ ํ๋ ์ด ์ด์ธ์ ์ด์ ๊ธฐ๋ณธ๊ฐ๋ ์๊ณ NULL๋ ํ์ฉ๋์ง ์๋ ์ํฉ (ํด๋น ์ด์ ๋ฃ์ ์ ์๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ)
SUBQUERY
ํ๋์ SQL ๋ฌธ์ ํฌํจ๋์ด ์๋ ๋ ๋ค๋ฅธ SQL ๋ฌธ
์ฃผ์์ฌํญ
- ๊ดํธ๋ก ๊ฐ์ธ์ ์ฌ์ฉํ ๊ฒ
- ORDER BY๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค
- ๋จ์ผ ํ ๋๋ ๋ณต์ ํ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค
SELECT -- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
FROM -- ์ธ๋ผ์ธ ๋ทฐ
WHERE -- ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ ๋ฑ
HAVING -- ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ ๋ฑ
ORDER BY -- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
-- ํ
์ด๋ธ2์ ์ ๋ณด๋ฅผ ๋ฝ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ1์ ๋ฃ์ด์ค๋ค.
-- value()๋ค์ด๊ฐ ์๋ฆฌ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ก ๋์ฒด ํ๋ค.
INSERT INTO table1 (SELECT * FROM table2);
-- ์ธํด์ ์ ๋ณด๋ฅผ ๊ตฌํด์์ ์ญ์ ํ๋ค.
DELETE FROM employee
WHERE id = (SELECT id FROM employee where office_worker = '์ธํด' );
-- ์ธํด์ ์ ๋ณด๋ฅผ ๊ตฌํด์์ ๊ธ์ฌ๋ฅผ 10๋ง์ ์ธ์ํ๋ค.
UPDATE employee SET salary=(salary+100000)
WHERE id = (SELECT id FROM employee where office_worker = '์ธํด' );
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ : ํ ํ๋ง ๋ฐํ
- ์ธ๋ผ์ธ ๋ทฐ : SQL๋ฌธ์ด ์คํ๋ ๋๋ง ์์ฑ๋๋ ๋ทฐ์ด๊ธฐ ๋๋ฌธ์ DB์ ์ ์ฅ๋์ง ์์ (๋์ , ์์์ )
- ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ : =, <, <=, >, >=, <> ์ฐ์ฐ์๋ก ์ป์ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ 1๊ฐ ์ดํ ํ์ ๋ฐํ
- ๋ณต์ ํ(์ค์ฒฉ) ์๋ธ์ฟผ๋ฆฌ : IN, ANY, ALL, EXISTS ๋ฑ์ ์ฐ์ฐ์๋ก ์ป์ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฌ๋ฌ๊ฐ ํ์ ๋ฐํ
JOIN
2๊ฐ ์ด์์ ํ ์ด๋ธ์ ๊ฒฐํฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ฒ
ON ์ ์ด์ฉํด์ ๊ฒฐํฉ์กฐ๊ฑด์ ์ง์ ํด์ฃผ์ด์ผ ํจ
INNER JOIN
ON ์ผ๋ก ์ง์ ํ ๊ฒฐํฉ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ๋ง์ 2๊ฐ์ ํ ์ด๋ธ๋ก๋ถํฐ ๊ฐ์ ธ์ค๋ ๊ฒ
SELECT ์ ํํ ์ด ๋ชฉ๋ก FROM ํ
์ด๋ธ1 INNER JOIN ํ
์ด๋ธ2 ON ๊ฒฐํฉ์กฐ๊ฑด;
OUTER JOIN
ํ ์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์ ์ฒด ํ์ ํ์ํ๊ณ ๋ค๋ฅธ ํ ์ด๋ธ์ ์กฐ๊ฑด์ ๋ง๋ ํ์ด ์์ผ๋ฉด ํ์ํ๋ ๊ฒ
- ํน๋ณํ ์ด์ (์ฟผ๋ฆฌ ์๋ ์์ฑ์ผ๋ก ํ ์ด๋ธ1, ํ ์ด๋ธ2์ ์ฟผ๋ฆฌ์์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ ๋ฑ)๊ฐ ์๋๋ฉด LEFT OUTER JOIN ์ฌ์ฉ
SELECT ์ ํํ ์ด ๋ชฉ๋ก FROM ํ
์ด๋ธ1 LEFT OUTER JOIN ํ
์ด๋ธ2 ON ๊ฒฐํฉ์กฐ๊ฑด;
SELECT ์ ํํ ์ด ๋ชฉ๋ก FROM ํ
์ด๋ธ1 RIGHT OUTER JOIN ํ
์ด๋ธ2 ON ๊ฒฐํฉ์กฐ๊ฑด;
์ฒดํฌํฌ์ธํธ (SQL ์ฝ๋ฉ์ ๊ธฐ์ ์ฐธ์กฐ)
๋ฐ์ดํฐ ํํฐ๋ง๊ณผ ๊ฒ์
- LIKE ์ ๋๋ก ์ฐ๊ธฐ
- LIKE '%keyword%'์ฒ๋ผ ์ ํ๋ฐฉ ๋ชจ๋ ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- LIKE๋ ์ต๋ํ ์์ธํ๊ฒ
- ์ผ์นํ๊ฑฐ๋ ๋๋ฝ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ์๋ผ ๋
- ์ด๋ก ์ ์ผ๋ก๋ EXISTS๊ฐ NOT IN๋ณด๋ค ๋น ๋ฆ
- ๋๋ LEFT JOIN์ ์ฌ์ฉํ๊ณ WHERE์์ NULL๊ฐ์ ์ฐพ๋ Frustrated JOIN ์ฌ์ฉํ๊ธฐ
GROUP BY
- GROUP BY ์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ดํดํ์
- ์ง๊ณ ํจ์๋ฅผ ํ๋๋ ์ฌ์ฉํ์ง ์์ ๋ GROUP BY ์ ์ SELECT DISTINCT์ ๋์ผํ๊ฒ ์ํ๋๋ค
- ์ง๊ณ ์ํ ์ WHERE ์ ์ด ์ ์ฉ๋๋ค
- GROUP BY ์ ์ ํํฐ๋ง๋ ๋ฐ์ดํฐ ์งํฉ์ ์ง๊ณํ๋ค
- HAVING ์ ์ ์ง๊ณ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ํํฐ๋งํ๋ค
- ORDER BY ์ ์ ๋ณํ๋ ๋ฐ์ดํฐ ์งํฉ์ ์ ๋ ฌํ๋ค
- SELECT ์ ์์ ์ง๊ณ ํจ์๋ ์ง๊ณ ๊ณ์ฐ์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ์ GROUP BY ์ ์ ๋ช ์ํด์ผ ํ๋ค
- GROUP BY ์ ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค์
- HAVING ์ ์ ์ง์ ํ ํ์ ํ ๊ทธ๋ฃน์ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ์ง๊ณ ๊ฐ๊ณผ ๋น๊ตํ๋ ๋ฅ๋ ฅ์ ์๋ค.
- ๋ณ์นญ์ผ๋ก SELECT ์ ์์ ๊ณ์ฐ์ ์ํํ๊ฑฐ๋, HAVING ์ ์ ์ฌ์ฉํ ์ ์๋ค. ํด๋น ํํ์์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํด์ผ ํ๋ค. (?)
- ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด GROUP BY๋ HAVING ์ ์ ์ฌ์ฉํ์
SELECT SUM(col) AS total
GROUP BY ...
HAVING SUM(col) ...;
- GROUP BY ์ ์์ด ์ต๋๊ฐ, ์ต์๊ฐ์ ์ฐพ์
์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด๋์ ์ฌ์ฉํ ์ ์๋์ง ์์๋์
- ์ผ๋ฐ์ ์ผ๋ก ํ ์ด๋ธ ์ด๋ฆ์ ์ธ ์ ์๋ ๊ณณ์ด๋ผ๋ฉด ์ด๋์๋ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ์ ์๋ค.
- ํ ์ด๋ธ ์๋ธ์ฟผ๋ฆฌ: FROM, JOIN ๋ฑ์ ์ฌ์ฉ
- ๋จ์ผ ์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ: IN, NOT IN ์กฐ๊ฑด์ ์ฌ์ฉ
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
- ์ฐ๊ด์ฑ ์๋ ์๋ธ์ฟผ๋ฆฌ์ ์ฐ๊ด์ฑ ์๋ ์๋ธ์ฟผ๋ฆฌ์ ์ฐจ์ด์ ์ ํ์ ํ์
- ์๋ธ์ฟผ๋ฆฌ ๋์ ์กฐ์ธ์ ์ฌ์ฉํด ๋ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์
SELECT NAME
FROM BEERSTYLE
WHERE CountryFK IN (
SELECT CountryID
FROM Countries
WHERE CountryNm = "Belgium"
);
SELECT S.NAME
FROM STYLE AS S
INNER JOIN Countries AS c
ON S.CountryFK = C.CountryID
WHERE C.CountryNm = "Belgium";
์กฐ์ธ
- LEFT JOIN์ ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฑธ๋ฌ๋ด์
- OUTER JOIN์์๋ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ COUNT(*) ํจ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์
- '*'๋ฅผ ์ฌ์ฉํด COUNT๋ฅผ ํ๋ฉด row ์์ฒด๋ฅผ ์นด์ดํธํ๋ค. ์ฆ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ด NULL๋ก ์ฑ์์ ธ ์์ด๋ ์นด์ดํธ๊ฐ ์ด๋ฃจ์ด์ง๋ค. ๋ฐ๋ฉด์ ์ปฌ๋ผ๋ช ์ ์ฌ์ฉํด COUNT๋ฅผ ํ๋ฉด ํด๋น ์ปฌ๋ผ์ ๊ฐ์ด NULL์ด๋ฉด ์นด์ดํธํ์ง ์๋๋ค.
- NULL ๊ฐ์ด ์๋ ๋ก์ฐ๋ฅผ ํฌํจํด ๋ชจ๋ ๋ก์ฐ์ ๊ฐ์๋ฅผ ์ธ๊ธฐ : COUNT(*)
- ์ปฌ๋ผ ๊ฐ์ด NULL์ด ์๋ ๋ก์ฐ์ ๊ฐ์๋ง ์ธ๊ธฐ : COUNT(์ปฌ๋ผ๋ช )
- EXPLAIN, STRAIGHT JOIN(์ผ์ชฝ ํ ์ด๋ธ๋ถํฐ ์ฝ๋ ์กฐ์ธ), SEMI JOIN(๋ฉ์ธ ์ฟผ๋ฆฌ ํ ์ด๋ธ๊ณผ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธ)
- ์กฐ์ธ๋์ด์ผ ํ ๊ฐ ์งํฉ์ ์ฒ๋ฆฌ๋ฒ์์ ์์์ ๋ฐ๋ผ ์ํฅ์ ๋ฐ๋๋ค.
- ๊ฐ์ฅ ์ข์ ๋ฒ์๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ ์๋ก ์กฐ์ธ ํจ์จ์ ์ฆ๊ฐ
์ฐธ๊ณ