[SQL] 01. Select 문제 총정리

다나·2023년 1월 15일
0

SQL

목록 보기
1/6
post-thumbnail

1. 인기있는 아이스크림 🍦

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 총 주문량을 기준으로 내림차순으로 정렬한다.
2️⃣ 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬

* select의 이중 정렬 및 정렬

  • ORDER BY 다중 정렬을 할 때, 왼쪽부터 순차적으로 정렬되기 때문에 순서를 고려해야 한다.
  • 즉, 우선순위가 높은 순서대로 나열한다.
  • order by 칼럼명
    ASC : 오름차순 1 2 3 4 5
    DESC : 내림차순 5 4 3 2 1
SELECT FLAVOR from FIRST_HALF order by TOTAL_ORDER desc, SHIPMENT_ID;

참고자료 : https://dar0m.tistory.com/60
https://velog.io/@ygh7687/SQL-문법-정리#select


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

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회한다.
2️⃣ 공장 ID를 기준으로 오름차순 정렬한다.

* Like 문법

  • SELECT * FROM [테이블명] WHERE LIKE [조건]
  • : 글자숫자를 정해줌(EX. 컬럼명 LIKE '홍동')
    % : 글자숫자를 정해주지않음(EX. 컬럼명 LIKE '홍%')
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS from FOOD_FACTORY where ADDRESS like "강원도%" order by FACTORY_ID;

참고 자료 : https://coding-factory.tistory.com/114


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

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 진료과가 흉부외과(CS)이거나 일반외과(GS)이다. -> where or
2️⃣ 의사의 이름, 의사ID, 진료과, 고용일자를 조회한다.
3️⃣ 고용일자를 기준으로 내림차순 정렬한다. -> order by desc
4️⃣ 고용일자가 같다면 이름을 기준으로 오름차순 정렬한다.
5️⃣ 날짜 포맷은 2020-03-01와 동일하게 나와야한다.

* 날짜 포맷 : DATE_FORMAT(날짜컬럼명, "%Y-%m-%d");

* 출력 컬럼명 별칭 붙이기 : as

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;

참고 자료 : https://bramhyun.tistory.com/28


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

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회한다.

  • where AGE <= 12 and GEND_CD = 'W'

2️⃣ 전화번호가 없는 경우, 'NONE'으로 출력시켜 준다.

  • ifnull(TLNO, 'NONE') as TLNO

3️⃣ 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬한다.

  • order by AGE desc, PT_NAME;

* SQL 조회된 데이터가 없는 경우, NULL일 때 원하는 값 출력하기 : ifnull(칼럼명, 원하는 값)

SELECT PT_NAME, PT_NO, GEND_CD, AGE, ifnull(TLNO, 'NONE') as TLNO from PATIENT 
where AGE <= 12 and GEND_CD = 'W' order by AGE desc, PT_NAME;

참고 자료 : https://eggwhite0.tistory.com/113


5. 평균 일일 대여 요금 구하기 🚲

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력한다.

  • where CAR_TYPE = "SUV", AVG(DAILY_FEE)

2️⃣ 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림한다.

  • round(AVG(DAILY_FEE),0)

* 평균(Average) 구하기 : AVG(컬럼명)

* 반올림 하기 : round(컬럼명, 반올림할 자릿수)

SELECT round(AVG(DAILY_FEE),0) as AVERAGE_FEE from CAR_RENTAL_COMPANY_CAR 
where CAR_TYPE = "SUV";

참고 자료 : https://m.blog.naver.com/regenesis90/222180576630
https://gent.tistory.com/513


6. 모든 레코드 조회하기 🕵️

난이도 : LEVEL 1

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

문제 풀이

1️⃣ ANIMAL_ID 순으로 조회한다.

  • order by ANIMAL_ID
SELECT * from ANIMAL_INS order by ANIMAL_ID;

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

난이도 : LEVEL 1

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요.
PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

문제 풀이

1️⃣ 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트

  • where PUBLISHED_DATE like "2021%" and CATEGORY = "인문"

2️⃣ 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하되, PUBLISHED_DATE의 데이트 포맷은 (2021-03-15)와 같이 동일해야 한다.

  • select BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, "%Y-%m-%d") as PUBLISHED_DATE

3️⃣ 출판일을 기준으로 오름차순 정렬한다.

  • order by PUBLISHED_DATE
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE,"%Y-%m-%d") as PUBLISHED_DATE from BOOK 
where PUBLISHED_DATE like "2021%" and CATEGORY = "인문" order by PUBLISHED_DATE;

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

난이도 : LEVEL 1

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

문제풀이

1️⃣ 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛

  • where TOTAL_ORDER > 3000 and INGREDIENT_TYPE = 'fruit_based'

2️⃣ 총주문량이 큰 순서대로 조회한다.

  • order by TOTAL_ORDER desc

3️⃣ ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키이다.

FIRST_HALF 테이블

