TIL/사전캠프 퀘스트

TIL 2024-09-12 ( SQL_걷기반 2~5 )

myoma 2024. 9. 12. 17:24

2) 이제 좀 벌었으니 flex 한 번 해볼까요?! 

products table

 

  • products 테이블에서 제품 이름(product_name)과 가격(price)만을 선택하는 쿼리를 작성해주세요.
SELECT product_name, price
FROM products

문제에서 요구한 것은 products 테이블에서 제품 이름과 가격만 선택하는 쿼리를 작성해달라고 했으므로 그게 맞는 컬럼명만 적어주면 된다.

 

 

  • products 테이블에서 제품 이름(product_name)에 '프로'가 포함된 모든 제품을 선택하는 쿼리를 작성해주세요.
SELECT *
FROM products
WHERE product_name LIKE "%프로%"

이번엔 '프로'라는 글자가 들어간 데이터만 조회해야하기 때문에 조건문(WHERE)에서 LIKE를 사용하여 풀어준다.

  • "가%" : 앞글자가 '가'인 데이터만 조회
  • "%가" : 뒷글자가 '가'인 데이터만 조회
  • "%가%" : '가'라는 글자가 들어가면 모두 조회
  • "_가_" : (데이터가 3글자라면) 가운데 글자가 '가'인 데이터만 조회

 

 

  • products 테이블에서 제품 이름(product_name)이 '갤'로 시작하는 모든 제품을 선택하는 쿼리를 작성해주세요.
SELECT *
FROM products
WHERE product_name LIKE "갤%"

위에 문제의 설명 참고.

 

 

 

  • products 테이블에서 모든 제품을 구매하기 위해 필요한 돈을 계산하는 쿼리를 작성해주세요.
SELECT SUM(price) sum_result
FROM products

모든 제품을 구매하기 위해 필요한 돈을 계산하기 위해선 돈이 어떤 컬럼인지 확인. (price)

그리고 연산함수 SUM()을 사용해서 모든 제품의 price를 합하면 된다.

컬럼명은 무엇을 뜻 하는지 알기 쉽게 별명 수정.

 

 


 

3) 상품 주문이 들어왔으니 주문을 처리해봅시다!

orders table

 

  • orders 테이블에서 주문 수량(amount)이 2개 이상인 주문을 진행한 소비자의 ID(customer_id)만 선택하는 쿼리를 작성해주세요.
SELECT customer_id 
FROM orders
WHERE amount >= 2

주문 수량이 2개 이상이라는 조건이 들어가고 조회는 소비자의 ID만 선택되도록 요구된다.

SELECT 컬럼에는 customer_id 만 넣어주고 조건(WHERE)을 이용해서 amount 컬럼이 2 이상인 조건을 넣어주면 된다.

  • <, >, >=, <=, = 이 처럼 우리가 알고 있는 여러 부등호가 사용될 수 있다.
  • <> : 부정연산자

 

 

  • orders 테이블에서 2023년 11월 2일 이후에 주문된 주문 수량(amount)이 2개 이상인 주문을 선택하는 쿼리를 작성해주세요.
SELECT *
FROM orders
WHERE date > '2023-11-02' AND amount >= 2

 

이번엔 조건이 2개나 있는데 문제를 잘 확인하여

조건 2개가 다 맞아야 하는지, 조건 2개 중 하나만 맞아도 되는지 확인한다.

위 문제는 2개 다 맞아야 함으로 AND를 사용해준다.

여기서 유의해야하는 점은 위에 테이블에선 date가 무슨 타입인지 안나와있다.

'...' 이렇게 작성하지 않으면 type error가 발생할 수 있다.

꼭 모든 컬럼의 타입을 확인할 필요가 있다.

  • AND : 조건이 모두 맞아야함.
  • OR : 둘 중 하나의 조건만 맞아도 됌.

 

 

  • orders 테이블에서 주문 수량(amount)이 3개 미만이면서 배송비(shipping_fee)가 15000원보다 비싼 주문을 선태가는 쿼리를 작성해주세요.
SELECT *
FROM orders
WHERE amount < 3 AND shipping_fee > 15000

 

위 문제와 동일하게 풀면된다.

여기서 배송비는 정수 타입이기에 '...' 을 붙이지 않아도 된다.

 

 

 

  • orders 테이블에서 배송비(shipping_fee)가 높은 금액 순으로 정렬하는 쿼리를 작성해주세요.
SELECT *
FROM orders
ORDER BY shipping_fee DESC

정렬하는 문법(order by) 를 사용해주고 어떤 컬럼을 기준으로 정렬하는 지 정해준다.

 

order by는 오름차순이 기본이다.

즉 낮은 수부터 높은 수로 정렬, 내림차순으로 바꾸기 위해 DESC를 붙여주면 된다.

 


 

4) 이제 놀만큼 놀았으니 다시 공부해봅시다!

sparta_students table

  • sparta_students 테이블에서 모든 학생의 이름(name)과 트랙(track)을 선택하는 쿼리를 작성해주세요.
SELECT name, track
FROM sparta_students

이름과 트랙만 선택하는 쿼리이기에 SELECT 컬럼에 name과 track만 넣어준다.

 

 

 

  • sparta_students 테이블에서 Unity 트랙(track) 소속이 아닌 학생들을 선택하는 쿼리를 작성해주세요.
SELECT *
FROM sparta_students
WHERE track <> 'Unity'

