쿼리문은 뒤에서 앞으로 해석을 한다. 

 

 

첫 번째로 확인해야하는 구문은 FROM절이다. 뒤에 있는 FROM절을 보면 

1. A라는 별칭을 가진 테이블로 조회한다.


2. welcome_web테이블에서 COUNTRY컬럼을 그룹화하고 A테이블의 COUNTRY라는 컬럼에 데이터를 넣는다   

 

3. CNT라는 별칭의 컬럼명에 count함수로 COUNTRY를 조회 한다 (as 뒤에는 별칭이다)  

 

그리고 두번째로 확인해야하는 구문 SELECT문 안에 또 다른 SELECT문이다.  

4. SELECT count(*) TOTCNT FROM webwelcome_web은
   테이블에서 TOTCNT라는 별칭으로 count함수를 써서 조회하는 것이다. 값은 7로나온다.


5. A테이블의 CNT컬럼명의 값에서 나누기 7을 하고 100을 곱한다음 ROUND함수로 반올림한다.

   (예를 들어 A.CNT에서 러시아가 2로 나오는데 2나누기 7을 하면 0.28571...이다. 

    100을 곱하면 28.571..인데 반올림을해서 29라는 수가 나온다)

    (ROUND함수를 소숫점자리를 반올림 한다)     


6. PERCENT와 COUNTRY라는 별칭으로 반올림값을 조회해서 나타낸다.

 

결과값은 

이렇게 나온다.

 

 

 

 

출처  :  한큐에 자바 수강내용

Q . 회원번호의 최초값이 F000000001(10자리)가 나오고 이후에는 회원번호가 1씩 증가하게 한다

 

컬럼 데이터다

 

 

먼저,  REPLACE함수를 이용한다

REPLACE함수는 문자열을 원하는 문자로 바꿔준다

첫번째 파라미터의 값에서 두번째 파라미터의 값을 세번째 파라미터 값으로 바꾼다

첫번째 파라미터  :  MAX(MBR_NO)

두번째 파라미터  :  'F'

세번째 파라미터  :  ' '

F000000004에서 F를 빈문자로 바꾼다

 

 

그리고 IFNULL함수를 이용한다

IFNULL함수는 만약 데이터가 NULL이면 NULL값을 원하는 데이터로 바꾼다

첫번째 파라미터가 NULL일 경우 두번째 파라미터로 대체한다

첫번째 파라미터  :  REPLACE(MAX(MBR_NO),  'F',  ' ')

두번째 파라미터  :  0

데이터가 NULL값이면 0으로 바꾸고 +1을 하고 

데이터가 있으면 첫번째 파라미터값에 +1을 한다

 

 

그 다음에는 LPAD함수를 이용한다

LPAD함수는 왼쪽에 원하는 자리수 만큼 채워준다

첫번째 파라미터값을 기준으로 두번째 파라미터값만큼 자리수를 채워주는데

세번째 파라미터값으로 첫번째 파라미터값의 왼쪽부터 채운다

첫번째 파라미터  :  IFNULL(REPLACE(MAX(MBR_NO),  'F',  ' '),  0) +1 

두번째 파라미터  :  9

세번째 파라미터  :  0

첫번째파라미터값인 5가 0으로 9자리수가 된다

 

 

마지막으로 CONCAT함수를 이용한다

CONCAT함수는 CONCAT함수는 여러 문자열을 하나로 합쳐주는 역할을 한다

첫번째 파라미터와 두번째파라미터를 합친다

첫번째 파라미터  :  'F'

두번째 파라미터  :  LPAD(IFNULL(REPLACE(MAX(MBR_NO),  'F',  ' '),  0) +1,  9,  0)

F + 000000005

 

 

 

 

출처  :  한큐에 자바 수강내용

 

 

'데이터베이스 > SQL' 카테고리의 다른 글

ROUND함수를 이용한 쿼리문  (0) 2019.07.04
Mybatis - CDATA를 사용하는 이유  (0) 2019.06.12

우리는 쿼리문에 문자열 비교연산자나 부등호를 처리할 때가있다.
그러면 <, >, =와 같은 기호가 괄호인지, 비교연산자 인지 확인이 되지 않는다. 

이 외에도 특수문자를 사용하는데 제한이있다.

그런 이유에서 하나의 규칙같이 부등호가 없는 쿼리문에도 전부CDATA를 쓰는곳도 많다.
CDATA는 태그 안 에서는 전부 문자열로 치환시켜버리기 때문이다.

 

사용 방법은 <!CDATA[[   sql구문    ]]> 적어준다.

 

예시)

<select id="selectMbrInfo" parameterType="map" resultType="egovMap">
    SELECT	LOGIN_FAIL_CNT
         ,	CASE
      WHEN now() <= DATE_ADD(LOGIN_FAIL_DT, INTERVAL 30 MINUTE)
       AND LOGIN_FAIL_CNT	>=5
      THEN 'N'
      ELSE 'Y'
       END	as IS_LOGIN_POSSIBLE		
      FROM	T_MBR
     WHERE	LOGIN_ID = #{id}
</select>

만약에 CDATA를 적어주지않으면 이런 식의 오류메세지가 주르륵 나온다. 

2019-06-12 14:57:03,400  WARN [org.springframework.web.context.support.XmlWebApplicationContext] Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmmnServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean

 

CDATA를 적어주면

<select id="selectMbrInfo" parameterType="map" resultType="egovMap">
  <![CDATA[
      SELECT	LOGIN_FAIL_CNT
          ,		CASE
       WHEN  	now() <= DATE_ADD(LOGIN_FAIL_DT, INTERVAL 30 MINUTE)
        AND  	LOGIN_FAIL_CNT	>=5
       THEN		'N'
       ELSE  	'Y'
        END		as IS_LOGIN_POSSIBLE		
       FROM		T_MBR
      WHERE		LOGIN_ID = #{id}
  ]]>
</select>

console창에 오류가 사라진다.

 

 

 

출처 :  한큐의 자바 수강내용

+ Recent posts