1. FROM 테이블이 존재하는지 USER가 해당 테이블에 대한 SELECT 권한이 있는지 먼저 체크한다. 만약 JOIN절이 존재한다면, JOIN을 먼저 수행한다음 FROM절을 수행한다. 2. WHERE JOIN 혹은 FROM 절에서 가져온 테이블에서 조건에 맞는 ROW 만을 가져온다. 3. GROUP BY 명시한 컬럼들을 그룹화하며, 집계함수를 이용할 때 주로 사용한다. 4. HAVING GROUP BY 절이 존재한다면 다음으로 HAVING 절을 수행한다. WHERE 절과 마찬가지로 조건에 맞는 ROW를 가져온다. WHERE절은 테이블 상의 모든 필드에 조건에 두지만, HAVING은 GROUP BY에 의해 그룹화된 결과에 대해 조건을 준다. --WHERE 절 사용 SELECT department, sa..
대량 데이터 삽입 로직 데이터 입력시 보통 단건 또는 10건 미만으로 입력이 들어오기 때문에 입력되는 ROW수 만큼 INSERT쿼리 호출이 이루어진다. 그러나 1만 8천 건 정도 되는 데이터를 한 번에 INSERT 하니, 수행 시간이 5분 이상 소요되었고 이대로는 사용할 수 없다고 판단했다.(오류는 나지 않더라도 예외 메세지가 뜨면서 통신이 끊어진것 처럼 보였다.) 일반적으로 사용했던 INSERT 로직 (대용량 INSERT에 부적합) 사용자가 이용할 수 없는 속도를 보여줬기 때문에 삽입하는 ROW 수만큼 쿼리를 호출해 수행하는 기존 INSERT 로직을 이용할 순 없었다. 나중에 들어보니 AS-IS(기존 시스템)에선 10분넘게 걸렸었다고한다... //paramList : 화면단에서 넘겨받은 Data for..
동적 쿼리 iBatis는 기본적으로 이전 쿼리 결과의 메타데이터를 캐싱하는데 조회마다 컬럼이 달라지는 동적쿼리를 사용하는 경우 캐싱으로 인해 오류가 발생할 수 있다. 이 때 태그에 다음과 같은 속성을 추가하면 메타데이터 캐싱작업을 막을 수 있다. iBatis iBatis DataMapper 2.0 Developer Guide The remapResults attribute should be set to true when a query has a variable set of return columns. For example consider the following queries: SELECT $fieldList$ FROM table Mybatis MyBatis 3 – 사용자 가이드 flushCache 이 ..
java.lang.IndexOutOfBoundsException: Index: 17, Size: 17 방금까지 잘 되던 쿼리를 수행했는데 갑자기 인덱스 범위 오류가 발생했다. 해당쿼리를 golden과 같은 쿼리 질의 도구에서 수행했을 때는 문제없이 수행되는 것을 확인하고 작성한 쿼리를 한줄 한줄 읽어나가다 보니.. 주석에 preparedstatement에서 사용되는 ? 가 들어가있는 것을 확인했다. 혹시나 해서 지우고 실행해보니 잘된다. 주석안에 있더라도 ?(물음표)가 있는경우 preparedstatement 처럼 바인딩이 동작하니 주의해야겠다.
오라클에 제공하는 AVG 함수를 이용하면 컬럼의 평균값을 구할 수 있다. 이 때 함수가 null 값을 처리하는 방법을 잘 알지 못하면 평균값이 제대로 구해지지 않을 수 있다. 테이블 쿼리 COMM 컬럼의 합계는 2200 테이블의 ROW 수는 5개이기 때문에 COMM_A의 결과가 440(2200 ÷ 5)이 나와야 했는데 550(2200 ÷ 4)으로 계산되었다. 컬럼이 null인 경우 집계함수가 처리하지 않기 때문에 null 처리를 해주어야 한다.(NVL 함수 사용법) SELECT AVG(COMM) AS COMM_A FROM EMP WHERE SAL BETWEEN 1200 AND 1600 SELECT AVG(NVL(COMM, 0)) AS COMM_A FROM EMP WHERE SAL BETWEEN 1200 ..
ORA-00913: 값의 수가 너무 많습니다 ORA-00913: too many values INSERT 구문에 삽입될 컬럼의 개수보다 들어가는 데이터의 개수가 더 많은 경우 발생하는 에러이다. 쿼리 INSERT INTO EMP ( EMPNO,ENAME,JOB ) VALUES ( 9999,'TEST','BLOGGER','DUMMY' ) INSERT 구문의 컬럼 개수는 3개지만 VALUES에 값이 4개이기 때문에 값을 삽입할 수 없는 상황이다. 해결 INSERT INTO EMP ( EMPNO,ENAME,JOB ) VALUES ( 9999,'TEST','BLOGGER' ) INSERT 컬럼 개수와 삽입하려는 데이터의 개수를 맞춰주면 해결가능하다.
LISTAGG 예제1 LISTAGG 괄호에 속한 ename 을 쉼표(',') 구분자를 이용해 출력할 것이며 출력할 데이터는 ename으로 정렬되어 출력된다. LISTAGG 함수를 이용한다면 GROUP BY 절은 필수로 지정해주어야한다. SELECT deptno, LISTAGG(ename, ',') within group (order by ename) AS EMPLOYEE FROM emp GROUP BY deptno LISTAGG 예제2 연결연산자를 이용해 각 사원의 월급을 함께 출력할 수 있다. ORDER BY 절에서 월급을 내림차순으로 정렬하게되면 월급이 높은 사람순으로 출력할 수 있다. SELECT deptno , LISTAGG(ename||'('||SAL||')', ',') within group ..
SYS_CONNECT_BY_PATH를 이용하면 CONNECT BY를 통해 가져온 값을 마치 루트노드로 부터 경로를 표시하는 것과 같이 표현한다. (이전 예제 참조) SELECT ename , SYS_CONNECT_BY_PATH(ename, '/') as PATH FROM EMP START WITH ename='KING' CONNECT BY PRIOR empno = mgr; LTRIM을 이용해 앞에 출력되는 '/'를 제거하고 출력할 수 있다. LTRIM(SYS_CONNECT_BY_PATH(ename, '/'), '/') as PATH 이전 예제와 함께 활용하면 노드간의 계층도를 시각적으로 표현 할 수도 있다. RPAD(' ', (level-1)*3) || LTRIM(SYS_CONNECT_BY_PATH(en..
- Total
- Today
- Yesterday
- 오라클
- JVM
- 환경설정
- 프로그래머스
- 국비교육
- 스프링
- 이클립스
- 오류
- SQL
- 백준
- 부트스트랩
- CS
- 스프링부트
- C
- CSS
- JSP
- HeidiSQL
- 개발용어
- svn
- 네트워크
- Thymeleaf
- 데이터베이스
- 넥사크로
- Open API
- 인턴
- C++
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |