728x90

사용 프로그램

Oracle 11g & SQL Developer

 

메세지

ORA-00979: GROUP BY 표현식이 아닙니다. 00979. 00000 - "not a GROUP BY expression"

 

상황

아래 쿼리를 조회하려다 발생

SELECT E.EMP_NO, E.EMP_NM, COUNT(E.EMP_NO)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)    
WHERE REL_TYPE_CD = 'A27'
GROUP BY E.EMP_NO; -- 인출행 수 1239

 

원인

조회할려는 컬럼이 그룹바이로 지정이 안됐기에 에러 발생

GROUP BY문에 들어가 있는 컬럼명들 중에 SELECT문에 안들어가도 있어도 에러발생X

반대로, GROUP BY문에 없는데 SELECT문에서 들어가있는 컬럼명이 있다면 에러발생O

 

해결

GROUP BY E.EMP_NO에 추가로 E.EMP_NM 컬럼 추가

E.EMP_NM이 조회할려던 컬럼

즉, 조회할려는 컬럼이 그룹바이로 지정이 안됐기에 에러 발생

SELECT E.EMP_NO, E.EMP_NM, COUNT(E.EMP_NO)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)    
WHERE REL_TYPE_CD = 'A27'
GROUP BY E.EMP_NO, E.EMP_NM; -- 인출행 수 1239

 

728x90
반응형
728x90

 

27번

VIEW

  1. 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
  2. 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다. 또한 해당 형태의 SQL문을 자주 사용할 때 뷰를 이용하면 편리하게 사용할 수 있다.
  3. 보안성 : 직원의 급여정보와 같이 숨기고 싶은 정보가 존재한다면 해당 칼럼을 빼고 생성함으로써 사용자에게 정보를 감출 수 있다.

 

 

28번

GROUP BY

GROUP BY구의 기본적인 문법을 확인하는 문제

SELECT구에는 GROUP BY절에 있는 칼럼이 나와야 한다.

 

 

29번

교차엔터디(Intersaction Entity)

M:M의 관계를 해소하려는 목적으로 만들어진 엔터티 [ex> M:M -> 1:M]

독립 엔티티[Kernel Entity, Master Entity]
사람, 물건, 장소 등과 같이 현실세계에 존재하는 엔터티

업무중심 엔터티[Transaction Entity]
Transaction이 실행되면서 발생하는 엔터티

종속 엔터티[Dependent Entity]
주로 1차 정규화로 인해 관련 중심엔티티로부터 분리된 엔터티

교차 엔티티[Intersaction Entity]
M:M의 관계를 해소하려는 목적으로 만들어진 엔터티 
ex> M:M -> 1:M

 

 

 

30번

CORRELATED SUB QUERY(상호연관 서브쿼리)

메인쿼리의 값을 서브쿼리에서 주입을 받아서 비교를 하는 것

 메인쿼리의 값을 서브쿼리에서 주입을 받아서 비교를 하는것으로 상호연관 서브쿼리(CORRELATED SUB QUERY) 이다.

SELECT A.EMPNO, A.ENAME
FROM EMP A
WHERE A.EMPNO = (SELECT 1 FROM
EMP_T B WHERE A.EMPNO = B.EMPNO);

서브쿼리에 *(A.EMPNO 값을 매번 가져와서 대입을 해야하므로성능이 매우 좋지않다.)

 

 

 

36번

SUBKPI,MAINKPI

20,10을 각각 대입

0,30을 각각 대입

SUBKPI가 0인건 없고 20인건 있어서 20,10이 TRUE로 WHERE발동

 

 

 

37번

서브쿼리 설명

  1. 서브쿼리에서는 정렬을 수행하기 위해서 내부에 ORDER BY를 사용하지 못한다.
  2. 서브쿼리에 있는 칼럼을 자유롭게 사용할수 없다
  3. 여러 개의 행을 되돌리는 서브쿼리는 다중행 연산자를 사용해야 한다.
  4. EXIST는 TRUE와 FALSE만 되돌린다

 

 

 

38번

TO_DATE(), TO_CHAR()

