[프로그래머스 SQL 고득점 Kit] SELECT 모아보기 - 1편

짱J·2023년 2월 20일
1
post-thumbnail

🌎 2022.02.20 updated


문제 수가 많아 글을 1편과 2편으로 나눈다.

  • 1편에서는 SELECT 기본 구조와 Level 1 문제
  • 2편에서는 Level 2, 3, 4 문제

를 다룬다.


SELECT 기본 구조

select (컬럼명)
from (테이블명)
where (조건식)
group by (그룹화할 컬림)
having (조건식)
order by (정렬 방법)
  • 조건문이 여러 개일 때는 AND(그리고)OR(또는)을 사용한다.
  • 컬럼이나 테이블명에 별칭을 지정할 때는 AS를 사용한다.
    ex) SELECT 컬럼명 AS 별칭
  • order by에서 default 값은 ASC(오름차순)이며, 내림차순으로 지정하고 싶을 때는 컬럼명 뒤에 DESC를 붙이면 된다.
    • 2가지 이상의 컬럼에 대해 정렬할 때는 우선순위에 맞춰 작성해주면 된다.
      ex) order by age desc - 나이를 기준으로 내림차순 정렬한다는 의미이다.
      ex) order by age desc, name - 나이를 기준으로 내림차순 정렬하고, 만약 나이가 동일하다면 이름을 기준으로 오름차순 정렬한다 의미이다.

평균 일일 대여 요금 구하기

-- CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요.
-- 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

select round(avg(daily_fee)) as average_fee
from car_rental_company_car
where car_type='suv'

반올림, 올림, 내림 문법컬럼에 별칭을 부여하는 방법에 대해 공부할 수 있는 문제이다.

  • 반올림 - ROUND(컬럼명, 반올림할 자릿수) - 반올림할 자릿수 + 1에서 반올림한다.
  • 내림 - TRUNCATE(컬럼명, 내림할 자릿수) - 버릴 자릿수 + 1 아래로 버린다.
  • 정수로 내림 - FLOOR(컬럼명)
  • 정수로 올림 - CEIL(컬럼명)

12세 이하인 여자 환자 목록 출력하기

-- PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요.
-- 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이가 같다면 환자이름을 기준으로 오름차순 정렬해주세요.


select pt_name, pt_no, gend_cd, age, if(tlno is null, 'NONE', tlno) as tlno
from patient
where age<=12 and gend_cd='w'
order by age desc, pt_name

반환값이 참 또는 거짓일 때의 조건문에 대해 공부할 수 있는 문제이다.

반환값이 참, 거짓 두 가지만 있을 때는 IF문을 사용한다.
구조: IF(조건, 참일 때 값, 거짓일 때 값)
ex) if(tlno is null, 'NONE', tlno)

반환값이 여러 개일 때는 CASE WHEN문을 사용한다.
CASE WHEN문 사용법은 후에 나올 @@@에서 설명한다.


강원도에 위치한 생산공장 목록 출력하기

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

select factory_id, factory_name, address
from food_factory
where address like '강원도%'
order by factory_id

문자열 검색 방법에 대해 공부할 수 있는 문제이다.

특정 문자열이 포함되었는지 확인하고 싶을 때는 LIKE문을 사용한다.
구조: WHERE (컬럼명) LIKE (검색하고 싶은 문자열)

  • where address like '강원도%' - 강원도로 시작하는 address 검색
  • where address like '%강원도' - 강원도로 끝나는 address 검색
  • where address like '%강원도%' - 강원도가 포함된 address 검색

흉부외과 또는 일반외과 의사 목록 출력하기

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

select dr_name, dr_id, mcdp_cd, date_format(hire_ymd, '%Y-%m-%d') as hire_ymd
from doctor
where mcdp_cd='CS' or mcdp_cd='GS'
order by hire_ymd desc, dr_name

날짜 형식을 지정하는 방법에 대해 공부할 수 있는 문제이다.

날짜 형식을 지정하고 싶을 때는 DATE_FORMAT문을 사용한다.
구조: DATE_FORMAT(날짜, 형식)

  • 주로 '%Y-%m-%d'를 사용한다.
    • '2022-02-20' 형식으로 출력된다.

