TIL 통합

12/11 substr 단순 실수, having 복습, 수학/논리문제

네디0318 2023. 12. 11. 16:51

SQL 카타

 

52번

상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.

 

어려울 건 전혀 없었으나 결과값에 strawberry 밖에 안 나와서 정답이 아닌 줄 알고 한참을 고민했던 문제.

SELECT a.flavor
from   first_half a left join icecream_info b on a.flavor=b.flavor
where b.ingredient_type = 'fruit_based' and a.total_order in (select total_order from first_half group by flavor having total_order >=3000)

 

그런데 사실....딱히 중복이 없었던 건지 '질문하기'에 달린 해설고 답변들을 찾아보니 아래처럼 해도 정답이었다. 문제를 잘 보면 기존 테이블에 중복 항목이 없는 것 같은데 괜히 레벨 때문에 괜히 어렵게 생각한 문제였던 것 같기도.

SELECT a.flavor
from   first_half a left join icecream_info b on a.flavor=b.flavor
where b.ingredient_type = 'fruit_based' and a.total_order>=3000

 

문제를 가능하면 쉽게 생각하는 습관을 들여야 할 것 같다.

 

 

 

 

53번 : having 복습

SELECT user_id,
       product_id
from   online_sale
group by user_id, product_id
having count(user_id) >=2 and count(product_id) >=2
order by user_id asc, product_id desc

그닥 어려운 문제는 아니었지만, having 함수의 특징을 한 번 더 짚고 넘어가고자 기록.

지난번에 썼던 대로 having은 group by 함수로 그룹화된 데이터를 필터링하는 것이기 때문에 위와 같이 처음으로 작성한 답변처럼 굳이 and로 두가지 조건을 모두 적어줄 필요 없이 아래처럼만 작성해도 정답이 나올 수 있다.

SELECT user_id,
       product_id
from   online_sale
group by user_id, product_id
having count(*) >=2
order by user_id asc, product_id desc

덧. 이전 문제들까지는 점점 어려워지기만 했던 것 같은데 왜 50번대 들어서는 이전보다 더 쉬워진 것 같은지. 이 문제도 서브쿼리를 활용해야하나 잠깐 고민했었다. 

 

 

 

54 . susbstr 단순  실수 및 서브쿼리 활용

전혀 어려울 것 없는 문제였음에도 불구하고 왜 때문에 틀렸는지 한시간동안 고민했던 문제.

한시간이 지나서야 전화번호 마지막 substr에서 전화번호 마지막 4자리 추출 부분의 앞 숫자를 입력 잘못했다는 것을 간신히 알게 되었다. 단순하지만 한 번 실수하면 찾기 어려울 수 있는 유형이니 앞으로의 주의를 위해 기록했다.

단순 실수가 얼마나 치명적(?)인 결과를 가져올 수 있는지 절감하게 해준  문제였다.

SELECT b.user_id,
       b.nickname,
       concat(b.city, ' ', b.street_address1, ' ', b.street_address2) 전체주소,
       concat(substr(tlno, 1, 3), '-', substr(tlno, 4, 4), '-', substr(tlno, 7, 4)) 전화번호
from used_goods_board a left join used_goods_user b on a.writer_id = b.user_id
group by a.writer_id
having count(a.writer_id) >=3
order by b.user_id desc

 

내친김에 서브쿼리도 활용해서 문제를 풀었다. 서브쿼리를 반복해서 활용하다보니 이제 제법 익숙해진듯 하다.

SELECT b.user_id,
       b.nickname,
       concat(b.city, ' ', b.street_address1, ' ', b.street_address2) 전체주소,
       concat(substr(tlno, 1, 3), '-', substr(tlno, 4, 4), '-', substr(tlno, 8, 4)) 전화번호
from used_goods_board a left join used_goods_user b on a.writer_id = b.user_id
where a.writer_id in (select writer_id from used_goods_board group by 1 having count(writer_id)>=3)
group by a.writer_id
order by b.user_id desc

 

 

59. 

수학적/논리적 문제인데 추가로 더 봐야할 것 같다.

 

SELECT car_id,
       case when start_date > 2022-10-16 then '대여 가능'
            when start_date < 2022-10-16 and end_date < 2022-10-16 then '대여 가능'
            else '대여중' end availability
from car_rental_company_rental_history


SELECT car_id,
         case when start_date > 2022-10-16 then '대여 가능'
            when start_date < 2022-10-16 and end_date < 2022-10-16 then '대여 가능'
            when start_date = 2022-10-16 then '대여중'
            when end_date = 2022-10-16 then '대여중' end availability
from car_rental_company_rental_history
order by car_id desc

 

 

 


SQLD 정리 - 3주차

 

3주차 : 엔터티 

 1)2개 이상의 인스턴스, 2개 이상의 속성으로 구성. 주식별자+일반속성
 2)유무형 여부(유형, 개념, 사건) 및 발생시점(기본/키, 중심, 행위)에 따라 분류
속성
 1)특징(기본, 설계, 파생) 및 구성방식(PK, FK, 일반)에 따른 분류
  -PK : 엔터티 식별하게 함 => 주식별자(특징 : 유일성, 최소성, 불변성, 존재성)
  -FK : 다른 엔터티와의 관계에서 형성 및 포함됨. 식별자 관계와 비식별자 관계로 나뉨
 2)도메인 : 각 속성이 가질 수 있는 값의 범위(숫자X)
엔터티 관계 : *관계차수 - 1:1, 1:M, M:M

 

 

4주차 : 성능데이터 모델링과 정규화

정규화

1)1NF : 하나의 속성ㅇ엔 하나의 속성값만 존재하게 테이블 분할

2)2NF : 1NF만족 + PK 아닌 칼럼은 모두 PK에 종속되게 분할

3)3NF : 2NF만족 + 일반 속성 간 종속 x

 

반정규화

1)테이블 반정교화 : 테이블 병합, 테이블 분할(수직/수평), 테이블 추가

2)칼럼 반정교화

3)관계 반정교화