[프로그래머스] SQL : SELECT (MySQL / Oracle)

진예·2023년 11월 15일
0

Programmers

목록 보기
3/45
post-thumbnail

☑️ 3월에 태어난 여성 회원 목록 출력하기

1. MySQL

  • DATE_FORMATE(값, 형식) : 날짜 데이터를 입력한 형식대로 출력 (형식 참조)
SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
	DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL 
    AND MONTH(DATE_OF_BIRTH) = 3
    AND GENDER = 'W'
ORDER BY MEMBER_ID;

2. Oracle

  • EXTRACT(추출할 데이터 FROM 컬럼명) : 날짜 데이터에서 년/월/일/시/분/초추출

  • TO_CHAR() : 날짜/숫자 데이터를 문자열로 변환 (형식 참조)
SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
	TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') AS BIRTH_OF_DATE
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL 
    AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = 3
    AND GENDER = 'W'
ORDER BY MEMBER_ID;

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

1. MySQL

  • IFNULL(표현식1, 표현식2) : 표현식1이 NULL이면 표현식2 출력
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 ASC;

2. Oracle

  • NVL(표현식1, 표현식2) : 표현식1이 NULL이면 표현식2 출력
  • NVL2(표현식, 값1, 값2) : 표현식NULL이면 값2, 아니면 값1 출력
SELECT PT_NAME, PT_NO, GEND_CD, AGE, NVL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;

☑️ 평균 일일 대여 요금 구하기

1. MySQL / 2. Oracle

✏️ ROUND(값, n) : 소수를 n번째 자리까지 반올림

SELECT ROUND(AVG(DAILY_FEE), 0) AS AVEGAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

☑️ 인기있는 아이스크림

1. MySQL / 2. Oracle

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;

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

1. MySQL

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

2. Oracle

SELECT BOOK_ID, 
	TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISED_DATE
FROM BOOK
WHERE EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021
    AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;

☑️ 조건에 부합하는 중고거래 댓글 조회

1. MySQL

  • SUBSTR(문자열, N, M) : N번째 문자열 ~ M번째 문자열 추출
SELECT TITLE, B.BOARD_ID, REPLY_ID, R.WRITER_ID, R.CONTENTS, 
    DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE SUBSTR(B.CREATED_DATE, 1, 7) = '2022-10'
ORDER BY R.CREATED_DATE, TITLE;

2. Oracle

SELECT TITLE, B.BOARD_ID, REPLY_ID, R.WRITER_ID, R.CONTENTS, 
	TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') AS CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM') = '2022-10'
ORDER BY R.CREATED_DATE, TITLE;

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

1. Mysql / Oracle

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

☑️ 서울에 위치한 식당 목록 출력하기

1. MySQL

SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, 
	ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I INNER JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY R.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;

2. Oracle

  • ORA-00979: not a GROUP BY expression : 오라클에서 Group By절을 사용하려면 SELECT절에 사용된 모든 컬럼을 적어줘야 한다. (집계함수에 사용된 컬럼은 안적어줘도 됨!)
SELECT R.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS,
	ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I INNER JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY R.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS
ORDER BY SCORE DESC, FAVORITES DESC;

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

1. MySQL

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

2. Oracle

SELECT DR_NAME, DR_ID, MCDP_CD, 
	TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') AS HIRE_YDM
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;

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

1. MySQL / 2. Oracle

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

☑️ 재구매가 일어난 상품과 회원 리스트 출력하기

1. MySQL / 2. Oracle

  • (USER_ID, PRODUCT_ID) 그룹의 COUNT() 결과가 2 이상이여야 하므로 WHERE절이 아닌 HAVING(그룹의 조건)절을 사용해야 함
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;

☑️ 모든 레코드 조회하기

1. MySQL / 2. Oracle

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

☑️ 오프라인/온라인 판매 데이터 통합하기

1. MySQL

(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, 
	PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, 
	PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFlINE_SALE
WHERE MONTH(SALES_DATE) = 3)
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

2. Oracle

  • 오라클의 ORDER BY절에서는 컬럼명 대신 컬럼의 인덱스를 명시해도 된다. 컬럼명 + 인덱스의 조합도 가능!
(SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE, 
	PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE EXTRACT(MONTH FROM SALES_DATE) = 3
UNION
SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE, 
	PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFlINE_SALE
WHERE EXTRACT(MONTH FROM SALES_DATE) = 3)
ORDER BY 1, 2, 3;

☑️ 역순 정렬하기

1. MySQL / 2. Oracle

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

☑️ 아픈 동물 찾기

1. MySQL / 2. Oracle

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID;

☑️ 어린 동물 찾기

1. MySQL / 2. Oracle

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;

☑️ 동물의 아이디와 이름

1. MySQL / 2. Oracle

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

☑️ 여러 기준으로 정렬하기

1. MySQL / 2. Oracle

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;

☑️ 상위 n개 레코드

1. MySQL

  • LIMIT n : 상위 n개의 행만 출력
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

2. Oracle

  • ROWNUM : 추출할 행 인덱스 ➡️ 서브쿼리를 사용하지 않고 ORDER BY절WHERE절 뒤에 쓰면 WHERE절을 먼저 수행한 후에 ORDER BY절을 수행하여 의도한 값이 나오지 않는다!
SELECT NAME
FROM (SELECT NAME
     FROM ANIMAL_INS
     ORDER BY DATETIME)
WHERE ROWNUM = 1;

☑️ 조건에 맞는 회원수 구하기

1. MySQL

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
    AND AGE >= 20 AND AGE <=29;

2. Oracle

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE EXTRACT(YEAR FROM JOINED) = 2021
    AND AGE >= 20 AND AGE <=29;
profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글