SHIPMENT_IDFLAVORTOTAL_ORDER
101chocolate3200
102vanilla2800
103mint_chocolate1700

ICECREAM_INFO 테이블

FLAVORINGREDIENT_TYPE
chocolatesugar_based
vanillasugar_based
mint_chocolatesugar_based

* JOIN (INNER, OUTER)

  • 조인을 쓰면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.
  • 두 테이블의 조인을 위해서는 기본키(PRIMARY KEY, PK)와 외래키(FOREIGN KEY, FK) 관계로 맺어져야 하고, 이를 일대다 관계라고 한다.
  • INNER JOIN(내부 조인) :
SELECT <열 목록>
 FROM <첫 번째 테이블>
          INNER JOIN <두 번째 테이블>
          ON <조인될 조건>
[WHERE 검색 조건]

  • OUTER JOIN(외부 조인)
SELECT <열 목록>
 FROM <첫 번째 테이블(LEFT 테이블)>
          <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
           ON <조인될 조건>
 [WHERE 검색 조건]

SELECT A.FLAVOR
FROM FIRST_HALF A
JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR
WHERE TOTAL_ORDER > 3000 AND B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC

참고 자료 : https://hongong.hanbit.co.kr/sql-기본-문법-joininner-outer-cross-self-join/


9. 역순으로 정렬하기 🤸‍♀️

난이도 : LEVEL 1

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

문제 풀이

1️⃣ ANIMAL_ID 역순으로 보여준다.

  • order by ANIMAL_ID desc
SELECT NAME, DATETIME from ANIMAL_INS order by ANIMAL_ID desc;

10. 아픈 동물 찾기 🐯

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 아픈 동물의 아이디와 이름을 조회한다.

  • where INTAKE_CONDITION = "Sick"

2️⃣ 아이디 순으로 조회한다.

  • order by ANIMAL_ID
SELECT ANIMAL_ID, NAME from ANIMAL_INS 
where INTAKE_CONDITION = "Sick" order by ANIMAL_ID;

11. 어린 동물 찾기 🧸

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 젊은 동물(INTAKE_CONDITION이 Aged가 아닌 경우)의 아이디와 이름을 조회한다.

  • where INTAKE_CONDITION != "Aged"

2️⃣ 아이디 순으로 조회한다.

  • order by ANIMAL_ID
SELECT ANIMAL_ID, NAME from ANIMAL_INS 
where INTAKE_CONDITION != "Aged" order by ANIMAL_ID;

12. 동물의 아이디와 이름 🐶

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 아이디 순으로 조회한다.

  • order by ANIMAL_ID
SELECT ANIMAL_ID, NAME from ANIMAL_INS order by ANIMAL_ID;

13. 여러 기준으로 정렬하기 🗂️

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 한다.

  • 정렬 우선 순위 : NAME, DATETIME
  • order by NAME, DATETIME desc
SELECT ANIMAL_ID, NAME, DATETIME from ANIMAL_INS 
order by NAME, DATETIME desc;

14. 상위 n개 레코드 🏅

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회한다.

  • 동물 보호소에 들어온 순서대로 정렬하고 그 중에서 가장 맨 위의 1개를 선택한다.
  • order by DATETIME limit 1

* limit 숫자 : 보여주는 행의 개수를 제한한다.

SELECT NAME from ANIMAL_INS order by DATETIME limit 1;

15. 조건에 맞는 회원 수 구하기 👗

난이도 : LEVEL 1

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

문제 풀이

1️⃣ 2021년에 가입한 회원

  • where JOINED like "2021%"

2️⃣ 나이가 20세 이상 29세 이하인 회원

  • where AGE >= 20 and AGE <= 29

3️⃣ 몇 명인지 출력한다.

  • count(*) as USERS

* count(칼럼명) : 행 개수 구하기

SELECT count(*) as USERS from USER_INFO 
where AGE >= 20 and AGE <= 29 and JOINED like "2021%"

참고 자료 : https://overcome-the-limits.tistory.com/367


16. 3월에 태어난 여성 회원 목록 출력하기 🙇🏻‍♀️

난이도 : LEVEL 2

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

문제 풀이

1️⃣ 3월인 여성 회원이다.

  • where DATE_OF_BIRTH like "%-03-%" and GENDER = "W"

2️⃣ 전화번호가 NULL인 경우는 출력대상에서 제외한다.

  • where NOT TLNO IS NULL

3️⃣ 회원ID를 기준으로 오름차순 정렬한다.

  • order by MEMBER_ID

* NOT 칼럼명 IS NULL : NULL을 제외한 값 얻어내기

SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
DATE_FORMAT(DATE_OF_BIRTH, "%Y-%m-%d") as DATE_OF_BIRTH
from MEMBER_PROFILE 
where DATE_OF_BIRTH like "%-03-%" and NOT TLNO IS NULL and GENDER = "W"
order by MEMBER_ID;

참고 자료 : https://kimsg.tistory.com/250


profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글