Today I Learned

231207 / SQL&Python 예제 풀이

sance 2023. 12. 7. 22:33

SQL 예제를 풀면서 이전에 배웠지만 까먹은 내용들을 다시 한번 복습해가며 풀었다.

Python 예제에서 모르는 부분은 구글링으로 검색해가며 공부해서 문제를 풀어보았다.

 

Python 내용 정리

 

// 나누기 값의 만 출력
% 나누기 값의 나머지만 출력
int() 정수 출력
= 파이썬에서 '=' 기호는 변수를 지정해준다는 뜻이다.
비교연산자 == 같다.
!= 같지 않다.
할당연산자 += 더한 값을 왼쪽 변수에 대입한다.
RANGE range(n) 0부터 n까지의 숫자를 출력 (0, 1, 2, 3, ..., n)
range(n, m) n부터 m-1까지의 숫자를 출력 
range(n, m, x) n부터 m-1까지의 숫자를 x 간격으로 출력 (x는 음수도 지정 가능)

 

 

SQL 예제 풀이

 

- 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL" 이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

 

MYSQL의 경우 LIKE 연산자 사용 시 대소문자 구분을 하지않기 때문에 그냥 사용하면 되지만

오라클의 경우 LIKE 연산자에서 대소문자 구분을 하기 때문에 따로 UPPER, LOWER 함수를 사용해야 한다.

* upper(NAME) like '%EL%' 또는 lower(NAME) like '%el%'

select ANIMAL_ID, NAME
from ANIMAL_INS
where ANIMAL_TYPE='Dog' and NAME like '%el%'
order by NAME

 

 

- FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

 

COALESCE 함수를 이용해 냉동시설 여부의 NULL 값을 대체시켜 주고, 경기도에 위치한 창고만 출력하기 위해 조건문을 입력해 주었다.

select WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, coalesce(FREEZER_YN, 'N') FREEZER_YN
from FOOD_WAREHOUSE
where ADDRESS like '%경기도%'
order by WAREHOUSE_ID

 

 

- FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.

select FACTORY_ID, FACTORY_NAME, ADDRESS
from FOOD_FACTORY
where ADDRESS like '%강원%'
order by FACTORY_ID

 

 

- ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 *날짜를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다. *시각(시-분-초)을 제회한 날짜(년-월-일)만 보여주세요.

 

시각을 제외한 날짜만 출력하기 위해 DATE_FORMAT 함수를 사용했다. DATETIME 컬럼이 이미 DATE 형식이기 때문에 따로 DATE TYPE으로 바꾸지 않고 입력해 주었다.

select ANIMAL_ID, NAME, date_format(DATETIME, '%Y-%m-%d') "날짜"
from ANIMAL_INS
order by ANIMAL_ID

 

 

- DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.

*날짜 포맷은 YYYY-MM-DD 형식으로 출력

select DR_NAME, DR_ID, MCDP_CD, date_format(HIRE_YMD, '%Y-%m-%d') HIRE_YMD
from DOCTOR
where MCDP_CD='CS' or MCDP_CD='GS'
order by HIRE_YMD desc, DR_NAME

 

 

- FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

 

select PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, max(PRICE)

from FOOD_PRODUCT

 

처음에 위와 같은 코드를 입력했는데 오답처리가 되어서 실행 결과를 살펴보니 첫 번째 식품에 PRICE 컬럼만 최댓값으로 출력된 것을 확인했다. 나머지 컬럼도 가격이 최댓값인 식품의 정보를 출력하기 위해 where 절에 서브쿼리로 max 함수를 묶어주었다.

select *
from FOOD_PRODUCT
where PRICE=(select max(PRICE) from FOOD_PRODUCT)

 

 

Python 예제 풀이

 

- 정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 solution 함수를 완성해주세요.

def solution(num1, num2):
      answer = num1 - num2 
      return answer

 

 

- 정수 num1, num2가 매개변수 주어집니다. num1과 num2를 곱한 값을 return하도록 solution 함수를 완성해주세요.

def solution(num1, num2):
      answer = num1 * num2 
      return answer

 

 

- 정수 num1, num2가 매개변수로 주어질 때, num1을 num2로 나눈 몫을 return하도록 solution 함수를 완성해주세요.

 

그냥 / 나누기를 하면 결과값이 소수점까지 출력된다. 몫만 출력하기 위해서는 // 연산자를 입력해야 한다. 반대로 몫의 나머지 값을 출력하려면 % 연산자를 입력하면 된다. 이 방법 외에도 int() 함수를 사용하여 answer 값을 정수로 출력할 수 있다.

def solution(num1, num2):
      answer = num1//num2
      return answer
def solution(num1, num2):
      answer = num1/num2
      return int(answer) 

 

 

- 머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return하는 solution 함수를 완성해주세요.

def solution(age):
      answer = (2022-age)+1
      return answer

 

 

- 정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 return하도록 solution 함수를 완성해주세요.

 

조건에 따라 출력값을 다르게 해야하기 때문에 조건문 if/else를 사용하였다. 조건으로는 num1과 num2가 같다는 의미의 비교연산자 ==를 입력해 주고 조건을 충족할 때와 그렇지 못할 때의 값을 각각 입력해 주었다.

def solution(num1, num2):
      if num1==num2:
           answer = 1 
      else
           answer = -1 
      return answer

 

 

- 정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 solution 함수를 완성해주세요.

def solution(num1, num2):
      answer = num1 + num2 
      return answer

 

 

- 정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return하도록 solution 함수를 완성해주세요.

def solution(num1, num2):
      answer = (num1/num2)*1000 
      return int(answer) 

 

 

- 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하는 solution 함수를 완성해주세요.

 

조건이 여러 개이기 때문에 if/elif 함수를 사용해 각 조건에 만족할 때 출력되는 값을 입력해 주었다.

def solution(angle):
      if 0<angle<90: 
           answer = 1 
      elif angle==90: 
           answer = 2 
      elif 90<angle<180: 
           answer = 3 
      elif angle==180: 
           answer = 4 
      return answer

 

 

- 정수 n이 주어질 때, n 이하의 짝수를 모두 더한 값을 return하도록 solution 함수를 작성해주세요.

 

반복문 for 를 이용해 range로 출력된 숫자들을 += 연산자를 이용해 모두 더하여 출력하였다.

answer = 0 코드가 없으면 오류가 뜨는 이유가 궁금한데 모르겠다...

def solution(n):
      answer = 0
      for i in range(2, n+1, 2):
           answer += i
      return answer

 

sum 함수를 이용하여 코드를 더 간단하게 만들 수도 있다.

def solution(n):
      return sum(range(2, n+1, 2))