TO_CHAR() : 날짜/숫자형 데이터를 문자형 데이터로 변경

TO_DATE() : 문자/숫자형 데이터를 날짜형 데이터로 변환

데이트(날ㅉ) 타입을 데이트타입으로 바꾸면 에러남. 그래서 1번 안됨

T0_DATE()로 ‘YYYYMMDD’ 형식 출력가능

 

 

 

39번

FETCH(읽어오기) 위해 해야할 것은

CURSOR OPEN (*CURSOR순서 : 선언 → OPEN → FETCH → CLOSE)

CURSOR(DB의 연결 포인트, 연결점)

  • SQL 커서는 Oracle 서버에서 할당한 전용 메모리 영역에 대한 포인터이다.
  • 질의의 결과로 얻어진 여러 행이 저장된 메모리상의 위치
  • 커서는 SELECT 문의 결과 집합을 처리하는데 사용된다.

 

명시적 커서

사용자가 직접 정의해서 사용하는 커서이고 묵시적(암시적) 커서는 데이터베이스가 내부적으로 사용하는 커서이다.

모든 CURSOR는 사용하기 전에 반드시 선언을 해주어야 한다

 

 

 

42번

NESTED LOOP JOIN

RANDOM ACCESS로 인해 부하가 걸림

 

HASH JOIN

- 조인 컬럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있다.
- 해시 함수를 이용하여 조인을 수행하기 때문에 '='로 수행하는 조인으로 동등 조건에만 사용가능
- 해시 함수가 적용될 때 동일한 값을 항상 같은 값으로 해싱됨이 보장된다.
- HASH JOIN 작업을 수행하기 위해 해시 테이블을 메모리에 생성해야 한다.
- 메모리에 적재할 수 있는 영역의 크기보다 커지면 임시 영역(디스크)에 해시 테이블을 저장한다.
- HASH JOIN을 할 때는 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
- 선행 테이블을 Build input이라 하며, 후행 테이블을 Prove input이라 한다.

 

 

 

43번

2,3차 정규화

 2차 정규화 → 3차 정규화(종속 존재를 분해) 학번,코스코드(FK),평가코드(FK) = 3개

 

 

45번

ROLE

ROLE은 데이터베이스에서 OBJECT(테이블, 프로시저, 뷰) 등의 권한을 묶어서 관리할 수 있다.

 

 

49번

레코드

레코드 = 데이터가 들어가있는 행(ROW)

SQLD39_42 테이블의 COL1 은 {1, 1, 2, 3, 3} 이렇게 5개가 있습니다.COL1 을 하나씩 불러오면

문제 WHERE 조건이 A.COL1 = B.COL1 이므로A.COL1 = 1 일때 B.COL1 = 1 인 레코드 →2개

A.COL1 = 1 일때 B.COL1 = 1 인 레코드 →2개
A.COL1 = 2 일때 B.COL1 = 2 인 레코드 →1개
A.COL1 = 3 일때 B.COL1 = 3 인 레코드 →2개
A.COL1 = 3 일때 B.COL1 = 3 인 레코드 →2개

 

 

 

추천 강의자료

39회 상 : https://www.youtube.com/watch?v=SENIt9GFMV8

39회 하 : https://www.youtube.com/watch?v=9Kgmxr3PCsY&list=PLSiY9ClhS7WnWW6EfWlCz-P1Br3mGjFqw&index=4

 

 

연관 링크

 

 

자료 출처
https://yunamom.tistory.com/265

yurimac님 pdf 정리 자료

https://velog.io/@dongchyeon/오라클Oracle-그룹-함수-ROLLUP-CUBE-GROUPING-등

 

728x90
반응형

'SQL > SQLD 공부노트' 카테고리의 다른 글

[SQL][SQLD] 기출 39회 1~25번  (1) 2022.09.17
[SQL][SQLD] 기출 38회 1~50번  (0) 2022.09.14
[SQL][SQLD] 기출 35회 31~50번  (0) 2022.09.13
[SQL][SQLD] 기출 35회 1~30번  (1) 2022.09.13
[SQL][SQLD] 기출 34회 30~50번  (0) 2022.09.12
728x90

 

