Q. 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성하시오. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회하시오.
이름이 두개 이상인 애들을 이름으로 묶어서 카운트하는데에서 막혔다.
group by name 으로 묶는건 알겠는데 이름이 두개 이상인걸 어떻게 거르지?
찾아보니 having count 로 쓰면 되는 거였다.
정답
SELECT name, count(name)
from animal_ins
group by 1
having count(name) >= 2
order by 1
count(distinct name)이 아닌점, where name is not null 이 아닌점이 뭔지 잘 생각해보니
having count(name) >= 2 에서 이미 걸러졌기 때문에 작성할 필요가 없다는 걸 깨달았다.
++ having 에 대한 추가 조사
HAVING
having 조건식 형식으로 사용함그룹함수 활용Q. 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성하시오.
프로세스 정리
1. 조회할 컬럼 : 이름
2. 가장 먼저들어온 순으로 정렬
3. 그중 제일 빠른 컬럼 추출
3에서 막혀서 정답지를 보면서 나름의 풀이를 해봤다.
3을 해결하기 위해선 2가지 방법이 있다.
LIMIT 함수 사용
정답
SELECT name
from animal_ins
order by datetime
limit 1
서브쿼리
정답
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
하나의 컬럼 이어야 함 (exists 제외)select a
from b
where c [연산자] [서브쿼리]
++추가로
| 연산자 | 활용 | 의미 |
|---|---|---|
| IN | A IN (서브쿼리) | A가 (서브쿼리)의 결과값 내에 있다 |
| ALL | A < ALL(서브쿼리) | A가 모든 (서브쿼리)의 결과값보다 작다 |
| ALL | A > ALL(서브쿼리) | A가 모든 (서브쿼리)의 결과값보다 크다 |
| ANY | A < ANY(서브쿼리) | A가 (서브쿼리)의 결과값보다 하나라도 작다 |
| ANY | A > ANY(서브쿼리) | A가 (서브쿼리)의 결과값보다 하나라도 크다 |
| EXISTS | EXISTS(서브쿼리) | (서브쿼리)의 결과값이 존재한다 |
| EXISTS | NOT EXISTS(서브쿼리) | (서브쿼리)의 결과값이 존재하지 않는다 |
- 주요 연산자 사용시, where절의 서브쿼리는 반드시 결과값이 하나의 컬럼이어야 함
- 단, exists는 단독으로 사용하며, 결과값이 여러 컬럼이어도 상관 없다
//평균 점수보다 낮은 학생들 이름 가져오기
select name
from class
where score < (select avg(score) from class)