πππ‘πππππ
2.SQL λ³Έλ¬Έ
[ λͺ©μ°¨ ]
DBMS
: DBμ μ κ·Όνκ³ κ΄λ¦¬ν μ μλ μννΈμ¨μ΄
DBMS β
: λ°μ΄ν°μ μ μ₯, κ²μ, μ
λ°μ΄νΈ, μμ λ₯Ό ν¨μ¨μ μΌλ‘ μνν μ μλλ‘ μ§μ
μ£Όμ DBMSμ νΉμ§
κ΄κ³νμ΄ κ°μ₯ λ리 μ¬μ©λλ λ°©μ
κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ λ°μ΄ν°λ₯Ό "ν
μ΄λΈ"μ΄λΌλ λ¨μλ‘ κ΄λ¦¬
μ½λ©μμ
SELECT → FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
μ€νμμ
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
πselectμ μμ μ μΈν λ³μΉμ having μ μμ μ¬μ©ν μ μλκ°?π
A : Yes !!!!!!! whereμ μμ No !!!!!!!
SELECTμ μμ μ μΈν΄μ€ Aliasλ₯Ό ORDER BYλ λ¬Όλ‘ μ΄κ³ GROUP BY, HAVINGμμλ μ΄μ©
μ΄ (Column) ↓
μ΄μ ν
μ΄λΈμ μ μ₯λ λ°μ΄ν°μ κ° νλͺ©(νΉμ±)μ λνλ
μ¦, μ΄μ λ°μ΄ν°μ μμ±μ μ μνλ©°, κ°μ μ΄μλ λμΌν μ νμ λ°μ΄ν°κ° μ μ₯λ¨
ν(Row) →
νμ ν
μ΄λΈμμ κ°λ³ λ°μ΄ν° νλͺ©(λ μ½λ)μ λνλ
κ³ μ ν λ°μ΄ν°λ₯Ό λ΄κ³ μμΌλ©°, κ° μ΄μ λ°μ΄ν°λ₯Ό μ‘°ν©νμ¬ νλμ μμ ν μ 보λ₯Ό λνλ
λ°μ΄ν° νμ
λ¬Έμν : varchar (λ¬Έμ, μ«μ, νΉμλ¬Έμ ν¬ν¨)
μμΉν : int, float (μ μ,μ€μ)
λ μ§/μκ°ν : date (yyyy-mm-dd)
λΆλ¦¬μΈ : boolean (true/fales νΉμ 0/1)
join = vlook up
union : ν©μΉκ³ μ λ ¬, μ€λ³΅μ κ±° = μ±λ₯μ΄ λ€μ λ¨μ΄μ§ μλ μμ (μκ° μ€λ κ±Έλ¦Ό)
union all : ν©μΉκΈ°λ§ ν¨
λ°ν
1. κ°
2. ν
3. ν
μ΄λΈ
μμ‘΄
1. μκ΄ : μΈλΆμ»€λ¦¬λ κ³μ μ£Όκ³ λ°μ
2. λΉμκ΄ : λ± ν λ²λ§ μ€ν (λ
립)
μλΈμΏΌλ¦¬λ μΈλΆ μΏΌλ¦¬λ³΄λ€ λ¨Όμ μ€νλλ©°, λ°νλ κ²°κ³Όλ μΈλΆ 쿼리μμ μ¬μ©
null
null = κ°μ΄ μλ€
0 μ΄λ λ€λ₯Έ κ°λ
μ΄λ€
null μ 'is null', 'is not null' μ¬μ©
-- μΌλ°μ μΈ λΉκ΅μ°μ°μ NULLμμ μλνμ§ μμ΅λλ€.
SELECT *
FROM ν
μ΄λΈλͺ
WHERE 컬λΌλͺ
= NULL; -- μλνμ§ μμ!
-- NULL κ°λ§ μ ν
SELECT *
FROM ν
μ΄λΈλͺ
WHERE 컬λΌλͺ
IS NULL;
-- NULLμ΄ μλ κ°λ§ μ ν
SELECT *
FROM ν
μ΄λΈλͺ
WHERE 컬λΌλͺ
IS NOT NULL;
select : μ‘°ν
from : ν
μ΄λΈ μ§μ
distinct : μ€λ³΅ μ κ±°
SELECT DISTINCT city
FROM employees;
limit : κ°―μ μ ν
where : 쑰건 μ§μ
between A and B : A μ B μ¬μ΄ μ‘°ν
-- λμ΄κ° 30~50 μ¬μ΄μΈ μ§μ μ‘°ν
SELECT *
FROM employees
WHERE age BETWEEN 30 AND 50;
in : μΌμΉνλ λ°μ΄ν° νν°λ§
-- IN μμ: νΉμ λμμμ 근무νλ μ§μ μ‘°ν
SELECT *
FROM employees
WHERE city IN ('Seoul', 'Busan');
not in : μ μΈν λ°μ΄ν° μ‘°ν
-- NOT IN μμ: νΉμ λμλ₯Ό μ μΈν μ§μ μ‘°ν
SELECT *
FROM employees
WHERE city NOT IN ('Seoul', 'Busan');
like
: νΉμ ν¨ν΄κ³Ό μΌμΉνλ λ°μ΄ν° νν°λ§ %, _ νμ© (not likeλ κ°λ₯)
쑰건문μμ μ¬μ©ν μ μλ μ°μ°μ : <>, !=
case when
else end as
: 첫λ²μ§Έλ‘ μ°ΈμΈ μ‘°κ±΄μ΄ μ€ν → 쑰건μ λ§μ‘±νμ§ μμΌλ©΄ else μ μ΄ μ€ν
SELECT name, age,
CASE
WHEN age < 30 THEN 'μ²λ
'
WHEN age BETWEEN 30 AND 50 THEN 'μ€λ
'
ELSE 'λ
ΈμΈ'
END AS age_group
FROM employees;
μ§κ³ν¨μ
: λ¨μΌ κ²°κ³Όκ°μ λ°ννλ ν¨μ
λλΆλΆμ μ§κ³ ν¨μλ null κ° μ μΈνκ³ μλν¨
μμΈμ μΌλ‘ count(*) λ nullν¬ν¨ βΌοΈβΌοΈβΌοΈ
count : λ°μ΄ν°μ ν μ λ°ν
count(distinct) : κ³ μ ν κ°μ κ°λ λ°μ΄ν°μ ν μ λ°ν
sum : μ΄μ κ°μ λͺ¨λ λν¨
avg : μ΄ κ°μ νκ· κ³μ°
min : μ΅μκ°
max : μ΅λκ°
group by : κ·Έλ£Ήννμ¬ μμ½ μ 보 μμ±
having : group byλ‘ κ·Έλ£Ήνλ λ°μ΄ν°μ 쑰건μ μΆκ°λ‘ μ μ©ν λ μ¬μ©
- where + group by
-- IT λΆμκ° μλ μ§μλ€λ§ μ ννμ¬ λΆμλ³ μ΄ κΈμ¬λ₯Ό κ³μ°
SELECT department_id, SUM(salary) AS total_salary
FROM employees
WHERE department_id != 'IT'
GROUP BY department_id;
--WHERE department_id != 'IT'λ‘ λ°μ΄ν°λ₯Ό νν°λ§ν©λλ€.
--νν°λ§λ λ°μ΄ν°λ₯Ό GROUP BY department_idλ‘ κ·Έλ£Ήνν ν, μ΄ κΈμ¬λ₯Ό κ³μ°
- group by + having
-- μμ μ½λ1
-- λΆμλ³ μ΄ κΈμ¬κ° 10,000 μ΄μμΈ λΆμλ§ μ ν
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) >= 10000;
-- λͺ¨λ λ°μ΄ν°λ₯Ό GROUP BY department_idλ‘ κ·Έλ£Ήνν©λλ€.
-- HAVING 쑰건μ μ μ©νμ¬ μ΄ κΈμ¬κ° 10,000 μ΄μμΈ λΆμλ§ μ ν!
-- SELECT μ μμ λ μ»¬λΌ μ‘°ν
where + group by + having
-- μμ μ½λ1
-- λμ΄κ° 30 μ΄μμΈ μ§μλ§ μ ννκ³ (WHERE), μ±λ³λ³ κ·Έλ£Ήνκ° λ ν(GROUP BY)
-- νκ· λμ΄κ° 35 μ΄μμΈ μ±λ³λ§ μ‘°ν(HAVING)
SELECT gender,
AVG(age) AS average_age
FROM employees
WHERE age >= 30
GROUP BY gender
HAVING AVG(age) >= 35;
-- μμ μ½λ2
-- IT λΆμμ μ§μλ§ μ ννκ³ , λΆμλ³ μ΄ κΈμ¬κ° 10,000 μ΄μμΈ κ²½μ°λ§ νμ
SELECT department_id, SUM(salary) AS total_salary
FROM employees
WHERE department_id IN ('IT', 'HR')
GROUP BY department_id
HAVING SUM(salary) >= 10000;
--WHERE department_id IN ('IT', 'HR')λ‘ ITμ HR λΆμμ μ§μλ§ νν°λ§
--νν°λ§λ λ°μ΄ν°λ₯Ό GROUP BY department_idλ‘ κ·Έλ£Ήν
--κ·Έλ£Ήνλ κ²°κ³Όμμ SUM(salary) >= 10000 쑰건μ λ§μ‘±νλ λΆμλ§ μ‘°ν
πwhere μ having μ°¨μ΄μ π
where
- κ·Έλ£Ήν μ΄μ μ λ°μ΄ν° νν°λ§
- κ°λ³ νμ κΈ°μ€μΌλ‘ 쑰건 μ μ©
having
-κ·Έλ£Ήν μ΄νμ λ°μ΄ν°λ₯Ό νν°λ§, μ¦ κ·Έλ£Ήνλ κ²°κ³Όλ₯Ό κΈ°μ€μΌλ‘ 쑰건μ μ μ©
μ°¨μ΄ μμ½λ°μ΄ν° → where (κ°λ³ ν νν°λ§) → group by (κ·Έλ£Ήν) → having (κ·Έλ£Ήνλ κ²°κ³Ό νν°λ§)
order by
: μ λ ¬
asc(μλ΅κ°λ₯)
: μ€λ¦μ°¨μ
desc
: λ΄λ¦Όμ°¨μ
μλμ° ν¨μ
: over() μ κ³Ό ν¨κ» μ¬μ©, νμ κ·Έλ£Ήν, μ λ ¬, λ²μ μ€μ νμ¬ λ€μν ν¨μλ€μ μ 곡
μλμ° ν¨μ κΈ°λ³Έ λ¬Έλ²
select μλμ°ν¨μ(컬λΌ1) over (
[partition by 컬λΌ2] -- κ·Έλ£Ήν
[order by 컬λΌ3 asc/desc] --μ λ ¬
[rows/range between a and b] --κ³μ° λ²μ
) as κ²°κ³Ό
from ν
μ΄λΈ;
μλμ° ν¨μμ μ§ν μμ
1. λ°μ΄ν°λ₯Ό νν°μ
μΌλ‘ λλ (κ·Έλ£Ήν)
2. κ° κ·Έλ£Ήλ³ λ°μ΄ν° μ λ ¬
3. μ λ ¬λ λ°μ΄ν° λ΄μμ μ°μ°λ²μ μ€μ
4. μ§μ λ λ²μμ μ λ ¬μ λ°λΌ μλμ°ν¨μ κ° κ³μ°
μλμ° ν¨μ νΉμ§
μ§κ³ ν¨μμ νμ₯ : sum,avg λ±μ μ§κ³ κ²°κ³Όλ₯Ό κ°λ³ νμ νμ
1.κΈ°μ‘΄ μ§κ³ ν¨μλ κ·Έλ£Ή λ¨μλ‘ ν¨μκ° μ μ©λμ§λ§, μλμ° ν¨μλ **~~κ° νμ λ°μ΄ν°μ ν¨κ»~~** μ§κ³ κ²°κ³Ό μ μ§
2. μλ³Έ λ°μ΄ν° μ μ§ : μλ³Έ λ°μ΄ν°μ ν¨κ» μλμ° ν¨μμ κ²°κ³Όλ₯Ό λμμ νμΈ κ°λ₯
3. λ€μν κΈ°λ₯μ ν¨μ μ 곡 : μμ λ§€κΈ°κΈ°, λμ ν© κ³μ°, νΉμ ν κ° μ°Έμ‘°, λ°±λΆμ κ³μ° λ±λ±
μλμ° ν¨μκ° μΆκ°λλ€λ©΄ ?
from → on → join → where → group by → having → μλμ° → select → distinct→ order by → limit
μ’
λ₯
μμ ν¨μ → rank(), dense_rank(), row nember()
μ§κ³ ν¨μ → sum() -κ·Έλ£Ήνλ λ°μ΄ν°(νν°μ
λ΄)μ λν΄ λμ ν© κ³μ° (β³μκ°νκΈ°!)
ν μ°Έμ‘° ν¨μ → laf(),lead()
λΉμ¨ ν¨μ : percent_rank()
μλμ° ν¨μ λ²μ μ§μ
raws : λ°μ΄ν° ν μμ κΈ°μ€ (μλ€ ν νμ©)
range : λ°μ΄ν° κ° κΈ°μ€ (κ° +, - μΈ λͺ¨λ ν)
'SQL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
1. λ°μ΄ν° λΆμμ λνμ¬ (1) | 2025.01.08 |
---|