배열 안에 첫번째 값을 넣고 for문으로 전체 값을 읽는데

값을 하나씩 비교해서 더 큰 값이 있으면 max변수에 넣고 아니면 다음꺼 비교하고 하는 식으로 최대값, 최소값을 찾는 로직

 

int max = score[0];
int min = score[0]; // array 초기화한 변수 값 이용

for(int i=1; i < score.length;i++){
    if(score[i] > max){
        max = score[i]; // 기존 max보다 더 큰 값이 있으면 max변수에 넣어서 최대값을 찾는 방식
    }else if(score[i] < min){
        min = score[i]; // 기존 min보다 더 작은 값이 있으면 min변수에 넣어서 최소값을 찾는 방식
    }
}
System.out.println("최대값"+max);
System.out.println("최대값"+min);
728x90
반응형
728x90

 

▶ Iterator<E> 인터페이스

컬렉션에 저장된 요소(element)를 읽어오는 표준화된 방법

  • 자바의 collection framework는 컬렉션에 저장된 요소(element)를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있음

Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근함

즉, Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용

       → iterator() 사용 : List & Set

 

Iterator 인터페이스는 아래 메소드를 사용하여 컬렉션의 각 요소(element)에 접근

 

※ JDK 1.5에 추가된 for each문(Enhanced for문)을 사용하도록 권장

→ 같은 성능을 유지하면서도 코드의 명확성을 확보하고 발생할 수 있는 버그를 예방

For each문 링크 : https://rise-up.tistory.com/777

 

ListIterator<E> 인터페이스

JDK 1.2에 추가됨

Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스

 

사용 조건

List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용

 

ListIterator & Iterator 차이

Iterator 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동 가능

ListIterator 인터페이스는 컬렉션 요소의 대체, 추가, 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원

 

연결 리스트(LinkedList)를 반복자(iterator)를 사용하여 순회하는 예제

 

리스트 반복자(List Iterator)를 사용하여 리스트의 모든 요소를 양방향 즉, 각각 순방향과 역방향으로 출력하는 예제

*while문 대신 for each문(향상된 포문) 많이씀

 

 

메소드

ListIterator 인터페이스 메소드

 

 

 

Enumeration<E> 인터페이스

JDK 1.0부터 사용해 온 Iterator 인터페이스와 같은 동작을 하는 인터페이스

hasMoreElements()와 nextElement() 메소드를 사용하여 Iterator와 같은 작업을 수행

 

현재에는 기존 코드와의 호환성을 위해서만 남아있으므로, Iterator 인터페이스 사용 권장

 

 

출처 : http://www.tcpschool.com/java/java_collectionFramework_iterator

 

 

 

 

 

728x90
반응형
728x90

 

컬렉션 List,Set에서 내부 요소(엘리먼트)에 접근할 때

Iterator를 사용해서 while + hasNext()로 가져오고는 했는데

향상된 포문(for each문)을 권장한다고 해서 찾아보다가 해보게 되었다

 

LinkedHashSet<Dog> lhSet = new LinkedHashSet<>();
lhSet.add(new Dog("a",10));
lhSet.add(new Dog("b",10));
System.out.println(lhSet); // [a(10.0kg), b(10.0kg)]

ArrayList<Dog> al = new ArrayList<>(lhSet);
System.out.println(al); // [a(10.0kg), b(10.0kg)]

al.get(1);
System.out.println(al.get(0)); // a(10.0kg)
System.out.println(al.get(1)); // b(10.0kg)
al.add(new Dog("c",10));


// for문을 이용한 엘리먼트 추출
for(int i=0; i < al.size();i++){
    System.out.println(al.get(i)); // a(10.0kg) b(10.0kg)
}

