๋ฐ์ดํฐ ์กฐํ(SELECT)
SELECT ์ ํจ๊ป ์ฐ์ด๋ ์ ๋ค
1.
FROM
2.
WHERE
3.
GROUP BY
4.
HAVING
5.
ORDER BY
์ ์์๋๋ก sql ๊ตฌ๋ฌธ์ด ์คํ๋๋ค!
์์์๊ธฐ
์ค์ต
๋ชจ๋ ์ด SELECT
-- ์ ์ฒด ๋ค ๋ถ๋ฌ์ค๊ธฐ
SELECT *
FROM customer;
SQL
๋ณต์ฌ
์ด 2661 ํ
์๋ ์๋ต
WHERE์ ๋ก ์กฐ๊ฑด ๊ฑธ๊ธฐ
-- WHERE์ ์ฌ์ฉ
SELECT *
FROM customer
WHERE gender = 'man';
SQL
๋ณต์ฌ
์ด 1133ํ
count() ํจ์ ์ฌ์ฉ
-- COUNT(mem_no) : mem_no ํ๋๋ฅผ ๊ฐ์ง๋ ํ์ ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT COUNT(mem_no) AS ํ์์
FROM customer
WHERE gender='man';
SQL
๋ณต์ฌ
count(*) : ๊ฒ์ํ ํ
์ด๋ธ์ ๋ชจ๋ ํ ๊ฐ์ ๊ตฌํ๊ธฐ
count(field) : ํน์ field ๋ฅผ ๋ช
์ํด์, ํด๋น field ๊ฐ์ด NULL ์ธ ํ์ ์ ์ธ
์ผ๋ฐ์ ์ผ๋ก NOT NULL ์ธ id ๊ฐ์ count ํจ์ ์ธ์๋ก ์ด๋ค.
GROUP BY
SELECT addr, COUNT(*) AS ํ์์
FROM customer
WHERE gender = 'man'
GROUP BY addr;
-- GROUP BY๋ฅผ ํ๋ฉด ํด๋น ํ๋๋ก ๊ทธ๋ฃนํ์ด ๋๊ธฐ ๋๋ฌธ์, SELECT ์ ํด๋น ํ๋์ COUNT ๋ฅผ ๊ฐ์ด ์ธ ์ ์๋ค
-- GROUP BY ๋ฅผ ํ ํ๋๋ SELECT ์๋ ์จ์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
-- COUNT() ํจ์ ์์ ๋ค์ด์ค๋ ์ปฌ๋ผ์ GROUP BY ์ ์ ์ ์จ์ค๋ ๋๋ค
-- ์ฆ, mem_no ์ด ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ด์ด ๋ค์ด์๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ์.
-- ์ฃผ์ํ ์ ์ ํน์ ํ๋๋ฅผ ๋ช
์ํ ๋ NULL ์ด๋ฉด ํด๋น ํ์ ์นด์ดํ
์ด ์ ๋จ.
-- ๋ฐ๋ผ์ NOT NULL ์ธ ํ๋ ํน์ ์ ์ฒดํ๋(*) ๋ฅผ COUNT ํจ์์ ์ธ์๋ก ๋ฃ์ด์ค์ผ ํ๋๋ฐ,
-- ์ฟผ๋ฆฌ์๋ ๋๋ฌธ์ NOT NULL ์ธ ํ๋(ID) ๋ฅผ ๋ณดํต ๋ฃ๋๋ค.
-- ์๋ฌ ๋ฐ์
SELECT addr,COUNT(mem_no) AS ํ์์
FROM customer
WHERE gender='man';
-- group by ๋ฅผ ์ ์จ์ฃผ๊ณ , count() ์ ํน์ ํ๋๋ฅผ ๊ฐ์ด select ํ ์ ์์.
SQL
๋ณต์ฌ
โข
GROUP BY addr; : addr ํ๋์ ๊ฐ์ด ๊ฐ์ ํ๋ค์ ๊ทธ๋ฃนํํ๋ค.
๊ทธ๋ฃนํํ ํ๋๋ SELECT ์ ์ ์ด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
โข
COUNT() AS ํ์์ :
์ฟผ๋ฆฌ์คํ ์์๊ฐ FROM โ WHERE โ GROUP BY ์ด๋ฏ๋ก, SELECT ๋ ๋งจ ๋ง์ง๋ง์ ์คํ๋๋ค.
๋ฐ๋ผ์ GROUP BY ์ ์ํด ์๋กญ๊ฒ ๋ฐ๋ ํ
์ด๋ธ์์์ ๊ฐ ๋ฒ์ฃผ(addr)์ ํ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
count(*) ์ count(mem_no) ๋ ๋๊ฐ์ ๊ธฐ๋ฅ์ ํ๊ณ , ์ฒ๋ฆฌ์๋๊ฐ ํ์๊ฐ ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก๋ ํ์๋ฐฉ์์ ํํ๋ค.
HAVING
WHERE ์ ๊ทธ๋ฃนํ์ ํ๊ธฐ์ ์ ์กฐ๊ฑด๊ฑธ์ด์ฃผ๊ณ , HAVING ์ ๊ทธ๋ฃนํ์ ํ ํ์ ์กฐ๊ฑด์ ๊ฑธ์ด์ค๋ค.
๋ ๋ค ํ์ํ ์ด์ ๋ ๊ทธ๋ฃนํ์ ํ๊ฒ ๋๋ฉด, ํ
์ด๋ธ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.
-- HAVING์ ์ GROUP BY ์ ์ํด ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ์ ๋ํด ์กฐ๊ฑด์ ๊ฑธ ๋ ์ฐ์
SELECT addr, COUNT(mem_no) AS ํ์์
FROM customer
WHERE gender = 'man'
GROUP BY addr
HAVING COUNT(mem_no) < 100; -- ๊ทธ๋ฃนํํ ํ์ ํ์์๊ฐ 100 ๋ฏธ๋ง์ผ๋๋ง
SQL
๋ณต์ฌ
ORDER BY
๋งจ ๋ง์ง๋ง์ ์์ฑํ๊ณ , ์ ๋ ฌ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉํ๋ค.
๋ํดํธ๋ ์ค๋ฆ์ฐจ์(ASC)์ด๊ณ , ๋ด๋ฆผ์ฐจ์์ ํ๋ ค๋ฉด DESC ๋ฅผ ์จ์ค๋ค.
-- ORDER BY : ๋งจ ํ๋จ์ ์์ฑ. ์ค๋ฆ์ฐจ์: ASC / ๋ด๋์ฐจ์ : DESC
SELECT addr, COUNT(mem_no) AS ํ์์
FROM customer
WHERE gender = 'man'
GROUP BY addr
HAVING COUNT(mem_no) <100
ORDER BY COUNT(mem_no) DESC ;
SQL
๋ณต์ฌ
GROUP BY ์ฌ๋ฌ ํ๋
์ฌ๋ฌ ํ๋๋ฅผ ๋์์ ๊ทธ๋ฃนํํ ์ ์๋ค.
-- GROUP BY ์ฌ๋ฌ ํ๋
SELECT addr, gender, count(mem_no) AS ํ์์
FROM customer
WHERE addr IN ('seoul', 'incheon')
GROUP BY addr, gender
ORDER BY addr DESC;
-- IN ์ฐ์ฐ์ ์ฌ์ฉ
-- addr, gender ํ๋ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํ์ด ๋จ
SQL
๋ณต์ฌ
ํ ์ด๋ธ ๊ฒฐํฉ(JOIN)
ERM ๊ณผ ERD
ERM(Entity-Relationship Modelling)
๊ฐ์ฒด-๊ด๊ณ ๋ชจ๋ธ๋ง
โข
๊ฐ์ฒด(Entity) : ํ๋ ์ด์์ ์์ฑ(Attribute)์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด
์ฝ๊ฒ ์๊ฐํด์ ๊ฐ์ฒด == ํ
์ด๋ธ ์ด๊ณ ์์ฑ == ํ๋ ์ด๋ค.
โข
๊ด๊ณ(Realtionship) : ๊ฐ์ฒด(ํ
์ด๋ธ)๊ฐ์ ๊ด๊ณ
ERD(Entity-Relationship Diagram)
๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ก ํํ
FK ๋ ๋ค๋ฅธ ํ
์ด๋ธ์์์ PK ๋ฅผ ๋ปํ๋ค.
PK ๋ ํ ํ
์ด๋ธ ๋น ๋ฌด์กฐ๊ฑด ํ๋์ด์ง๋ง, FK ๋ ํ ํ
์ด๋ธ์์ ์ฌ๋ฌ ๊ฐ๊ฐ ๋ ์ ์๋ค.
JOIN
1.
INNER ์กฐ์ธ
2.
LEFT OUTER ์กฐ์ธ (LEFT ์กฐ์ธ)
3.
RIGHT OUTER ์กฐ์ธ
4.
๊ทธ ์ธ ๊ธฐํ (๋ง์ด ์ ์ฐ๋ ๋ฏ)
customer ํ
์ด๋ธ
sales ํ
์ด๋ธ
product ํ
์ด๋ธ
INNER JOIN
ON ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ON ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ ธ์จ๋ค.
์์ INNER ๋ฅผ ์๋ตํด๋ ๋๋ค. ( INNER JOIN == JOIN )
์ฒซ๋ฒ์งธํ
์ด๋ธ์ด๋ฆ
INNER JOIN ๋๋ฒ์งธํ
์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
-- INNER ์๋ต ๊ฐ๋ฅ
์ฒซ๋ฒ์งธํ
์ด๋ธ์ด๋ฆ
JOIN ๋๋ฒ์งธํ
์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
SQL
๋ณต์ฌ
-- customer์ mem_no ์ sales์ mem_no ๊ฐ ๊ฐ์ ํ๋ง ๊ฐ์ ธ์ด
SELECT *
FROM customer
INNER JOIN sales
ON customer.mem_no = sales.mem_no;
-- ํ
์ด๋ธ์ ๋ณ์นญ์ ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅ
SELECT *
FROM customer AS a
INNER JOIN sales AS b
ON a.mem_no = b.mem_no;
SQL
๋ณต์ฌ
SELECT *
FROM customer
INNER JOIN sales
ON customer.mem_no = sales.mem_no
WHERE customer.mem_no = '1000970';
-- customer ์ sales ํ
์ด๋ธ ๋ ๋ค mem_no ํ๋๊ฐ ์์ผ๋ฏ๋ก ์ด๋ค ํ
์ด๋ธ์ mem_no ์ธ์ง ๋ช
์ํด์ค์ผํจ
SQL
๋ณต์ฌ
LEFT JOIN (LEFT OUTER JOIN)
JOIN ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ํ
์ด๋ธ์ ๋ฌด์กฐ๊ฑด ๋ค ๋ถ๋ฌ์จ๋ค.
๊ฒฐํฉ์ ํ ๋ ์ผ์ชฝํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก
ON ์ ์ ๋งค์นญ๋๋ฉด, ์ค๋ฅธ์ชฝํ
์ด๋ธ๊ณผ ๊ฒฐํฉ์ ํ๊ณ (INNER JOIN ๊ณผ ๋์ผ)
ON ์ ์ ๋งค์นญ๋์ง ์๋ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ํ๋๋ NULL ๋ก ์ฑ์ด๋ค.
-- LEFT JOIN
-- ์ผ์ชฝํ
์ด๋ธ(customer)๋ ๋ฌด์กฐ๊ฑด ๋ค ๋ถ๋ฌ์ค๊ณ ,
-- ์ค๋ฅธ์ชฝํ
์ด๋ธ(sales)์ ON ์ ์์ ๋งค์นญ๋๋ ๋ฐ์ดํฐ๋ ๊ฒฐํฉ์ ํ๊ณ , ๋งค์นญ์ด ๋์ง ์์ผ๋ฉด NULL ๋ก ๊ฒฐํฉํ๋ค
SELECT *
FROM customer
LEFT JOIN sales
ON customer.mem_no = sales.mem_no;
SQL
๋ณต์ฌ
์ผ์ชฝํ
์ด๋ธ(customer)์ ๋ฌด์กฐ๊ฑด ๋ค ๋ถ๋ฌ์ค๊ณ , ๋ง์ฝ ON ์ ์์ ๋งค์นญ์ด ๋์ง ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ํ๋๋ฅผ ๋ค NULL ๋ก ์ฑ์ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
RIGHT JOIN (RIGHT OUTER JOIN)
JOIN ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ฌด์กฐ๊ฑด ๋ค ๋ถ๋ฌ์จ๋ค.
๊ฒฐํฉ์ ํ ๋ ์ค๋ฅธ์ชฝํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก
ON ์ ์ ๋งค์นญ๋๋ฉด, ์ผ์ชฝํ
์ด๋ธ๊ณผ ๊ฒฐํฉ์ ํ๊ณ (INNER JOIN ๊ณผ ๋์ผ)
ON ์ ์ ๋งค์นญ๋์ง ์๋ ์ผ์ชฝ ํ
์ด๋ธ์ ํ๋๋ NULL ๋ก ์ฑ์ด๋ค.
-- RIGHT JOIN
-- ์ค๋ฅธ์ชฝํ
์ด๋ธ(sales)๋ ๋ฌด์กฐ๊ฑด ๋ค ๋ถ๋ฌ์ค๊ณ ,
-- ์ผ์ชฝํ
์ด๋ธ(customer)์ ON ์ ์์ ๋งค์นญ๋๋ ๋ฐ์ดํฐ๋ ๊ฒฐํฉ์ ํ๊ณ , ๋งค์นญ์ด ๋์ง ์์ผ๋ฉด NULL ๋ก ๊ฒฐํฉํ๋ค
SELECT *
FROM customer
RIGHT JOIN sales
ON customer.mem_no = sales.mem_no
WHERE customer.mem_no IS NULL;
-- NULL / IS NULL ์ฌ์ฉ
-- IS NULL ์ ์ฌ์ฉํด์ ์ผ์ชฝํ
์ด๋ธ์ ํ๋๊ฐ NULL ์ธ ํ๋ง ๊ฐ์ ธ์ด
SQL
๋ณต์ฌ
ํ ์ด๋ธ 3๊ฐ join
/* ํ
์ด๋ธ 3๊ฐ join */
SELECT *
FROM sales
LEFT JOIN customer
ON sales.mem_no = customer.mem_no
LEFT JOIN product
ON sales.product_code = product.product_code;
SQL
๋ณต์ฌ
sales ํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก customer ์ product ํ
์ด๋ธ์ left join ํ๋ค.
์๋ธ์ฟผ๋ฆฌ (Sub Query)
๋ฉ์ธ์ฟผ๋ฆฌ ์์ ์๋ ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค.
๋ชจ๋ ์๋ธ์ฟผ๋ฆฌ๋ SELECT ๋ช
๋ น๋ฌธ์ผ๋ก ์์ํ๋ค. (๋ชจ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ค SELECT๋ก ์์)
1.
SELECT์ ์๋ธ์ฟผ๋ฆฌ : ํ
์ด๋ธ ํ๋(์ด) ๊ตฌํ๊ธฐ
2.
FROM์ ์๋ธ์ฟผ๋ฆฌ : ํ
์ด๋ธ ๊ตฌํ๊ธฐ(์ด ๋ฐ ํ
์ด๋ธ ์ด๋ฆ๋ ์ง์ )
3.
WHERE์ ์๋ธ์ฟผ๋ฆฌ : ๋ฆฌ์คํธ ๊ตฌํ๊ธฐ
SELECT์ ์๋ธ์ฟผ๋ฆฌ
select์ ์๋ธ์ฟผ๋ฆฌ : ํ๋(์ด) ๊ตฌํ๊ธฐ
SELECT์ ์์์ ๋ ๋ค๋ฅธ SELECT์ ์ ์ฌ์ฉํ๋ค.
JOIN ์ ์ฌ์ฉํ์ง ์๊ณ JOIN ์ ํ๋ด๋ผ ์ ์๋๋ฐ, ์ฑ๋ฅ์ด ์ ์ข์์ JOIN ์ ์ฐ๋ ๊ฒ์ด ๋ ๋ซ๋ค.
SELECT ์๋ธ์ฟผ๋ฆฌ์ฌ์ฉ
-- SELECT์ ์๋ธ์ฟผ๋ฆฌ
SELECT *,
(SELECT gender
FROM customer
WHERE sales.mem_no = mem_no) AS gender
FROM sales;
SQL
๋ณต์ฌ
234ms
join ์ฌ์ฉ
-- SELECT์ ์๋ธ์ฟผ๋ฆฌ vs. JOIN ์ฒ๋ฆฌ ์๋ ๋น๊ต
SELECT sales.*, customer.gender
FROM sales
LEFT JOIN customer
ON sales.mem_no = customer.mem_no;
SQL
๋ณต์ฌ
4.7ms
join ์ด select ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ๋ฌด๋ ค 50๋ฐฐ๊ฐ๋ ๋น ๋ฅด๋ค
FROM์ ์๋ธ์ฟผ๋ฆฌ
from์ ์๋ธ์ฟผ๋ฆฌ : ์ด ์ด๋ฆ ๋ฐ ํ
์ด๋ธ๋ช
(๋ณ์นญ) ์ง์
ํ์ ๋น ์ฃผ๋ฌธํ์ ๊ตฌํ๊ธฐ
-- FROM์ ๊ดํธ ์์๋ ํ
์ด๋ธ์ด ์์ผํจ
-- -> GROUP BY ์ ๋ก ์๋ก ์์ฑ๋ ํ
์ด๋ธ์ ์ฌ์ฉ๊ฐ๋ฅ
SELECT *
FROM (
SELECT mem_no, count(order_no) AS ์ฃผ๋ฌธํ์
FROM sales
GROUP BY mem_no
) AS A;
-- FROM์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ธ ๋์๋ ๋ง์ง๋ง์ alias(๋ณ์นญ)์ ๊ผญ ๋ถํ์ค์ผํจ.
SQL
๋ณต์ฌ
WHERE์ ์๋ธ์ฟผ๋ฆฌ
where์ ์๋ธ์ฟผ๋ฆฌ : ๋ฆฌ์คํธ ํํ ๋ฐํ
-- WHERE์ ์๋ธ์ฟผ๋ฆฌ
-- ๊ฐ์
๋
๋๊ฐ 2019๋
์ธ ํ์์ ์ฃผ๋ฌธํ์๋ฅผ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ
SELECT count(order_no) AS ์ฃผ๋ฌธํ์
FROM sales
WHERE mem_no IN (
SELECT mem_no
FROM customer
WHERE YEAR(join_date) = 2019);
SQL
๋ณต์ฌ
ย IN ๋ค์์๋ ๋ฆฌ์คํธ๊ฐ ์์ผํ๋ค.
ย SELECT mem_no FROM customer WHERE YEAR(join_date) = 2019 ๊ฒฐ๊ณผ๋ (โ100001โ, โ100002โ, โ100003โ, ..) ์ ๊ฐ์ ๋ฆฌ์คํธ ํํ์ด๋ค.
join์ผ๋ก ๋๊ฐ์ด ๊ตฌํํ ๋ฒ์
-- join ๋ฒ์
SELECT count(order_no) AS ์ฃผ๋ฌธํ์
FROM sales
JOIN customer
ON sales.mem_no = customer.mem_no
WHERE YEAR(customer.join_date) = 2019;
SQL
๋ณต์ฌ
์๋ธ์ฟผ๋ฆฌ ์ ๋ฆฌ
select,from,where ์๋ธ์ฟผ๋ฆฌ ์ค ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ from์ ์๋ธ์ฟผ๋ฆฌ ์ด๋ค.
ํ์ ๋น ๊ตฌ๋งคํ์ ๋ฐ ํ์์ ๋ณด๋ฅผ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ (from์๋ธ์ฟผ๋ฆฌ + join)
-- from์๋ธ์ฟผ๋ฆฌ ์ join ๊ฒฐํฉ
CREATE TEMPORARY TABLE sales_sub_query
SELECT A.๊ตฌ๋งคํ์, B.*
FROM (
SELECT mem_no
,count(order_no) AS ๊ตฌ๋งคํ์
FROM sales
GROUP BY mem_no
) AS A -- ํ์ ๋น ๊ตฌ๋งคํ์ ํ
์ด๋ธ ์์ฑ
JOIN customer AS B
ON A.mem_no = B.mem_no;
SELECT * FROM sales_sub_query;
SQL
๋ณต์ฌ
cf. CREATE TEMPORARY TABLE
1.
๋ฐฉ๋ฒ1
: ์ผ๋ฐ์ ์ธ create table ๋ฐฉ์
CREATE TEMPORARY TABLE table_name(
column_1_definition,
column_2_definition,
...,
table_constraints
);
SQL
๋ณต์ฌ
2.
๋ฐฉ๋ฒ2
: select ์ฟผ๋ฆฌ๋ฌธ ์ฌ์ฉ (select ๋ก ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ์์ํ
์ด๋ธ๋ก ์์ฑ)
CREATE TEMPORARY TABLE top_costomers
SELECT p.customerNumber,
c.customerName,
ROUND(SUM(p.aount), 2) sales
FROM payments p
INNETER JOIN customers c ON c.customerNumber = p.customerNumber
GROUP BY p.customerNumber
ORDER BY sales DESC
LIMIT 10;
SQL
๋ณต์ฌ