EEALL@ONCE

๐Ÿ“Š์„œ๋ธŒ์ฟผ๋ฆฌ(subquery) ๋ณธ๋ฌธ

Data๐Ÿ“Š/DB ์ดํ•ด

๐Ÿ“Š์„œ๋ธŒ์ฟผ๋ฆฌ(subquery)

์˜ฌ์—ฃ์›์Šค 2023. 7. 6. 16:13
728x90

 

1. FROM

 

crimes ํ…Œ์ด๋ธ”


crimes table ๋ฐ์ดํ„ฐ


[์ฃผ ๋งˆ๋‹ค ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฒ”์ฃ„๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ]

 

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 

EMPLOYEE LIST

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

 

MySQL :: MySQL 5.7 Reference Manual :: B.3.4.4 Problems with Column Aliases

B.3.4.4 Problems with Column Aliases An alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column: SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root

dev.mysql.com

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๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‚ฌ๋žŒ ๋ฝ‘๊ธฐ

employee

 

department
๊ธฐ๋Œ€ ๊ฐ’

 

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;

728x90

'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