for(Dog a : al){
    System.out.println("for each = "+al);
    // 결과화면
    // for each = [a(10.0kg), b(10.0kg), c(10.0kg)]
    // for each = [a(10.0kg), b(10.0kg), c(10.0kg)]
    // for each = [a(10.0kg), b(10.0kg), c(10.0kg)]
}
for(Dog a : al){
    System.out.println(a);
    // 결과화면
    // a(10.0kg) b(10.0kg) c(10.0kg)
}
for(Dog b : lhSet){
    System.out.println("for each = "+lhSet);
    // 결과화면
    // for each = [a(10.0kg), b(10.0kg)]
    // for each = [a(10.0kg), b(10.0kg)]
}
728x90
반응형
728x90

 

에러가 발생한 곳으로 화면을 바로 이동해서 내용까지 보여주는 단축키 F2

아래 이미지처럼 에러난 변수명을 색깔표시 해주는 편리함도 있다

Required type : 해당 코드에서 필요한 것

Provided : 해당 코드에 현재 주어진 것

즉, boolean 데이터타입이 들어갔어야했는데 Dog라는 클래스타입이 들어가서 에러라는 의미

 

 

인텔리제이가 빨간줄로 에러발생을 알려줄 때 좀 더 구체적으로 내용에 대해 알고 싶다면,

해당 빨간 줄 친 곳에 마우스커서를 올리면 된다. 

에러난 변수를 생성한 객체 정보를 보여준다

 

올리는 마우스 포인터 위치에 따라 해당 메소드 설명까지 추가로 보여준다

 

참고로, 에러 안났을 때 f2를 누르면 메소드끼리 이동하는 단축키이다

 

728x90
반응형
728x90

 

1-9번

 

SELECT 1의미

해당 테이블이 가지고 있는 조건을 만족하는 개수의 행만큼 출력

 

릴레이션(관계)

DB에서 정보를 구분하여 저장하는 기본 단위

DB테이블

ERD에서 네모칸 하나가 릴레이션임

 

 

식별자 분류

  • 대표성여부 → 주, 보조
  • 스스로 생성여부 : 내부, 외부
  • 속성의 수 : 단일, 복합
  • 대체여부 : 본질,인조

 

 

ERD 작성순서

  1. 엔터티 그림
  2. 엔터티 배치
  3. 엔터티 관계설정
  4. 관계명 기술
  5. 관계의 참여도 기술
  6. 관계필수여부 기술

 

10번

비즈니스 프로세스에 의하여 만들어지는 식별자로 대체여부로 분리되는 식별자

→ 주식별자

 

식별자 분류

1.대표성여부 분류

주식별자, 보조식별자

  • 주식별자 : 엔터티 내에서 각 어커런스를 구분할 수 있는 구분자, 타 엔터티와 참조관계를 연결O
  • 보조식별자 : 구분자이나 대표성X, 참조관계 연결X

 

2.스스로생성여부

내부식별자, 외부식별자

  • 내부 : 스스로 생성되는 식별자
  • 외부 : 타 엔터티로부터 받아오는 식별자

 

3.속성의 수

단일식별자, 복합식별자

  • 단일 : 하나의 속성으로 구성
  • 복합 : 2개 이상의 속성으로 구성

 

4.대체 여부

본질식별자, 인조식별자

  • 본질 : 업무에 의해 만들어지는 식별자
  • 인조 : 인위적으로 만든 식별자

 

※ 주식별자 도출기준

  1. 해당 업무에서 자주 이용되는 속성임
  2. 명칭, 내역 등과 같이 이름으로 기술되는 것들은 X
  3. 복합으로 주식별자로 구성할 경우 너무 많은 속성X -> 너무 많으면 인조식별자 생성한다.

 

 

12번

COALESCE()

NULL 값이 아닌 첫번째 값을 반환

행(row)으로 진행

SELECT COALESCE(COL1,COL2*50,50) FROM SQLD_39_12

COL1 을 기준 ( 100, 3000, 50)COL1(100)    → 100COL1(NULL) → COL2(60) * 50 →3000COL1(NULL) → COL2 = NULL 이므로 → 50

 

13번

INDEX 생성

CREATE index [인덱스이름] on [테이블이름] (컬럼명);

ex)

CREATE index indmember on T_MEMBER(kind);

 

