TIL

SQL 고득점 Kit 풀이- SELCT, STRING& DATE (1)

조맹구 2023. 10. 20. 14:57

SELECT- 12세 이하인 여자 환자목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/132201

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

order by는 SELECT 문에서 논리적으로 맨 마지막에 수행. 

ifnull: 해당 컬럼값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수

SELECT IFNULL(NAME,"example none") as NAME

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

https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

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

- GROUP BY의 기준에 속성을 여러 개 줄 수 있다.

- HAVING을 이용해 GROUP BY 집계 결과에 조건을 줄 수 있다

-  집계함수 COUNT로 컬럼의 갯수를 산출한다. 

 

 

SELECT- 조건에 맞는 회원수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131535

 

SELECT COUNT(*)as USERS FROM USER_INFO
WHERE YEAR(JOINED) ="2021"  and 20<=AGE and AGE<=29

- YEAR, MONTH, DAY를 이용해 날짜 추출 가능

- 20<= AGE <=29 처럼 작성해서는 안된다.

 

SELECT- 오프라인/온라인 판매 데이터 통합하기

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY  SALES_DATE, PRODUCT_ID, USER_ID

-  LIKE 연산자: 문자열의 패턴을 검색하는 데 사용

- %는 모든 문자, _ 는 한 글자를 의미

- '%스파게티%' => 스파게티가 들어간 모든 문자 출력

-UNION: 두 개 이상의 SELECT 문의 결과 집합을 결합

- UNION ALL: 중복 데이터 출력 

- JOIN과 달리 두 개의 SQL 문에서 만들어진 필드가 동일한 데이터 유형에 사용되어야 한다.

[SQL문1]
UNION
[SQL문2];

 

String, Date -  자동차 대여 기록에서 장기/단기 대여 구분하기

https://school.programmers.co.kr/learn/courses/30/lessons/151138

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,
IF(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE date_format(START_DATE,'%Y-%m') LIKE '2022-09'
ORDER BY HISTORY_ID DESC

- Date_format(날짜컬럼, 형식)

- DATEDIFF( 'END-DATE','START_DATE')

- IF(조건문, 참일 때의 값, 거짓일 때의 값) AS result 

 

 

String,Date- 조건에 부합하는 중고거래 상태 조회하기

.https://school.programmers.co.kr/learn/courses/30/lessons/164672

 

SELECT BOARD_ID,WRITER_ID, TITLE, PRICE, 
CASE
    WHEN STATUS LIKE 'SALE' THEN '판매중'
    WHEN STATUS LIKE 'RESERVED' THEN '예약중'
    WHEN STATUS LIKE 'DONE' THEN '거래완료'
END AS STATUS
FROM USED_GOODS_BOARD
WHERE DATE_FORMAT(CREATED_DATE,'%Y-%m-%d') LIKE '2022-10-05'
ORDER BY BOARD_ID DESC

String, Date- 자동차 평균 대여기간 구하기

 

https://school.programmers.co.kr/learn/courses/30/lessons/157342

SELECT CAR_ID,
ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1),1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID 
HAVING AVERAGE_DURATION>=7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

- SELECT 문의 논리적 수행 순서가 FROM -> WHERE-> GROUP BY-> HAVING -> SELECT -> GROUP BY이니까 가능 

 

 

String, DATE- 대여 기록이 존재하는 자동차 리스트 구하기

.

https://school.programmers.co.kr/learn/courses/30/lessons/157341

 

1. 자동차 종류가 '세단' 인 자동차 ID 

2. 10월에 대여를 시작한 자동차 ID => WHERE절로 DATE 걸러주기

=> 두 테이블을 자동차 ID로 연결 => JOIN연산 사용 

3. 자동차 ID 중복이 없어야 한다.=> SELECT DISTINCT

4. 자동차 ID 내림차순 정렬

 

SELECT DISTINCT CAR.CAR_ID FROM CAR_RENTAL_COMPANY_CAR as CAR INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY as RENTAL
on CAR.CAR_ID =RENTAL.CAR_ID
WHERE CAR.CAR_TYPE LIKE "세단" and MONTH(RENTAL.START_DATE)=10
ORDER BY CAR.CAR_ID DESC

 

조인연산

SELECT <열 목록>
FROM <기준 테이블>
    INNER JOIN<참조할 테이블>
    ON <조인 조건>
[WHERE 검색조건]