[MySQL]LV 1 문제 모음
Intro
SQL 문제들은 많이 없기 때문에 LV 1 ~ LV 5
까지 문제들을 레벨별로 모아서 한번에 정리하겠다.
문제 1 - like
코드
SELECT * from CAR_RENTAL_COMPANY_CAR where options like '%네비게이션%' order by car_id desc;
풀이
options 필드 값은 리스트로 여러값이 출력되므로 options like '%네비게이션%'
형태로 양쪽에 ‘%’ 가 필수!
또한, 내림차순이므로 order by car_id desc
형태로 뒤에 꼭 ‘desc’ 가 필수!(기본값 : asc)
문제 2 - round, avg, as
코드
SELECT round(avg(daily_fee),0) as 'AVERAGE_FEE' from CAR_RENTAL_COMPANY_CAR where car_type = 'SUV';
풀이
round(avg(daily_fee),0) as 'AVERAGE_FEE'
만 이해하면 충분한 코드이다.
-
avg(daily_fee)
를 통해서 daily_fee 필드의 평균을 구하고, -
round(평균, 0)
을 통해서 첫번째 자리에서 반올림을 한 값을 구해준다.-
즉,
round(2.4, 0)
였으면? 첫번째 자리에서 반올림 이후 2 가 반환된다는 것. -
round(2.45, 1)
의 예로는? 두번째 자리에서 반올림을 한 값을 구해준다.
2.45 => 2.5
-
-
필드명 as 'AVERAGE_FEE'
을 통해서 해당 필드명을 ‘AVERAGE_FEE’ 로 이름변경 해서 출력한다.
문제 3 - is null
코드
SELECT count(*) as 'users' from user_info where age is null;
풀이
count(*)
와 where age is null
만 이해하면 충분한 코드이다.
-
count(*)
는 조건에 맞는 튜플들 개수를 전부 구해준다. (*
는 null 값 까지 포함) -
where age is null
은where age = null
로 이해하면 되며, SQL에서는is null
로 표기해야 하기 때문에is null
을 사용한다.
문제 4 - bit 연산자
코드
select count(*) as count from ecoli_data where (genotype & 1 or genotype & 4) and not genotype & 2;
풀이
genotype & 4
처럼 bit 연산자 &
를 이해하면 충분
- 1,2,4,8 은 각각 0001, 0010, 0100, 1000 인 2진수 이며 AND연산자(&) 를 통해 문제에서 원하는 형질을 비교할 수 있다.
- bit 연산
문제 5 - date, year + date_format, datediff
코드
select count(*) as fish_count from fish_info where year(time) = 2021;
풀이
time컬럼은 date 타입이므로 year 함수 바로 적용
- 문자형 타입이면 date함수로 date타입으로 변형해서 비교하는 아래 같은 풀이도 존재
AND TIME >= date("2021-01-01") AND TIME <= date("2021-12-31")
- between 도 주로 사용, ‘2022-10-01’을 date 타입과 비교시 자동으로 date 형태로 비교해 줌
-> 아래는 creatㄴed_date 컬럼이 date 타입이라 가정-
created_date between '2022-10-01' and '2022-10-31'
` - 주의 : 단 9월은 30일 까지 있는데 31일로 표기 할 시 제대로 동작 안함.
-
+) date_format 사용 방식? -> 소문자 대문자 차이
-
date_format(created_date, '%Y-%m-%d')
-> 2022-02-01 -
date_format(created_date, '%Y-%M-%D')
-> 2022-October-2nd
+) datediff(end_date,start_date) ?? -> 날짜 차이 계산 함수
(case when datediff(end_date,start_date)+1 >= 30 then '장기 대여' else '단기 대여' end) as rent_type
- 중요 : 날짜 차이에 +1 까지 해줘야 정확한 대여일이 구해 진다.
- 12월 1일 ~ 12월 3일 까지를 보통 우리는 3일로 보지만, 함수는 3일-1일=2일 로 계산 하기 때문
문제 6 - concat
코드
select concat(max(length),"cm") as max_length from fish_info;
풀이
+
연산자는 다른 dbms 가능한 곳이 있지만 mysql에서는 불가능! concat
을 사용
문제 7 - case when…then…else…end, round, avg or 서브쿼리 or ifnull
코드
# case when 풀이
select round(avg(
case
when length is null then 10
else length
end
),2) as average_length from fish_info;
# ifnull 풀이
select round(avg(ifnull(length, 10)),2) as average_length from fish_info;
# 서브쿼리 풀이
select round(avg(a.length),2) as average_length
from (select
(case when length is null then 10
else length
end) as length
from fish_info) a
풀이
(1)소수점 3번째 자리에서 반올림 평균이라 round, avg 사용
null 값은 10으로 바꿔 계산하라고 해서 case when
조건문 사용 -> 이게 핵심!
(2)이걸 서브쿼리에서 먼저 사용해서 푸는 풀이도 존재
(3)더 간단히 ifnull 함수 사용 풀이도 존재: ifnull(length,10)
은 null이면 10, null아니면 length 반환
문제 8 - max (집계함수), limit 1
코드
# 집계함수 활용 풀이
SELECT max(datetime) from animal_ins;
# limit 1 활용 풀이 + order by
select datetime from animal_ins order by datetime desc limit 1;
풀이
(1)너무 쉬운 문제지만 집계함수는 select 절에 사용해야하며, “최근일 = max(날짜)” 로 해결한 아이디어를 이해하는 것이 중요하다.
(2)또한 내림차순 정렬을 통해서 limit 1
로 상위 값 1개만 가져와 최근일을 구하는 아이디어도 함께 기억하자.
문제 9 - limit, 서브쿼리+윈도우함수
코드
# limit 활용 풀이
SELECT name from animal_ins order by datetime limit 1;
# 서브쿼리 + 윈도우함수 풀이
select a.name
from (
select name, rank() over(order by datetime) as rn
from animal_ins
) a
where a.rn = 1
풀이
제일 오래된 값 하나 들고 오라고 했는데, 집계함수 min으로 해결하려다가 실패
(1)오름차순 정렬해서 limit
를 사용하면 되는 더 간단한 방법이 있다!
(2)윈도우 함수를 활용하는 풀이가 있다. order by를 하면 해당 컬럼만 순서가 바뀌는게 아니라 당연히 동일 튜플 컬럼들도 다 영향을 받는다.
참고로 윈도우 함수는 from, where을 거쳐 결과로 얻게된 select절 순서의 데이터 결과에 가공을 진행하는 차이가 있다. select절의 실행 순서상 당연한 말을 하는거지만 아래 예시를 참고하여 이해해보자.
select name, rank() over(order by datetime) as rn
from animal_ins
where name like 'A%'
- 실제 동작은 where절을 거쳐 A로 시작하는 name 행을 먼저 필터링한 후 랭킹을 부여한다.
- 근데, 전체 행에 랭킹을 먼저 부여하고 where절로 name을 필터링 했다고 순서를 반대로 착각하지 말자는 의미다.
- 실행순서는 기본적으로 아래와 같다.
- SQL 논리적 실행 순서 :
from -> where -> group by -> having -> select -> order by
- 오라클, SQL Server(MSSQL), MySQL 도 다 유사하지만 특히 MySQL은 select 별칭을 group by, having 이런 다른 순서에도 지원한다는 특징이 있다.
- SQL 논리적 실행 순서 :
댓글남기기