14번

9-3인데 MINUS는 중복제거하므로 3 3두개인게 3하나만 가게되므로 5가 됨

 

15번

SORT MERGE JOIN

조인되는 N개의 테이블을 모두 정렬한 후에 조인을 수행

해당 테이블의 인덱스가 없을때 수행

병렬구조로 정렬함

각 데이터에 대하여 sort(정렬)를 병렬로 1,2번을 진행하고 후에 merge해서 합침

 

 

16번

LPAD 사용 이유

트리 구조에서 정렬 시에, 공백으로 계층구조 분류를 잘 보이기 위함

 

 

 

17번

순위함수

  1. RANK 함수는 동일순위 처리가 가능하다.
  2. DENSE_RANK 함수는 RANK 함수와 같은 역할을 하지만 동일 등수 순위에 영향이 없다.
  3. ROW_NUMBER 함수는 특정 동일 순위가 부여되지 않는다

 

 

18번

GROUPING SETS 함수

원하는 부분의 소계만 손쉽게 추출하여 계산할 수 있는 함수

참조 :&nbsp;https://velog.io/@dongchyeon/오라클Oracle-그룹-함수-ROLLUP-CUBE-GROUPING-등

 

 

21번

ORDER SIBLINGS BY

ORDER SIBLINGS BY 를 수행하면 전체 테이블이 아니라 계층형으로 된 데이터값(특정 칼럼) 기준으로 정렬된다.

(1) NOT IN (3) 이므로 3이 포함되면 전개를 멈춤

(2) CONNECT BY PRIOR ID = PARENT_ID (부모 ID 를 기준으로 자식 ID 를 검색) 순반향

(3) NO CYCLE 옵션을 사용할 수 있다.

 

 

22번

INDEX RANGE SCAN

최대값을 쉽게 검색 가능

 

 

24번

문자의 길이 : CHAR vs VARCHAR

CHAR는 길이가 서로 다르면, 짧은 쪽에 공백(space)를 추가하여 같은 값으로 판단한다.

VARCHAR(가변길이 문자형 : 입력한 크기만큼 할당 )는 같은 값에서 길이만 서로 다를 경우, 다른 값으로 판단함

예) CHAR(5)으로 칼럼을 생성하고 입력값이 3개의 문자일때 'abc' → 'abc  ' 와 같은식으로 나머지 2개는 공백으로 입력된다.

문자형과 숫자형을 비교 시 문자형을 숫자형으로 묵시적 변환하여 비교

연산자 실행 순서는 괄호, NOT, 비교연산자, AND, OR순

 

 

 

 

추천 강의자료

39회 상 : https://www.youtube.com/watch?v=SENIt9GFMV8

39회 하 : https://www.youtube.com/watch?v=9Kgmxr3PCsY&list=PLSiY9ClhS7WnWW6EfWlCz-P1Br3mGjFqw&index=4

 

 

연관 링크

 

자료 출처
https://yunamom.tistory.com/265

yurimac님 pdf 정리 자료

https://velog.io/@dongchyeon/오라클Oracle-그룹-함수-ROLLUP-CUBE-GROUPING-등

 

728x90
반응형

'SQL > SQLD 공부노트' 카테고리의 다른 글

[SQL][SQLD] 기출 39회 26~50번  (0) 2022.09.18
[SQL][SQLD] 기출 38회 1~50번  (0) 2022.09.14
[SQL][SQLD] 기출 35회 31~50번  (0) 2022.09.13
[SQL][SQLD] 기출 35회 1~30번  (1) 2022.09.13
[SQL][SQLD] 기출 34회 30~50번  (0) 2022.09.12
728x90


728x90
반응형

'small steps > 운동 - 체력이 국력' 카테고리의 다른 글

22.09.26 운동기록  (0) 2022.09.26
22.09.20 운동기록  (0) 2022.09.20
22.09.15 운동기록  (0) 2022.09.15
22.09.14 운동기록  (0) 2022.09.14
22.09.13 운동기록  (0) 2022.09.13
728x90

 

1.breakpoint 설정

