차곡차곡 성 쌓기
article thumbnail

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

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

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE GEND_CD = 'W' 
AND AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC;
  • IFNULL - NULL 체크 후 원하는 값 넣을 수 있음
  • ORDER BY : 정렬하기. 기본이 ASC(오름차순)이며 내림차순은 DESC

 

2. 인기있는 아이스크림2세 이하인

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

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC

 

3

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

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

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d')
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

DATE_FORTMAT : DATE 타입의 날짜를 원하는 값으로 가공할 수 있음

  • %Y-%m-%d : 연도(4)-월(2)-일(2)로 가공 가능 
  • ex) 2024-02-20

 

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

[JOIN, ON]

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

SELECT F.FLAVOR
FROM ICECREAM_INFO I 
INNER JOIN FIRST_HALF F
ON I.FLAVOR = F.FLAVOR

WHERE F.TOTAL_ORDER > 3000 
AND I.INGREDIENT_TYPE = 'fruit_based'

ORDER BY TOTAL_ORDER DESC;

INNER JOIN

  • 두 테이블에 모두 데이터가 있어야할 때 사용. 조건으로 ON절 사용

OUTER JOIN

  •  LEFR JOIN : 왼쪽 테이블 전체 + 두 테이블의 교집합
  •  RIGHT JOIN : 오른쪽 테이블 전체 + 두 테이블의 교집합
12세 이하인 여자 환자 목록 출력하기

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

[LIKE]

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

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID;

LIKE : 특정 문자열 찾기

  • (%) : 모든 문자
  • (_) :  한 글자

예시

    • '%라면%' : 데이터 중 앞뒤에 무슨 글자가 오든 '라면'이라는 문자가 있으면 출력

     • '_라면%' : 뒤에는 아무글자가 와도 상관없지만 '라면' 문자앞에는 한 글자만 와야 출력. (진라면, 열라면)

     • '__라면%' : 뒤에는 아무글자가 와도 상관없지만 '라면' 문자앞에는 두 글자만 와야 출력. (열무라면, 비빔라면)

 

 

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

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

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE DATE_FORMAT(PUBLISHED_DATE,'%Y') = '2021'
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;

 

7. 평균 일일 대여 요금 구하기

[ROUND, AS]

문제 : 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 함수 : 반올림

  • ROUND(컬럼명) - 소수점 1번째 자리에서 반올림 (124.2 -> 124)
  • ROUND(컬럼명, 1) - 소수점 2번째 자리에서 반올림 (124.29 -> 124.3)
  • ROUND(컬럼명, -1) - 10단위로 반올림 (124.2 -> 120)

 

8. 조건에 부합하는 중고거래 댓글 조회하기

[JOIN]

문제 : USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

SELECT 
B.TITLE, 
B.BOARD_ID, 
R.REPLY_ID, 
R.WRITER_ID, 
R.CONTENTS, 
DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d')

FROM 
USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID

WHERE 
DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE;

 

 

9. 모든 레코드 조합하기

[*]

문제 : 동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

SELECT *

FROM
ANIMAL_INS

ORDER BY ANIMAL_ID
  • 컬럼 하나 하나 다 써줬는데 모두 검색이니 * 하나만 쓰면 되었다!
  • 또한 출력값이 2018-01-22 14:32:00 라서 DATE_FORMAT(DATETIME,'%Y-%m-%d %H:%m:%s')  쓰는 줄 알았는데 DATE 타입을 출력하면 디폴트가 저 형식이어서 따로 가공 안해줘도 된다.

 

10. 역순 정렬하기

문제 : 동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요

SELECT
NAME,
DATETIME

FROM
ANIMAL_INS

ORDER BY ANIMAL_ID DESC;

 

 

11. 상위 n개 레코드

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

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;

LIMIT : 최대 몇 개의 행 출력 지정

날짜를 기준으로 오름차순 정렬 후 1개의 행만 출력하도록 한다.

 

또는 서브쿼리를 이용한다. 

SELECT NAME

FROM ANIMAL_INS

WHERE 
DATETIME = (SELECT MIN(DATETIME) 
            FROM ANIMAL_INS);

집계함수를 사용할 때 그룹을 무조건 지정해야하는 줄 알았는데 아닌가보다..! 

한 개의 컬럼에 대한 값을 원할 때는 그룹 지정이 필요없다.

 

12. 경기도에 위치한 식품창고 목록 출력하기

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

SELECT 
WAREHOUSE_ID,
WAREHOUSE_NAME,
ADDRESS,
IFNULL(FREEZER_YN, 'N') AS FREEZER_YN

FROM FOOD_WAREHOUSE

WHERE
ADDRESS LIKE '경기도%'

ORDER BY WAREHOUSE_ID;

 

IFNULL : NULL 값 확인 후 원하는 값으로 대체할 수 있음

 

++ 경기도 글자 안보여서 왜 틀렸는지 고민했다.. 

 

13. 자동차 대여 기록에서 장기/단기 대여 구분하기

문제 : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

SELECT 
HISTORY_ID,
CAR_ID,
DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE,
DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
CASE WHEN DATEDIFF(END_DATE, START_DATE) +1 >= 30 THEN '장기대여'
ELSE '단기대여' END AS RENT_TYPE

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

WHERE DATE_FORMAT(START_DATE, "%Y-%m") = '2022-09'

ORDER BY HISTORY_ID DESC;

LEVEL1에서 제일 어려운 문제였다. 날짜간의 차이를 구할려면 if, else 문 쓰고 마지막 날도 알아야하지 않나,,? 싶어서 sql로 어떻게 해야하는 감도 안잡혔다. 방법은 바로 [DATEDIFF] 함수를 사용하는 것이다. DATEDIFF 함수는 인자로 받은 두 DATE 타입의 데이터 차를 비교하여 알려준다. 

 

또한 SQL의 if문처럼 사용하는 [CASE-WHEN-THEN]을 같이 사용해야 한다. WHEN 뒤에 조건문을 적고, 조건문이 일치할 경우 원하는 출력 값을 적어준다. ELSE 문에는 어떠한 조건도 성립하지 않는 데이터의 출력을 지정할 떄 사용한다. 또한 CASE-WHEN-THEN 문은 SELECT 문에서 새로운 컬럼을 추가할 때 사용한다. 

profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 좋아요