๐ DQL - ๋ฐ์ดํฐ ์กฐํ
2-1. ๊ธฐ๋ณธ์ ์ธ SELECT ๋ฌธ
MariaDB์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ช
๋ น์ด๋ SELECT
์
๋๋ค.
โ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ
SELECT * FROM employees;
- ๋ชจ๋ ์ปฌ๋ผ์ ์๋ฏธํฉ๋๋ค.
employees
ํ ์ด๋ธ์ ๋ชจ๋ ํ(row)์ ์กฐํํฉ๋๋ค.
โ ํน์ ์ปฌ๋ผ๋ง ์กฐํ
SELECT name, age FROM employees;
name
๊ณผage
์ปฌ๋ผ๋ง ๊ฐ์ ธ์ต๋๋ค.
โ ๋ณ์นญ(Alias) ์ฌ์ฉ
SELECT name AS ์ง์์ด๋ฆ, age AS ๋์ด FROM employees;
AS
๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ผ์ ๋ณ์นญ์ ์ค์ ํ ์ ์์ต๋๋ค.
2-2. WHERE ์กฐ๊ฑด์
WHERE
์ ์ ์ฌ์ฉํ๋ฉด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ ์ ์์ต๋๋ค.
โ ์กฐ๊ฑด์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์กฐํ
SELECT * FROM employees WHERE age > 30;
age
๊ฐ 30๋ณด๋ค ํฐ ์ง์๋ง ์กฐํํฉ๋๋ค.
โ ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํ๊ธฐ (AND, OR)
SELECT * FROM employees WHERE age > 30 AND department = 'HR';
age
๊ฐ 30๋ณด๋ค ํฌ๊ณ ,department
๊ฐ HR์ธ ์ง์๋ง ์กฐํ
SELECT * FROM employees WHERE age < 25 OR salary > 50000;
age
๊ฐ 25๋ณด๋ค ์๊ฑฐ๋salary
๊ฐ 50,000 ์ด์์ธ ์ง์ ์กฐํ
โ IN ์ฐ์ฐ์ (์ฌ๋ฌ ๊ฐ ์ค ํ๋์ ์ผ์น)
SELECT * FROM employees WHERE department IN ('HR', 'IT', 'Finance');
HR
,IT
,Finance
๋ถ์์ ์ํ ์ง์ ์กฐํ
โ BETWEEN ์ฐ์ฐ์ (๋ฒ์ ๊ฒ์)
SELECT * FROM employees WHERE salary BETWEEN 30000 AND 60000;
salary
๊ฐ 30,000์์ 60,000 ์ฌ์ด์ธ ์ง์ ์กฐํ
โ LIKE ์ฐ์ฐ์ (๋ถ๋ถ ๊ฒ์)
SELECT * FROM employees WHERE name LIKE 'J%';
J
๋ก ์์ํ๋ ์ง์ ์ด๋ฆ ์กฐํ (%
๋ ์์ผ๋์นด๋)
SELECT * FROM employees WHERE name LIKE '%son';
son
์ผ๋ก ๋๋๋ ์ง์ ์ด๋ฆ ์กฐํ
โ NULL ๊ฐ ์กฐํ
SELECT * FROM employees WHERE phone_number IS NULL;
phone_number
๊ฐ์ด ์๋ ์ง์ ์กฐํ
2-3. ๋ฐ์ดํฐ ์ ๋ ฌ (ORDER BY)
์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ ์์ต๋๋ค.
โ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ (๊ธฐ๋ณธ๊ฐ)
SELECT * FROM employees ORDER BY salary;
salary
๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์(ASC) ์ ๋ ฌ
โ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
SELECT * FROM employees ORDER BY salary DESC;
salary
๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์(DESC) ์ ๋ ฌ
โ ์ฌ๋ฌ ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
SELECT * FROM employees ORDER BY department ASC, salary DESC;
department
๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ณ , ๊ฐ์ ๋ถ์ ๋ด์์๋salary
๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
2-4. ๊ทธ๋ฃนํ (GROUP BY)
GROUP BY
๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
โ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ ๊ณ์ฐ
SELECT department, AVG(salary) AS ํ๊ท ๊ธ์ฌ
FROM employees
GROUP BY department;
department
๋ณ๋ก ํ๊ท ๊ธ์ฌ(AVG(salary)
)๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅ
โ
HAVING์ WHERE
์ ๋ฌ๋ฆฌ GROUP BY
๋ก ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์กฐ๊ฑด์ ์ ์ฉํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ฆ, ์ง๊ณ ํจ์(SUM
, AVG
, COUNT
๋ฑ)๋ฅผ ํฌํจํ ์กฐ๊ฑด์ ํํฐ๋งํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
SELECT department, AVG(salary) AS ํ๊ท ๊ธ์ฌ
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
- ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๊ฐ 50,000 ์ด์์ธ ๊ฒฝ์ฐ๋ง ์ถ๋ ฅ
2-5. ์ค๋ณต ์ ๊ฑฐ (DISTINCT)
DISTINCT
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
โ ์ค๋ณต ์ ๊ฑฐํ์ฌ ๋ถ์ ๋ชฉ๋ก ์กฐํ
SELECT DISTINCT department FROM employees;
employees
ํ ์ด๋ธ์์ ์ค๋ณต๋department
๊ฐ์ ์ ๊ฑฐํ๊ณ ์ถ๋ ฅ
2-6. ์์ N๊ฐ ๋ฐ์ดํฐ ์กฐํ (LIMIT)
LIMIT
์ ์ฌ์ฉํ๋ฉด ์กฐํํ ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
โ ์์ 5๊ฐ ๋ฐ์ดํฐ๋ง ์กฐํ
SELECT * FROM employees LIMIT 5;
employees
ํ ์ด๋ธ์์ ์์ 5๊ฐ ํ๋ง ์ถ๋ ฅ
โ 6๋ฒ์งธ ํ๋ถํฐ 10๊ฐ ์กฐํ (OFFSET)
SELECT * FROM employees LIMIT 10 OFFSET 5;
- 6๋ฒ์งธ ํ๋ถํฐ 10๊ฐ ์ถ๋ ฅ (ํ์ด์ง ์ฒ๋ฆฌ ์ ์ ์ฉ)
๐ OFFSET์ 0๋ถํฐ ์์ํ๋ฏ๋ก OFFSET 5
๋ 6๋ฒ์งธ ํ๋ถํฐ ์์๋จ.
2-7. ์๋ธ์ฟผ๋ฆฌ (Subquery) ํ์ฉ
์๋ธ์ฟผ๋ฆฌ๋ SQL๋ฌธ ๋ด๋ถ์์ ์คํ๋๋ ์์ ์ฟผ๋ฆฌ์ ๋๋ค.
โ ๊ธ์ฌ๊ฐ ์ ์ฒด ํ๊ท ๋ณด๋ค ๋์ ์ง์ ์กฐํ
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
salary
๊ฐ ์ ์ฒด ์ง์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ์ง์๋ง ์กฐํ
โ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ ์กฐํ
SELECT name, department, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE employees.department = department);
- ๊ฐ ๋ถ์์์ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์๋ง ์กฐํ
2-8. MariaDB์์ JSON ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ
MariaDB๋ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
โ JSON ๋ฐ์ดํฐ ์ ์ฅ
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100),
order_details JSON
);
order_details
์ปฌ๋ผ์ JSON ๋ฐ์ดํฐ ์ ์ฅ ๊ฐ๋ฅ
โ JSON ํ๋์์ ๊ฐ ์ถ์ถ
SELECT order_details->>'$.product' AS product_name FROM orders;
- JSON ๋ฐ์ดํฐ์์
product
ํ๋ ๊ฐ ์ถ์ถ
โ JSON ๋ฐ์ดํฐ ์์
UPDATE orders
SET order_details = JSON_SET(order_details, '$.price', 20.99)
WHERE id = 1;
order_details
์price
๊ฐ์ 20.99๋ก ๋ณ๊ฒฝ
โ ์ถ๊ฐ๋ JSON ์กฐํ ์์
SELECT JSON_UNQUOTE(order_details->'$.price') AS price FROM orders WHERE id = 1;
๐ MariaDB์์๋ JSON ๊ฐ์ด ์๋์ผ๋ก **์ด์ค์ผ์ดํ๋์ด ์ถ๋ ฅ๋๋ฏ๋ก, JSON_UNQUOTE()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ฐ์ ๋ฐํ ๊ฐ๋ฅ
๐ ์ด์ค์ผ์ดํ(Escape)๋?
- *์ด์ค์ผ์ดํ(Escape)๋ **ํน์ ๋ฌธ์๋ ํน์ ๊ธฐํธ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
โ ์ ๋ฆฌ
์ด๋ฒ ์ฅ์์๋ MariaDB์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ์ต๋๋ค.
SELECT
๋ฌธ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒWHERE
,ORDER BY
,GROUP BY
ํ์ฉ๋ฒLIMIT
๊ณผOFFSET
์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ์ ํ- ์๋ธ์ฟผ๋ฆฌ์ JSON ๋ฐ์ดํฐ ์ฒ๋ฆฌ