๐Ÿ“Œ DQL - ๋ฐ์ดํ„ฐ ์กฐํšŒ


2-1. ๊ธฐ๋ณธ์ ์ธ SELECT ๋ฌธ

MariaDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ช…๋ น์–ด๋Š” SELECT์ž…๋‹ˆ๋‹ค.

โœ… ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์กฐํšŒ

SELECT * FROM employees;

โœ… ํŠน์ • ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒ

SELECT name, age FROM employees;

โœ… ๋ณ„์นญ(Alias) ์‚ฌ์šฉ

SELECT name AS ์ง์›์ด๋ฆ„, age AS ๋‚˜์ด FROM employees;

2-2. WHERE ์กฐ๊ฑด์ ˆ

WHERE ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ

SELECT * FROM employees WHERE age > 30;

โœ… ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์กฐํ•ฉํ•˜๊ธฐ (AND, OR)

SELECT * FROM employees WHERE age > 30 AND department = 'HR';
SELECT * FROM employees WHERE age < 25 OR salary > 50000;

โœ… IN ์—ฐ์‚ฐ์ž (์—ฌ๋Ÿฌ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜)

SELECT * FROM employees WHERE department IN ('HR', 'IT', 'Finance');

โœ… BETWEEN ์—ฐ์‚ฐ์ž (๋ฒ”์œ„ ๊ฒ€์ƒ‰)

SELECT * FROM employees WHERE salary BETWEEN 30000 AND 60000;

โœ… LIKE ์—ฐ์‚ฐ์ž (๋ถ€๋ถ„ ๊ฒ€์ƒ‰)

SELECT * FROM employees WHERE name LIKE 'J%';
SELECT * FROM employees WHERE name LIKE '%son';

โœ… NULL ๊ฐ’ ์กฐํšŒ

SELECT * FROM employees WHERE phone_number IS NULL;

2-3. ๋ฐ์ดํ„ฐ ์ •๋ ฌ (ORDER BY)

์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (๊ธฐ๋ณธ๊ฐ’)

SELECT * FROM employees ORDER BY salary;

โœ… ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

SELECT * FROM employees ORDER BY salary DESC;

โœ… ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ

SELECT * FROM employees ORDER BY department ASC, salary DESC;

2-4. ๊ทธ๋ฃนํ™” (GROUP BY)

GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋ถ€์„œ๋ณ„ ํ‰๊ท  ๊ธ‰์—ฌ ๊ณ„์‚ฐ

SELECT department, AVG(salary) AS ํ‰๊ท ๊ธ‰์—ฌ
FROM employees
GROUP BY department;

โœ… HAVING์€ WHERE์™€ ๋‹ฌ๋ฆฌ GROUP BY๋กœ ๊ทธ๋ฃนํ™”๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ง‘๊ณ„ ํ•จ์ˆ˜(SUM, AVG, COUNT ๋“ฑ)๋ฅผ ํฌํ•จํ•œ ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SELECT department, AVG(salary) AS ํ‰๊ท ๊ธ‰์—ฌ
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

2-5. ์ค‘๋ณต ์ œ๊ฑฐ (DISTINCT)

DISTINCT ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ค‘๋ณต ์ œ๊ฑฐํ•˜์—ฌ ๋ถ€์„œ ๋ชฉ๋ก ์กฐํšŒ

SELECT DISTINCT department FROM employees;

2-6. ์ƒ์œ„ N๊ฐœ ๋ฐ์ดํ„ฐ ์กฐํšŒ (LIMIT)

LIMIT์„ ์‚ฌ์šฉํ•˜๋ฉด ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ƒ์œ„ 5๊ฐœ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ

SELECT * FROM employees LIMIT 5;

โœ… 6๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ 10๊ฐœ ์กฐํšŒ (OFFSET)

SELECT * FROM employees LIMIT 10 OFFSET 5;

๐Ÿ“Œ OFFSET์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ OFFSET 5๋Š” 6๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘๋จ.


2-7. ์„œ๋ธŒ์ฟผ๋ฆฌ (Subquery) ํ™œ์šฉ

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SQL๋ฌธ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

โœ… ๊ธ‰์—ฌ๊ฐ€ ์ „์ฒด ํ‰๊ท ๋ณด๋‹ค ๋†’์€ ์ง์› ์กฐํšŒ

SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

โœ… ๋ถ€์„œ๋ณ„ ์ตœ๋Œ€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์ง์› ์กฐํšŒ

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
);

โœ… JSON ํ•„๋“œ์—์„œ ๊ฐ’ ์ถ”์ถœ

SELECT order_details->>'$.product' AS product_name FROM orders;

โœ… JSON ๋ฐ์ดํ„ฐ ์ˆ˜์ •

UPDATE orders
SET order_details = JSON_SET(order_details, '$.price', 20.99)
WHERE id = 1;

โœ… ์ถ”๊ฐ€๋œ JSON ์กฐํšŒ ์˜ˆ์ œ

SELECT JSON_UNQUOTE(order_details->'$.price') AS price FROM orders WHERE id = 1;

๐Ÿ“Œ MariaDB์—์„œ๋Š” JSON ๊ฐ’์ด ์ž๋™์œผ๋กœ **์ด์Šค์ผ€์ดํ”„๋˜์–ด ์ถœ๋ ฅ๋˜๋ฏ€๋กœ, JSON_UNQUOTE()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ

๐Ÿ” ์ด์Šค์ผ€์ดํ”„(Escape)๋ž€?


โœ… ์ •๋ฆฌ

์ด๋ฒˆ ์žฅ์—์„œ๋Š” MariaDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.