EEALL@ONCE
๐์๋ธ์ฟผ๋ฆฌ(subquery) ๋ณธ๋ฌธ
1. FROM
[์ฃผ ๋ง๋ค ์ผ๋ง๋ ์์ฃผ ๋ฒ์ฃ๊ฐ ๋ฐ์ํ๋์ง ์์๋ณด๊ธฐ ]
SELECT daily_stats.week , AVG(daily_stats.incidents_daily) FROM
( SELECT week , date , COUNT(incident_id) AS incidents_daily FROM crimes GROUP BY week, date )
daily_stats GROUP BY daily_stats.week
๊ฐ์์ ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ํด๋น ํ ์ด๋ธ ์ด๋ฆ์ daily_stats๋ผ๊ณ ํ๋ค.
์๋ธ์ฟผ๋ฆฌ๋ก ๋ง๋ค์ด์ง ๊ฐ์์ daily_stats table
( SELECT week , date , COUNT(incident_id) AS incidents_daily FROM crimes GROUP BY week, date )
daily_stats
week | date | incidents_daily |
2 | 2020-01-05 | 2 |
2 | 2020-01-06 | 1 |
2 | 2020-01-07 | 3 |
. | . | . |
. | . | . |
. | . | . |
๊ทธ๋ผ ์๋ก ๋ง๋ค์ด์ง ๊ฐ์์ ํ ์ด๋ธ(daily_stats )์์ ๋ค์ ์ฟผ๋ฆฌ๋ฌธ์ ์ง๋๋ฐ ์ด๋ฒ์๋ ํด๋น ํ ์ด๋ธ์ week์ ๊ธฐ์ค์ผ๋กGroup By ํ๊ฒ ๋๋ฉด ์ต์ข ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ ์ฃผ์ ํ๊ท ๋ฒ์ฃ ๋ฐ์๋ฅ ์ ๊ตฌํ ์ ์๋ค.
๐ปํ์ง๋ง_ AVGํจ์์๋ ์ฃผ์์ ์ด ์๋ค.
AVG(daily_stats.incidents_daily)
week | date | incidents_daily |
2 | 2020-01-05 | 2 |
2 | 2020-01-07 | 1 |
2 | 2020-01-08 | 3 |
2 | 2020-01-09 | 2 |
2 | 2020-01-10 | 3 |
2 | 2020-01-11 | 2 |
๋ง์ฝ, ์ด๋ฐ ๊ฐ์์ ํ ์ด๋ธ์ด ์๊ฒผ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฐ๋ฆฌ๋ week๋ก groupby ํ์ง๋ง, ์ฌ์ค avg ํจ์๋ "week" ๋ป์ ๋ชจ๋ฅธ๋ค.
์ฆ, ์ฐ๋ฆฌ๋ AVG(daily_stats.incidents_daily)๋ผ๊ณ ํ๋ฉด, ํน์ ์์ผ์ ( ์๋ฅผ ๋ค๋ฉด ์์์ผ) ์ ๋ฒ์ฃ๊ฐ ์ผ์ด๋์ง ์๋๋ค๋ฉด,
ํด๋น ์์ผ์ 0์ผ๋ก countํด์ 7๋ก ๋๋ ์ฃผ๊ฒ ์ง๋ผ๊ณ ๊ธฐ๋ํ ์ ์์ง๋ง...
๊ทธ๊ฑด ์ฐ๋ฆฌ์ ๊ธฐ๋์ผ ๋ฟ..
์ฌ์ค์ groupby week๋ก ํด๋ฒ๋ฆฌ๋ฉด row๊ฐ 6๊ฐ ๋ฐ์ ์๋ ๊ฑธ๋ก ์ธ์ํด์, AVGํจ์๋ (์ผ์ฃผ์ผ ๋ฒ์ฃ ํ์/6) ์ผ๋ก ๊ณ์ฐํด์ค๋ค.
2. WHERE
(1) ์ ํํ๊ฒ 1๊ฐ์ ๊ฐ์ด ๋์ผ
SELECT *
FROM crimes
WHERE date = (SELECT MIN(date) FROM crimes)
๋ณดํต min/max ๊ฐ์ด ๊ฒฐ๊ณผ๋ฌผ์ด ํ๋๊ฐ ๋์ค๋ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์์ฃผ ์ฌ์ฉ
๐MIN(date) ๊ฐ์ฅ '์ค๋๋' ๋ ์ง
MAX(date) ๊ฐ์ฅ '์ต์ '์ ๋ ์ง
(2) ํด๋น ์กฐ๊ฑด์ด ์ฌ๋ฌ ๊ฐ์ ๊ฐ
SELECT *
FROM crimes
WHERE date IN (SELECT distinct date FROM crimes ORDER BY date desc LIMIT 5);
HACKER_RANK - TOP_EARNERS
Select salary*months as earnings,count(*) from employee
Where salary*months = (select max(salary*months) from employee)
Group By earnings;
earnings(๋ณ์นญ)์ ๊ฒฝ์ฐ where์์๋ ๋ชป์ฐ์ง๋ง, group by์์๋ ์ธ ์ ์๋ค.
์ด์ ๋ SQL ์ฟผ๋ฆฌ ์คํ ์์๊ฐ ์๊ธฐ ๋๋ฌธ!
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
๊ทผ๋ฐ ๊ทธ๋ผ ์ select๊ฐ group by๋ณด๋ค ๋ค์ ์๋๋ฐ group by์์๋ ์ธ ์ ์์๊น?
์ฌ์ค์ ๋ถ๊ฐ๋ฅํ์ง๋ง, MySQL์์๋ง ์์ธ์ ์ผ๋ก!!!! Group By๋ถํฐ alias๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด๋์๋ค....
๐์ฐธ๊ณ ํ๊ธฐ ์ข์ ๋ธ๋ก๊ทธ ๊ธ์ด๋ค.
https://myjamong.tistory.com/172
๐MySQL ์์ธ ์กฐํญ
https://dev.mysql.com/doc/refman/5.7/en/problems-with-alias.html
having๋ ๋ง์ฐฌ๊ฐ์ง๋ก MySQL์์๋ alias ์ฌ์ฉ ๊ฐ๋ฅ
select salary*months as earnings,count(*) from employee
group by earnings
having earnings=(select max(salary*months) from employee);
HACKER_RANK - TOP_EARNERS : ๋ถ์ ๋ณ salary๊ฐ ๊ฐ์ฅ ๋ง์ ์ฌ๋ ๋ฝ๊ธฐ
select d.name as department,e.name as employee,e.salary from employee as e
inner join (
select departmentid,max(salary) max_salary
from employee
group by departmentid
) as ds on ds.departmentid=e.departmentid
and ds.max_salary=e.salary
inner join department as d on d.id=e.departmentid;
'Data๐ > DB ์ดํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ DAYOFWEEK (0) | 2023.07.28 |
---|---|
๐ GROUP BY (0) | 2023.07.28 |
๐ IFNULL (0) | 2023.07.28 |
๐ ์ธ๋ฑ์ค (0) | 2023.07.21 |
๐ํ ์ด๋ธ ์ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ (0) | 2023.07.21 |