🌎 2022.02.20 updated
문제 수가 많아 글을 1편과 2편으로 나눈다.
를 다룬다.
select (컬럼명)
from (테이블명)
where (조건식)
group by (그룹화할 컬림)
having (조건식)
order by (정렬 방법)
AND(그리고)
나 OR(또는)
을 사용한다.AS
를 사용한다.DESC
를 붙이면 된다.-- 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(컬럼명)
-- 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
-- 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 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;