본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 Kit / 입양 시각 구하기(2) / MySQL (변수선언 , SELECT문 서브쿼리)

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/59413)

 

📝풀이

SET @HOUR = -1 # 변수 선언문

SELECT (@HOUR := @HOUR +1) AS HOUR # := 대입연산자, = 비교 연산자
     , (SELECT COUNT(DATETIME) 
        FROM ANIMAL_OUTS 
        WHERE DATETIME = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23

갑자기 난이도가 확 올랐다

SQL 문제풀이에서 변수선언은 처음해보는 것 같다

 

1번째 코드

1) SET 명령어를 통해서 선언해주며

2) 변수 앞에 @를 붙인다

3) 참고로 변수 선언시에는 대입연산자(:=)와 비교연산자(=) 중 아무거나 사용해도 상관없다

 

 

2번째 코드

대입연산자(:=)를 통해 HOUR +1 을 대입해 나간다 (0부터 시작)

 

3-5번째 코드

SELECT 서브쿼리(= 스칼라 쿼리)* 생성

(SELECT COUNT(DATETIME) 
        FROM ANIMAL_OUTS 
        WHERE DATETIME = @HOUR) AS COUNT

ANIMAL_OUTS 테이블에서

DATETIME이 @HOUR랑 똑같은 시간대(0~23시)일때의 

행 수 반환 

=>

@HOUR 시간대(0~23시)일때 입양 수가 총 몇건이냐?

 

7번째 코드

변수 @HOUR가 22가 될때까지 진행

(HOUR가 22가 되면 SELECT문의 AS HOUR 에는 HOUR+1(=23)까지 할당됨)

 

 

 

++ SELECT 서브쿼리절 예시

# SELECT 절 서브쿼리 예시

# OUTER JOIN 사용 시
SELECT  T1.EX_CD ,T2.BAS_CD_NM EX_CD_NM
FROM    STOCK T1
        LEFT OUTER JOIN BASECODE T2
           ON (T2.BAS_CD_DV = 'EX_CD' AND T2.BAS_CD = T1.EX_CD)

# SELECT절 서브쿼리 사용 시
SELECT  T1.EX_CD 
        ,(SELECT A.BAS_CD_NM FROM BASECODE A
          WHERE A.BAS_CD_DV = 'EX_CD' AND A.BAS_CD = T1.EX_CD) EX_CD_NM
FROM    STOCK T1

SELECT 서브쿼리(=스칼라 서브쿼리) 작성 시

 

1. JOIN할 테이블을 FROM절에 작성

FROM BASECODE A

2. WHERE절에 JOIN조건으로 넣을 항목 작성

 ON (T2.BAS_CD_DV = 'EX_CD' AND T2.BAS_CD = T1.EX_CD)
 ↕
 WHERE A.BAS_CD_DV = 'EX_CD' AND A.BAS_CD = T1.EX_CD

 

SELECT 서브쿼리는 단일 값(=스칼라 값)을 반환

 

 

728x90