코드 라인수 옆에 좌클릭하면 빨간색 마름모가 생긴다

이 부분이 breakpoint

지정한 breakpoint마다 값이 어떻게 변하는지 또 내부 로직이 어떤 순서로 움직이는지 파악 가능해서 정말 정말 귀중한 기능이다. 앞으로 자주쓰자

 

 

2.디버깅(Debugging) 실행

아래 이미지에서 벌레모양 아이콘을 누르면 된다(단축키 shitf + F9)

 

3.디버깅(Debugging) 과정

첫번째로 실행되는 코드가 main메소드이므로, 메인메소드의 new Mountain()이라는 객체가 호출되는 것을 볼 수 있다.

다음 어디로 넘어갈지 보고 싶다면, F9이나 아래 이미지에 동그라미 친 아이콘을 누르면 된다

 

 

 


 

Evaluate Expression

동그라미 친 계산기 아이콘을 눌르면 아래아래 사진처럼 창이 뜨고 값을 입력할 수 있다

아니면 밑줄 친 Evaluate Expression 회색 글씨에 써도 된다

 

필요한 이유

하나씩 디버깅해서 돌려보고 따로 해 볼 필요없이 저 창을 열면 바로 원하는 값을 알아볼 수 있다!

아주 편리함

Evaluate Expression 창이 뜬 모습

 

728x90
반응형
728x90

ListIterator<E>
Iterator인터페이스의 확장된 인터페이스

이터레이터와 달리 컬렉션 요소를 앞뒤 방향으로 탐색가능 및 컬렉션 요소 추가,제거,수정 가능

 

배열처럼 컬렉션도 뭉탱이로 있어서 주소값으로 출력됨

System.out.println(listIterator); // java.util.ArrayList$ListItr@1b6d3586 -> 주소값이 나오므로 Arrays.toString 한번 찍어보자

 

 

배열이 아니라 에러뜸
 iterator는 while문 써서 접근 해야한다

System.out.println(Arrays.toString(listIterator)); // 배열이 아니라 에러뜸
        // iterator는 while문 써서 접근했어야했다...

 

 

 

next()에 boolean타입이 들어와야하는데 Dog가 들어와서 에러발생

 

while(listIterator.next()){ // next()에 boolean타입이 들어와야하는데 Dog가 들어와서 에러발생
    System.out.println(listIterator);
}

 

 

 

전체코드

   public void method06(){

        LinkedHashSet<Dog> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add(new Dog("ㄱ",10));
        linkedHashSet.add(new Dog("ㄴ",10));
        System.out.println(linkedHashSet); // [ㄱ(10.0kg), ㄴ(10.0kg)]


        // ListIterator<E>
        // Iterator인터페이스의 확장된 인터페이스로, 이터레이터와 달리 컬렉션 요소를 앞뒤 방향으로 탐색가능 및 컬렉션 요소 추가,제거,수정 가능
        ArrayList<Dog> al = new ArrayList<>();
        al.add(new Dog("aa",10));
        al.add(new Dog("bb",10));

        ListIterator<Dog> listIterator = al.listIterator();
        listIterator.add(new Dog("bb",10));
        System.out.println(listIterator); // java.util.ArrayList$ListItr@1b6d3586 -> 주소값이 나오므로 Arrays.toString 한번 찍어보자
//        System.out.println(Arrays.toString(listIterator)); // 배열이 아니라 에러뜸
        // iterator는 while문 써서 접근했어야했다...
        while(listIterator.hasNext()){
            System.out.println(listIterator.next()); // aa(10.0kg) bb(10.0kg)
        }
        while(listIterator.next()){ // next()에 boolean타입이 들어와야하는데 Dog가 들어와서 에러발생
            System.out.println(listIterator);
        }


        // Exception in thread "main" java.lang.ClassCastException:
        // java.util.LinkedHashMap$LinkedKeyIterator cannot be cast to java.util.ListIterator
        //      ArrayList의 값을 가져왔어야하는건데 LinkedHashSet의 값을 가져와버림

    }
728x90
반응형

+ Recent posts