영아일지

[프로그래머스] SQL 고득점 키트 - SELECT 본문

디지털/코딩테스트

[프로그래머스] SQL 고득점 키트 - SELECT

영아일지 2022. 10. 14. 16:16

SELECT문 모음

 

동물의 아이디와 이름

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS

어린 동물 찾기

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

아픈 동물 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "SICK"
ORDER BY ANIMAL_ID

역순정렬하기

SELECT NAME,DATETIME FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

상위 N개 레코드

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

여러 기준으로 정렬하기

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

이름순으로 먼저정렬 > 나중에 시작한 동물 (DESC)


모든 레코드 조회하기

SELECT * from ANIMAL_INS
ORDER BY ANIMAL_ID

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

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

SELECT 필드명1, 필드명2 FROM 테이블명

WHERE 변수명 LIKT %조건% 

: 변수명이 조건을 만족하는 필드를 추출하기

(LIKE: 비슷한)


조건에 맞는 회원수 구하기

SELECT COUNT(*) AS USER FROM USER_INFO
WHERE (YEAR(JOINED) = 2021) AND (AGE BETWEEN 20 AND 29)

YEAR(변수) : 연만

MONTH(변수) : 달만

BETWEEN 숫자 AND 숫자


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

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

과일로 만든 아이스크림 구하기

SELECT a.FLAVOR 
FROM FIRST_HALF AS a LEFT JOIN ICECREAM_INFO AS b 
ON a.FLAVOR = b.FLAVOR
WHERE a.TOTAL_ORDER > 3000 AND b.INGREDIENT_TYPE LIKE "fruit_based" 
ORDER BY a.TOTAL_ORDER DESC

**OUTER JOIN(OUTER 생략가능)

  •  LEFT JOIN : 왼쪽 테이블 기준으로 키값 같은 것 가져오기
    • FROM (LEFT TABLE ) AS A LEFT JOIN (RIGHT TABLE)  AS B ON (A.COLUMN) = (B. COLUMN)
  • RIGHT JOIN : 오른쪽 테이블 기준으로 키값 같은 것 가져오기
    • FROM (LEFT TABLE ) AS A RIGHT JOIN (RIGHT TABLE)  AS B ON (A.COLUMN) = (B. COLUMN)
  • FULL OUTER JOIN: 두 테이블의 합
    • FROM (LEFT TABLE ) AS A  FULL OUTER JOIN (RIGHT TABLE)  AS B ON (A.COLUMN) = (B. COLUMN)

** INNER JOIN : 완전히 일치하는 것들만 (두 테이블의 곱)

  • INNER JOIN
    • FROM (LEFT TABLE ) AS A INNER JOIN (RIGHT TABLE)  AS B ON (A.COLUMN) = (B. COLUMN)

--> 나머지는 조인 포스팅에 더 자세히.


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

SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(ONLINE_SALE_ID) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC;

**GROUP BY ~ HAVING (조건)

 

* WHERE VS HAVING

 : WHERE는 그룹화 하기 전, HAVING은 그룹화 후 조건


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

SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, 
round(AVG(B.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO A JOIN REST_REVIEW B
ON A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE '서울%'
GROUP BY A.REST_ID
ORDER BY SCORE DESC, A.FAVORITES DESC

** ROUND 함수 : 반올림

ROUND(데이터, 나타낼 소수점 개수)

ex) rount(데이터, 2) : 소수점 셋째자리에서 반올림

 

평균 일일 대여 요금 구하기

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE LIKE "%SUV%"

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

SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS, DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD A 
INNER JOIN USED_GOODS_REPLY B
ON A.BOARD_ID = B.BOARD_ID
WHERE YEAR(A.CREATED_DATE) = 2022 AND MONTH(A.CREATED_DATE)=10
ORDER BY CREATED_DATE, TITLE

A, B 꼼꼼히 보자.

 


오프라인/온라인 판매 데이터 통합하기 ** (다시풀기)

급어려워짐

SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, 
PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
UNION ALL
(SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, 
 PRODUCT_ID, NULL, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3)
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

 

**UNION ALL 

1) JOIN : 옆으로 연결

 

2) UNION : 아래로 연결 ( 연결하고자 하는 Column 개수와 타입이 같아야 연결할 수 있.)

  • Union : 중복 데이터 값 삭제하고 연결
  • Union All : 중복되는 값 모두 연결
  • 사용법 : SELECT (칼럼) FROM  (테이블) UNION SELECT (칼럼) FROM
SELECT * FROM Table1 UNION SELECT * FROM Table2

(출처 : https://jaegeun.tistory.com/54)

 


즐겨찾기가 가장 많은 식당 정보 출력하기 ** 다시풀어보기

SELECT A.FOOD_TYPE, REST_ID, REST_NAME, A.FAVORITES
FROM REST_INFO A JOIN (SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
                      FROM REST_INFO
                      GROUP BY FOOD_TYPE
                      ) AS B
ON A.FOOD_TYPE = B.FOOD_TYPE AND A.FAVORITES = B.FAVORITES
ORDER BY FOOD_TYPE DESC

**서브 쿼리 : 테이블을 하나 더 만들기

 테이블 정의해주고 JOIN 하면 된다!

 

**주의 할 점 키를 두개 동시에 충족시키도록 해야함! , FAVORITES는 A!