1. 0. TL;DR
  2. 1. SELECT
  3. 2. SUM, MAX, MIN
  4. 3. GROUP BY
  5. 4. IS NULL
  6. 5. JOIN
  7. 6. String, Date
07
31

 

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

0. TL;DR

SELECT [컬럼명 | 집계함수(컬럼명) | DISTINCT(컬럼명)]
FROM [테이블명]
	[LEFT | RIGHT | FULL OUTER] JOIN [조인할 테이블명]
	ON [조인할 기준 컬럼]
WHERE [조건절(그룹화 전)]

GROUP BY [그룹화할 컬럼명]
HAVING [조건절(그룹화 후)]

ORDER BY [정렬컬럼 ASC | DESC]
LIMIT [개수]

 

더보기

 

 

 

-- DISTINCT(컬럼명)은 해당 컬럼에서 중복 값 제거
-- AS는 별칭 정하기
-- 집계함수: SUM, AVG, MIN, MAX, COUNT 등


-- 조건절 관련
-- NULL 여부는 IS NULL 혹은 IS NOT NULL
  - NAME IS NOT NULL
-- 집합 포함 여부는 IN (...)
  - NAME IN ("Lucy", "Mitty")
-- 패턴 포함 여부는 LIKE
  - NAME LIKE "%el%" → 앞뒤 글자 상관없이 중간에 el이 끼어있는 문자
  - NAME LIKE "_el%" → 2, 3번째 문자 el 이후 상관 X (1번째는 꼭 다른 문자)


-- IF문 (6-3 참고)
IF(표현식, 참일때 리턴값, 거짓일때 리턴값)

-- CASE문 (6-3 참고)
CASE WHEN 표현식1 THEN 결과1
		 WHEN 표현식2 THEN 결과2
		 ELSE 결과 3
END

 

 

 

 

 

1. SELECT

더보기

1. 모든 레코드 조회하기

SELECT * FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

2. 역순 정렬하기

SELECT NAME, DATETIME FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

 

3. 아픈 동물 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"

 

4. 어린 동물 찾기

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

 

5. 동물의 아이디와 이름

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

6. 여러 기준으로 정렬하기

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

 

7. 상위 n개 레코드

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1

 

 

 

 

2. SUM, MAX, MIN

더보기

1. 최댓값 구하기

SELECT MAX(DATETIME) AS "시간" 
FROM ANIMAL_INS

 

2. 최솟값 구하기

SELECT MIN(DATETIME) AS "시간" 
FROM ANIMAL_INS

 

3. 동물 수 구하기

SELECT COUNT(*) AS count 
FROM ANIMAL_INS

 

4. 중복 제거하기

SELECT COUNT(DISTINCT(NAME)) 
FROM ANIMAL_INS
WHERE NAME IS NOT NULL

 

 

 

 

3. GROUP BY

더보기

1. 고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE, COUNT(*) AS count 
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

 

2. 동명 동물 수 찾기

SELECT NAME, COUNT(*) AS COUNT 
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME ASC

 

3. 입양 시각 구하기 (1)

SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT 
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR < 20
ORDER BY HOUR ASC

 

4. 입양 시각 구하기 (2) → 프로그래머스 답 참고

SET @hour := -1;

SELECT (@hour := @hour + 1) AS 'HOUR',
    (SELECT COUNT(*) FROM ANIMAL_OUTS 
     WHERE HOUR(DATETIME) = @hour) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE @hour < 23;

 

 

 

 

4. IS NULL

더보기

1. 이름이 없는 동물의 아이디

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC

  

2. 이름이 있는 동물의 아이디

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC

 

3. NULL 처리하기

SELECT 
    ANIMAL_TYPE, 
    IF(NAME IS NULL, "No name", NAME) AS NAME,
    SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

 

 

5. JOIN

더보기

1. 없어진 기록 찾기

SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS AS INS
    RIGHT JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY OUTS.ANIMAL_ID ASC

 

2. 있었는데요 없었습니다

SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS AS INS
    JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME ASC

 

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

SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS
    LEFT JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.DATETIME IS NULL
ORDER BY INS.DATETIME ASC
LIMIT 3

 

4. 보호소에서 중성화한 동물

SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
    JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE LIKE "Intact%"
    AND (
        OUTS.SEX_UPON_OUTCOME LIKE "Spayed%"
        OR OUTS.SEX_UPON_OUTCOME LIKE "Neutered%"
    )
ORDER BY INS.ANIMAL_ID ASC

 

 

 

 

6. String, Date

더보기

1. 루시와 엘라 찾기

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")
ORDER BY ANIMAL_ID ASC

 

2. 이름에 el이 들어가는 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" AND NAME LIKE "%el%"
ORDER BY NAME ASC

 

3. 중성화 여부 파악하기

-- if 문: IF(표현식, 참일때 리턴값, 거짓일때 리턴값)
SELECT ANIMAL_ID, NAME, 
    IF (
        SEX_UPON_INTAKE LIKE "Neutered%" OR SEX_UPON_INTAKE LIKE "Spayed%",
        "O", "X"
    ) AS "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

-- case문: CASE WHEN 표현식1 THEN 결과
--             WHEN 표현식2 THEN 결과
--             ELSE 결과 3
--         END
SELECT ANIMAL_ID, NAME, 
    CASE
        WHEN (SEX_UPON_INTAKE LIKE "Neutered%" OR SEX_UPON_INTAKE LIKE "Spayed%") THEN "O"
        ELSE "X"
    END AS "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

4. 오랜 기간 보호한 동물

SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS AS INS
    JOIN ANIMAL_OUTS AS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY (OUTS.DATETIME - INS.DATETIME) DESC
LIMIT 2

 

5. DATETIME 에서 DATE로 형변환

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS "날짜"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

 

 

 

'CS > 기타' 카테고리의 다른 글

캐싱 전략  (0) 2022.07.29
스택 / 레지스터 기반 VM  (0) 2022.07.27
GraphQL 이란 ?  (0) 2022.07.05
바이트코드와 기계어  (0) 2022.05.17
CS 관련 Github repo 정리  (0) 2022.03.30
COMMENT