max값을 가지고 다시 min 값 찾기 0 6 945

by 갈매기 [MySQL] [2019.10.25 12:11:48]


강사 테이블입니다. 

# ID, name, dept_name, salary
'83821', 'Brandt', 'Comp. Sci.', '92000.00'
'58583', 'Califieri', 'History', '62000.00'
'76766', 'Crick', 'Biology', '72000.00'
'22222', 'Einstein', 'Physics', '95000.00'
'32343', 'El Said', 'History', '60000.00'
'33456', 'Gold', 'Physics', '87000.00'
'45565', 'Katz', 'Comp. Sci.', '75000.00'
'98345', 'Kim', 'Elec. Eng.', '80000.00'
'15151', 'Mozart', 'Music', '40000.00'
'76543', 'Singh', 'Finance', '80000.00'
'10101', 'Srinivasan', 'Comp. Sci.', '65000.00'
'12121', 'Wu', 'Finance', '90000.00'
 

이 테이블을 이용하여, dept_name별 max salary를 구합니다. 

SELECT dept_name, max(salary) as salaryMax
FROM university_1.instructor
group by dept_name

로 간단히 구했습니다. (하기와 같습니다.) 

Biology, 72000.00
Comp. Sci., 92000.00
Elec. Eng., 80000.00
Finance, 90000.00
History, 62000.00
Music, 40000.00
Physics, 95000.00

쿼리가 만들어준 테이블로 다시 최소 salary의 dept_name과 값을 구하고자 합니다. 

select a.dept_name, min(salaryMax)
from(
	SELECT dept_name, max(salary) as salaryMax
	FROM university_1.instructor
	group by dept_name
	) a

상기처럼 했더니, 결과가 쌩뚱맞게 biology 가 나오네요. 정답은 Music, 40000 인데 말이죠. 

Biology, 40000.00

 

요약하면, 결과가 

# dept_name, salaryMax
'Music', '40000.00'
 

 

music, 40000를 도출해야 합니다. 

 

고견 부탁드립니다. 

 

by 우리집아찌 [2019.10.25 12:58:14]

select min(dept_name) keep(dense_rank first order by salaryMax )

   , min(salarymax) 

from ....


by 우리집아찌 [2019.10.25 13:05:36]

-- mysql 이었네요

select t.*
   from ( select dept_name
                      , salarymax
                      , row_number() over(order by salarymax) rn
                 from ( select dept_name , max(salary) as salarymax
                               from instructor
                               group by dept_name ) a
             ) t
    where rn = 1

 


by 마농 [2019.10.25 13:08:02]
SELECT dept_name
     , MAX(salary) salaryMax
  FROM university_1.instructor
 GROUP BY dept_name
 ORDER BY salaryMax, dept_name
 LIMIT 1
;

 


by 갈매기 [2019.10.25 23:25:51]

감사합니다. 매번 새로운것을 배웁니다.


by 갈매기 [2019.10.25 23:35:06]

근데 제 쿼리는 생뚱맞게 왜 biology 가 나올까요? 


by 마농 [2019.10.28 09:16:11]

그룹바이 표준 사용법에 어긋나는 MySQL 에서만 오류가 나지 않는 비표준 시용법입니다.
여러 건의 salaryMax 중에 MIN(salaryMax) 1건만 집계하는 구문이므로
여러건의 dept_name 을 함께 표현하려면 집계함수를 써서 1건으로 집계해야 합니다.
집계함수 없이 그냥 쓰면 1줄에 여러개를 표현하는게 말이 안되므로 오류입니다.
1건의 집계결과와 여러건의 비집계결과를 함께 표현한다는게 말이 안된는 거죠.
하지만 MySQL 에서는 오류가 나지 않고 정상적으로 수행되며
여러건의 자료중 첫번째로 읽은 값 1개를 표현해 줍니다.
정상 수행된다고 해서 마구 사용해서는 안되는 구문입니다.
물론, 이러한 특성을 잘 이해하고서 MySQL만의 특징을 역으로 이용하는 것은 좋습니다.
다만, 이러한 특징을 모른 채 습관적으로 사용해 왔다면
표준 문법을 사용하기를 권장합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입