Unity 트랙이 아닌 학생들을 선택하는 쿼리이기에 조건문(WHERE)에서 부정연산자를 사용해준다.

  • <> : 부정연산자

 

 

  • sparta_students 테이블에서 입학년도(enrollment_year)가 2021년인 학생과 2023년인 학생을 선택하는 쿼리를 작성해주세요.
SELECT *
FROM sparta_students
WHERE enrollment_year = '2021' OR enrollment_year = '2023'

두 입학년도 모두 출력되야 하기 때문에 조건이 하나로도 충족되도 되는 OR을 사용한다.

  • AND : 조건이 모두 맞아야함.
  • OR : 둘 중 하나의 조건만 맞아도 됌.

 

 

  • sparta_students 테이블에서 Node.js 트랙(track) 소속이고 학점(grade)이 'A'인 학생의 입학년도(enrollment_year)를 선택하는 쿼리를 작성해주세요.
SELECT enrollment_year
FROM sparta_students
WHERE track = 'Node.js' AND grade = 'A'

조건 2개가 모두 충족되야하고 입학년도만 조회해야하기 때문에

먼저 SELECT에는 입학년도 컬럼만 적어주고

조건문(WHERE)은 2개의 조건이 모두 충족되게 AND를 사용한다.

트랙과 학점이 정해져 있기에 '=' 사용하고 문자와 비교하기 '...' 을 붙여준다.

 


 

5) 공부하다보니 팀 프로젝트 시간이 왔어요!

team_projects table

  • team_projects 테이블에서 AWS 예산(aws_cost)이 40000 이상 들어간 프로젝트들의 이름을 선택하는 쿼리를 작성해주세요.
SELECT name
FROM team_projects
WHERE aws_cost >= 40000

예산 40000 이상, 프로젝트들의 이름을 선택하는 쿼리이니 SELECT에 name 컬럼만 넣어주었다.

조건을 맞추기 위해 조건문(WHERE)에 부등호를 사용하여 완성시켜준다.

 

 

 

  • team_projects 테이블에서 2022년에 시작된 프로젝트를 선택하는 쿼리를 작성해주세요. 단, start_date < '2023-01-01' 조건을 사용하지 말고 쿼리를 작성해주세요.
SELECT *
FROM team_projects  
WHERE DATE_FORMAT(date(start_date), '%Y') = '2022'

2022년에 시작된(start_date) 프로젝트만 선택하는 쿼리인데

기존에는 조건문에 start_date < '2023-01-01'를 넣으면 쉽게 해결할 수 있지만 사용하지 말라고 했기에 date_format 함수를 사용하자.

 

  • date_format 함수는 기존에 날짜 데이터를 문자형에서 날짜형으로 타입을 완전히 변환시켜준다.
  • ''%Y, '%m', '%d' 순서대로 연도, 월, 일을 나타내준다. ('%Y%m%d' 한 번에 사용할 수도 있다.)

여기서 필요한 부분은 프로젝트 시작 날짜(start_date) 중에서 연도만 '2022' 인 프로젝트만 선택하면 되기에 위와 같이 작성했다.

 

 

 

  • team_projects 테이블에서 현재 진행중인 프로젝트를 선택하는 쿼리를 작성해주세요. 단, 지금 시점의 날짜를 하드코딩해서 쿼리하지 말아주세요.
SELECT *
FROM team_projects 
WHERE DATE_FORMAT(date(end_date), '%Y%m%d') > CURDATE()

현재 진행중인 프로젝트만 선택한다는 것은 현재 일자가 프로젝트 종료일자 보다 낮으면 된다는 것이다.

우리는 위에서 사용했던 date_format 함수를 이용해서 조건을 걸어주면 되지만 이 문제의 포인트는 지금 시점의 날짜를 하드코딩 하지 말아야 한다는 것이다.

  • 하드 코딩이란? 상수나 변수에 들어가는 데이터(값)를 코드에 직접 입력하는 것
    • EX) (글 올린 날짜 기준) '2024-09-12'로 적으면 안된다는 것
    • why? 우리가 프로그램을 만들었다고 생각했을 때 하드 코딩 했을 시 매일 코드를 수정해야하는 번거로움.

mysql에는 현재 날짜를 나타내주는 CURDATE()가 존재한다.

그래서 end_date가 CURDATE()보다 크면 쿼리되도록 조건문을 작성한다.

 


 

 

  • team_projects 테이블에서 각 프로젝트의 지속 기간을 일 수로 계산하는 쿼리를 작성해주세요.
SELCET *, DATEDIFF(end_date, start_date) duration
FROM team_projects

각 프로젝트의 지속 기간은 프로젝트 종료 일자(end_date) - 시작 일자(start_date) 라고 볼 수 있다.

여기서 두 날짜를 차이를 계산해주는 함수 DATEDIFF 함수를 사용하자.

 

  • DATEDIFF( 날짜1, 날짜2 )
    • 간단히 알아보면 날짜1 - 날짜2를 해주는 함수이다.
    • EX) DATEDIFF ('2024-09-12', '2024-09-11') 
      • result = 1 이 나온다.

 

  • TIMESTAMPDIFF(단위, 날짜1, 날짜2)
    • 이 함수는 단위까지 정할 수 있다. (단위는 검색하면 바로 나온다)
    • DATEDIFF와 차이라면 날짜2 - 날짜1 을 한다.
      • EX) TIMESTAMPDIFF(day, '2024-09-11, '2024-09-12')
        • result = 1