프로그래머스 SQL 문제를 풀면서...

Chocolajin·2023년 4월 30일
1

배움

목록 보기
4/5

프로그래머스 SQL 문제를 1단계부터 풀면서 몰랐던 부분을 기록하고자 한다.


중복 제거하기

❗ COUNT속성

COUNT(*) 👉 NULL을 포함한 모든 컬럼 수를 센다.

COUNT(ColumnName) 👉 NULL 값은 제외하고 센다. 빈 문자열은 COUNT() 결과에 포함한다.

COUNT( DISTINCT( ColumnName ) ) 👉 중복을 제거하고 NULL값도 제외한 값들만 센다.


나이 정보가 없는 회원 수 구하기

❗ NULL 값 검색

WHERE 절에 컬럼이름 IS NULL 을 적으면 끝!


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

❗ NULL 값 치환 함수

mssql 은 ISNULL
oracle 은 NVL
mysql 은 IFNULL

함수명(컬럼(널아니면 출력될 컬럼),널값일경우 대체할 값))


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

❗DATE_FORMAT

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

date_format([칼럼 이름], '%Y-%m-%d')

2020-03-01 00:00:00 이 형식의 날짜를 2020-03-01 이렇게 시간 빼고 날짜만 나오게 바꿀 수 있다.


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

❗IF

IF(조건문, 참일때 값, 거짓일 때 값)

❗DATEDIFF

DATEDIFF(날짜 a, 날짜 b)

이 문제에서 자동차 대여 기간을 구할 때
DATEDIFF(2022-09-26,2022-09-26)의 결과가 0이지만 하루 빌린 것이므로 대여기간은 1이다.
그래서 장기대여와 단기대여를 구분하기 위해 DATEDIFF()한 결과에 1을 더해주고 30일 이상인지 아닌지를 검사했다.


카테고리 별 상품 개수 구하기

❗문자열 자르기

SUBSTRING("문자열", "시작위치", "길이") : 지정한 위치에서 지정한 문자열 길이만큼 자를 때 사용

LEFT("문자열", "길이") : 왼쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용

RIGHT("문자열", "길이") : 오른쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용

참고) SELECT에서 지정한 값을 기준으로 GROUP BY, ORDER BY 한다.


조건에 부합하는 중고거래 상태 조회하기

❗ CASE

  • CASE WHEN
CASE WHEN 조건절 THEN 참일때 값 ELSE 거짓일때 값 END 컬럼명
  • 다중 CASE WHEN
(CASE WHEN 조건절 THENWHEN 조건절 THENWHEN 조건절 THENELSEEND) AS '컬럼이름'

가격대 별 상품 개수 구하기

❗TRUNCATE

TRUNCATE(숫자,버릴 자릿수)

SELECT TRUNCATE(3456.1234567 ,1) FROM DUAL;
// 3456.1
 
SELECT TRUNCATE(3456.1234567 ,-2) FROM DUAL;
// 3400 

오랜 기간 보호한 동물(1)

❗ LEFT JOIN 겹치는 칼럼 제외하기

https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

FROM ANIMAL_INS AS A LEFT JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL

id를 기준으로 left join 한 후 오른쪽 테이블의 id가 null 인 컬럼을 찾으면 왼쪽 테이블에만 있고 오른쪽 테이블에는 없는 칼럼이 선택된다.


❓조건에 맞는 사용자 정보 조회하기

❗문자열 합치기

CONCAT('문자열1','문자열2','문자열3')
👉'문자열1문자열2문자열3'
CONCAT() 합칠 문자열을 모두 넣어준다.

CONCAT_WS('구분자','문자열1','문자열2','문자열3')
👉'문자열1구분자문자열2구분자문자열3'
구분자에 " " 를 쓰면 문자열들을 띄워쓰기로 구분하여 나타내고
구분자에 ","를 쓰면 문자열을 쉼표로 구분하여 나타냄


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

❗UNION ALL

UNION ALL은 두 테이블을 세로 방향 결합하고 중복을 제거하지 않고 모두 가져온다.

❗NULL AS USER_ID

UNION 으로 테이블을 합치려면 컬럼 수가 같아야하는데 오프라인 판매내역에는 유저 아이디가 없다. 오프라인 테이블에 유저아이디라는 이름의 컬럼을 NULL 값으로 채워주려면 NULL AS USER_ID 라고 하면 아주 간단하게 해결되는 거였다!

profile
뱁새 개발자 황새 따라잡다

0개의 댓글