과일로 만든 아이스크림 고르기

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

select first_half.flavor
from first_half, icecream_info
where first_half.flavor=icecream_info.flavor
and total_order>3000
and ingredient_type='fruit_based'
order by total_order desc

두 테이블을 조인하는 방법에 대해 공부할 수 있는 문제이다.

두 테이블을 조인할 때는 조건문 키워드로 WHERE 대신 ON을 사용한다.

나는 주로 INNER JOIN 키워드를 생략한 INNER JOIN문을 사용한다.


조건에 맞는 도서 리스트 출력하기

-- BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
-- 결과는 출판일을 기준으로 오름차순 정렬해주세요.

select book_id, date_format(published_date, '%Y-%m-%d') as published_date
from book
where category='인문'
and published_date like '2021%'
order by published_date

인기있는 아이스크림

-- 상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 
-- 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요.

select flavor
from first_half
order by total_order desc, shipment_id

모든 레코드 조회하기

-- 동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.

select * from animal_ins;

모든 레코드를 조회하는 방법에 대해 공부할 수 있는 문제이다.
모든 컬럼을 조회하고 싶을 때는 모든 컬럼을 다 적어도 되지만, 간편하게 *만 적어도 된다.


역순 정렬하기

-- 동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 
-- 이때 결과는 ANIMAL_ID 역순으로 보여주세요.
select name, datetime
from animal_ins
order by animal_id desc

아픈 동물 찾기

-- 동물 보호소에 들어온 동물 중 아픈 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요.
-- 이때 결과는 아이디 순으로 조회해주세요.

select animal_id, name
from animal_ins
where intake_condition='Sick'
order by animal_id

앞에서 특정 문자열이 포함됐는지 확인할 때는 LIKE문을 사용한다고 했는데, 레코드가 특정 문자열과 일치하는지 확인할 때는 등호(=)를 사용하여 비교할 수 있다.


어린 동물 찾기

-- 동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요.
-- 이때 결과는 아이디 순으로 조회해주세요.
-- 젊은 동물: INTAKE_CONDITION이 Aged가 아닌 경우를 뜻함

select animal_id, name
from animal_ins
where intake_condition!='Aged'
order by animal_id

NOT 구문에 대해 공부할 수 있는 문제이다.

조건을 부정할 때는 등호 대신 !=을 사용하거나, 조건 앞에 not 키워드를 붙인다.

!=을 사용하여 intake_condition이 'Aged'가 아닌 튜플들을 구할 수 있다.
where not intake_condition='Aged' 라고 해도 결과가 동일하다.


동물의 아이디와 이름

-- 동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.

select animal_id, name
from animal_ins
order by animal_id

여러 기준으로 정렬하기

-- 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 
-- 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

select animal_id, name, datetime
from animal_ins
order by name, datetime desc

상위 n개 레코드

-- 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

select name
from animal_ins
order by datetime
limit 0, 1

Limit 문법을 공부할 수 있는 문제이다.

출력되는 행의 갯수를 지정하고 싶을 때는 쿼리문 마지막에 LIMIT문을 사용한다.

  • LIMIT a - 처음부터 시작하여 a개의 행을 출력한다
  • LIMIT a, b - a번째 행부터 b개의 출력한다.
    • ⚠️주의⚠️ 행의 인덱스는 0부터 시작한다.

조건에 맞는 회원수 구하기

-- USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.

select count(*) as users
from user_info
where joined like '2021-%' and age like '2%'

조건을 만족하는 튜플의 개수를 세는 방법을 공부할 수 있는 문제이다.

테이블에 존재하는 데이터 갯수를 세고 싶을 때 COUNT 함수를 사용한다.

  • 이 때 NULL인 데이터는 제외하고 계산한다.
  • 전체 행 갯수를 가져올 때는 컬럼 대신에 *을 사용할 수 있다.
select count(*) from table;
profile
[~2023.04] 블로그 이전했습니다 ㅎㅎ https://leeeeeyeon-dev.tistory.com/

0개의 댓글