1. SELECT문의 기능 (사영:射影, 선택, 결합)

SELECT문은 관계형 데이터베이스에서 데이터를 조회하는 가장 기본적인 명령어이다. SELECT문의 주요 기능은 사영(Projection), 선택(Selection), 결합(Join) 세 가지로 나뉜다.

  • 사영(Projection): 테이블에서 필요한 열(Column)만 선택하여 조회하는 기능
    • SELECT column1, column2 FROM table_name;
    • 예제: SELECT name, age FROM employees; (이름과 나이만 조회)
  • 선택(Selection): 특정 조건을 만족하는 행(Row)만 조회하는 기능
    • SELECT * FROM table_name WHERE condition;
    • 예제: SELECT * FROM employees WHERE department = 'HR'; (HR 부서의 직원만 조회)
  • 결합(Join): 두 개 이상의 테이블을 연결하여 데이터를 조회하는 기능
    • SELECT * FROM table1, table2 WHERE table1.id = table2.id;
    • 예제: SELECT e.name, d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id; (직원과 부서 정보 결합 조회)

2. SELECT문의 기본 구문

오라클 SQL의 SELECT문 기본 형식은 다음과 같다.

SELECT [DISTINCT] 컬럼명  
FROM 테이블명  
[WHERE 조건]  
[GROUP BY 그룹핑할 컬럼]  
[HAVING 그룹핑 조건]  
[ORDER BY 정렬할 컬럼];  

예제:

SELECT DISTINCT department_id  
FROM employees  
WHERE salary > 5000  
ORDER BY department_id DESC;

3. SQL문 작성 규칙

  • 오라클 SQL은 대소문자를 구별하지 않는다. (SELECT와 select는 동일)
  • SQL 문장은 ;(세미콜론)으로 끝나야 한다.
    • SQL*Plus, SQLcl 등에서는 ;이 필요하지만, 일부 툴에서는 없어도 실행됨
    • PL/SQL 블록에서는 /이 필요
    • 일반적인 SQL 문은 ;이 없어도 실행될 수 있지만, 여러 개의 SQL 문이 있을 경우 구분을 위해 필요함
  • 문자열 및 날짜 리터럴은 싱글쿼트('') 를 사용해야 한다. ('2024-01-01')
  • 별칭(Alias)을 사용할 때 공백이 포함되면 큰따옴표("") 로 감싸야 한다.

4. 산술 연산자

오라클 SQL에서 지원하는 기본적인 산술 연산자는 다음과 같다.

연산자 의미 예제

+ 덧셈 SELECT salary + 1000 FROM employees;
- 뺄셈 SELECT salary - 500 FROM employees;
* 곱셈 SELECT salary * 1.1 FROM employees;
/ 나눗셈 SELECT salary / 2 FROM employees;

5. NULL 값 처리

  • NULL 값이 포함된 산술 연산: NULL 값이 포함되면 연산 결과도 NULL이 된다.
    SELECT salary + NULL FROM employees; -- 결과: NULL
    
  • 문자열 연결 연산자(||)와 NULL: NULL 값이 포함되면 문자열로 처리된다.
    SELECT 'Employee: ' || name || ' (ID: ' || NULL || ')' FROM employees;
    -- 결과: 'Employee: John (ID: )'  
    

6. 연결 연산자

  • || (문자열 연결 연산자): 두 개 이상의 문자열을 연결할 때 사용
    SELECT first_name || ' ' || last_name AS full_name FROM employees;
    
  • 결과 예시: John Doe, Jane Smith

7. 리터럴

  • 오라클 SQL에서 리터럴(literal) 은 숫자, 문자열, 날짜 등의 고정된 값 을 의미한다.
  • 문자 리터럴 및 날짜 리터럴: 싱글 쿼트(')로 감싼다.
    SELECT 'Hello, World' FROM dual;  
    SELECT TO_DATE('2024-02-09', 'YYYY-MM-DD') FROM dual;
    

열(Column) 이름 규칙

  • 열 이름은 기본적으로 대문자로 표시되며, SQL 실행 시 별칭을 지정하지 않으면 자동으로 대문자로 변환된다.
  • 숫자 데이터는 오른쪽 정렬되며, 문자와 날짜 데이터는 왼쪽 정렬된다.

인용부호(" vs q 대체 인용 부호)

  • 큰따옴표("): 열 이름 또는 별칭에 공백이나 특수문자가 포함될 경우 사용
    SELECT "Employee Name" FROM employees;
    
  • 대체 인용 부호 q: 문자열 내에 '(싱글쿼트)를 포함해야 할 때 사용
    SELECT q'[I'm a Developer]' FROM dual;
    -- 결과: I'm a Developer
    

8. DISTINCT 키워드

  • DISTINCT는 중복을 제거하고 유일한 값만 출력할 때 사용
    SELECT DISTINCT department_id FROM employees;
    

DISTINCT vs UNIQUE 차이점

  • DISTINCT는 조회 시 중복 제거, UNIQUE는 제약 조건으로 사용됨.
    -- DISTINCT 사용 예제 (중복 제거)
    SELECT DISTINCT job_id FROM employees;
    
    -- UNIQUE 사용 예제 (제약 조건)
    CREATE TABLE test_table (
        id NUMBER UNIQUE,  -- 중복 허용 안 함
        name VARCHAR2(50)
    );
    

9. iSQL*Plus

iSQL*Plus란?

  • 오라클에서 제공하는 SQL 실행 도구 중 하나
  • 웹 기반 인터페이스로 SQL 문을 실행하고 결과를 볼 수 있음

인터페이스 구성 화면

  • SQL 입력 창, 실행 결과 창, 명령 버튼 등이 포함됨

스크립트 로드

  • @ 또는 START 명령어를 사용하여 SQL 스크립트를 실행 가능 
  • @C:\sql_scripts\query.sql;

이력 페이지

  • 실행했던 SQL 문장의 기록을 관리하여 다시 실행 가능

iSQL*Plus
iSQL*Plus

 

관계형 데이터베이스

1. 관계형 데이터베이스의 데이터 격납 형식

  • 테이블(Table): 데이터를 행(Row)과 열(Column)로 저장하는 기본 단위
  • 레코드(Record): 테이블의 한 행, 하나의 데이터 항목을 의미
  • 필드(Field): 테이블의 한 열, 속성을 나타냄
  • 키(Key): 데이터를 고유하게 식별하기 위한 값 (기본키, 외래키 등)
  • 인덱스(Index): 검색 성능을 향상시키기 위해 사용되는 데이터 구조

2. 관계형 데이터베이스의 특징

  • 데이터 무결성(Integrity): 데이터의 정확성과 일관성을 유지
  • 데이터 독립성(Independence): 논리적 구조와 물리적 구조가 독립적으로 관리됨
  • 데이터 중복 최소화(Minimal Redundancy): 동일한 데이터를 여러 곳에 저장하지 않음
  • 데이터 일관성(Consistency): 트랜잭션 수행 후에도 데이터가 일관성을 유지
  • 데이터 보안(Security): 접근 권한을 통해 데이터 보호

3. E-R 모델의 주요 컴포넌트

  • 엔터티(Entity): 데이터를 저장하는 기본 단위 (예: 학생, 수강 과목)
  • 속성(Attribute): 엔터티가 가지는 특성 (예: 학생의 이름, 학번)
  • 관계(Relationship): 두 개 이상의 엔터티 간의 연관 (예: 학생과 강의의 수강 관계)

4. SQL의 분류

  • DML(Data Manipulation Language, 데이터 조작 언어): 데이터를 조회, 삽입, 수정, 삭제
    • SELECT, INSERT, UPDATE, DELETE
  • DDL(Data Definition Language, 데이터 정의 언어): 데이터 구조를 정의
    • CREATE, ALTER, DROP, TRUNCATE
  • DCL(Data Control Language, 데이터 제어 언어): 데이터 접근 권한 제어
    • GRANT, REVOKE
  • TCL(Transaction Control Language, 트랜잭션 제어 언어): 트랜잭션 관리
    • COMMIT, ROLLBACK, SAVEPOINT

5. 관계형 모델의 구성요소

  • 릴레이션(Relation): 테이블 형태로 데이터 저장
  • 튜플(Tuple): 테이블의 한 행 (레코드)
  • 애트리뷰트(Attribute): 테이블의 한 열 (필드)
  • 도메인(Domain): 애트리뷰트가 가질 수 있는 값의 범위
  • 키(Key): 데이터를 식별하는 속성 (기본키, 후보키, 외래키 등)

6. 오라클 인스턴스와 오라클 서버

  • 오라클 서버(Oracle Server): 데이터베이스를 관리하는 시스템
  • 오라클 인스턴스(Oracle Instance): 데이터베이스를 운영하는 메모리와 프로세스 집합
    • SGA(System Global Area): 데이터 캐싱 및 SQL 실행을 위한 공유 메모리
    • 백그라운드 프로세스: 데이터베이스를 운영하는 데 필요한 프로세스 집합

7. SQL의 정의

  • SQL(Structured Query Language, 구조화된 질의 언어)
    • 관계형 데이터베이스에서 데이터를 관리하기 위한 언어
    • 데이터를 저장, 수정, 삭제, 검색하는 기능 제공
    • ANSI 표준을 따르지만 DBMS별 차이가 존재

 

 

1. 반복문, 조건문

  • 반복문 기본 문법: for, while, do-while 문을 이해하고, 반복 조건의 평가 순서를 숙지.
    • while 루프:
      • 조건을 먼저 평가하고 조건이 true일 경우 루프 실행.
      • 조건이 false이면 루프를 한 번도 실행하지 않을 수 있음.
      • int count = 0;

        while (count < 5) {
            System.out.println("Count is: " + count);
            count++;
        }
    • do-while 루프:
      • 조건을 나중에 평가하므로, 루프 본문이 최소 1번 실행됨.
      • int count = 0;

        do {
            System.out.println("Count is: " + count);
            count++;
        } while (count < 5);
        • Count is: 0 //출력 값들   
          Count is: 1  
          Count is: 2  
          Count is: 3  
          Count is: 4  
  • 중첩 루프: 외부 루프와 내부 루프의 상호작용 및 변수 스코프.
  • 확장 for 문: 배열이나 컬렉션을 순회할 때 자주 사용.
  • public class LoopExample {
        public static void main(String[] args) {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 2; j++) {
                    System.out.println("i: " + i + ", j: " + j);
                }
            }
        }
    }
  • 조건문 기본 문법: if-else, switch-case의 조건식의 결과와 흐름
  • public class IfElseExample {
        public static void main(String[] args) {
            int num = 5;
            if (num > 0) {
                System.out.println("Positive");
            } else {
                System.out.println("Non-positive");
            }
        }
    }
  • public class SwitchExample {
        public static void main(String[] args) {
            int day = 3;
            switch (day) {
                case 1:
                    System.out.println("Monday");
                    break;
                case 2:
                    System.out.println("Tuesday");
                    break;
                default:
                    System.out.println("Other day");
            }
        }
    }

2. 산술 연산자

  • 우선순위: +, -, *, /, % 등 연산자의 우선순위를 이해.
  • 증감 연산자: 전치(++x)와 후치(x++)의 동작 차이.
  • 복합 대입 연산자: +=, -=, *=, /=, %= 등.
  • public class ArithmeticExample {
        public static void main(String[] args) {
            int a = 5;
            int result = ++a + a--;
            System.out.println("Result: " + result); // 12
        }
    }

3. 생성자(Constructor)

  • 기본 생성자와 사용자 정의 생성자: 생성자가 없는 경우 디폴트 생성자가 자동 추가됨. 반대로 생성자를 정의 하면 디폴트 생성자는 자동적으로 추가되지 않는다!
  • 1. 컨스트럭터 명과 클래스명과 동일해야한다
    2. 인스턴스 생성시에만 쓸 수 있다
    3. 반환값의 형을 기술할 수 없다
    4. private수식이 가능하다
  • this()와 super(): 다른 생성자 호출 및 상위 클래스 생성자 호출.
  • 오버로딩: 파라미터의 수나 타입이 다른 생성자 정의 가능.
  • class Person {
        String name;

        Person() {
            this("Unknown");
        }

        Person(String name) {
            this.name = name;
        }
    }

    public class ConstructorExample {
        public static void main(String[] args) {
            Person p1 = new Person();
            Person p2 = new Person("John");
            System.out.println(p1.name); // Unknown
            System.out.println(p2.name); // John
        }
    }

4. 계승과 다형성

  • 상속의 기본 원칙:
    • 단일 상속만 지원.
    • 생성자와 private한 필드와 메서드는 계승안된다
    • 하나의 클래스로부터 복수의 서브클래스를 정의하는 것은 가능
    • super.메서드명, super.필드명 으로 슈퍼클래스의 인스턴스 메서드나 필드에 접근가능
    • is-a 관계를 명확히 이해.
      • is-a관계가 아닐경우, 컴파일 에러가 발생하기 때문에 클래스맵을 그려보는게 좋다
      •  
        계승
  • 다형성:
    • 슈퍼클래스 타입으로 서브클래스 객체 참조.
    • 오버라이드된 메서드가 서브클래스에서 실행.
    • class Animal {
          void sound() {
              System.out.println("Animal makes a sound");
          }
      }

      class Dog extends Animal {
          @Override
          void sound() {
              System.out.println("Dog barks");
          }
      }

      public class PolymorphismExample {
          public static void main(String[] args) {
              Animal a = new Dog();
              a.sound(); // Dog barks
          }
      }

5. 오버라이드와 오버로드

  • 오버라이드:
    • 메서드 시그니처(이름, 파라미터리스트)와 반환 타입은 슈퍼클래스와 동일하거나 서브클래스여야 한다.
    • 접근 제어자는 슈퍼클래스보다 더 넓거나 같아야 함.
    • 오버라이드 (Override)조건:
      • 메서드 이름, 매개변수의 타입과 개수, 리턴 타입이 완전히 동일해야 합니다.
      • 접근 제어자는 부모 메서드보다 더 넓거나 같아야 합니다.
        • 예: 부모가 protected면 자식은 protected 또는 public 가능.
      • 부모 메서드가 throws로 선언한 예외보다 같거나 적은 범위의 예외만 던질 수 있습니다.
      • 메서드가 static 또는 final로 선언된 경우에는 오버라이드할 수 없습니다.
  • 오버로드:
    • 같은 이름의 메서드가 다른 파라미터 리스트를 가짐.
    • 오버로드 (Overload)조건:
      • 메서드 이름이 동일해야 합니다.
      • 매개변수의 타입, 개수, 순서 중 하나 이상이 달라야 합니다.
      • 리턴 타입은 상관없으며, 오직 매개변수의 차이로 구분됩니다.
      • 접근 제어자나 예외 처리는 영향을 미치지 않습니다.
       

6. 접근제어자

  • private, default, protected, public:
    • 클래스, 패키지, 상속, 외부 접근 수준 결정.
    • public
      • 제한 없음.
      • 모든 클래스, 패키지, 외부에서 접근 가능.
    • protected
      • 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능.
      • 상속 관계에서 주로 사용.
    • (default)
      • 동일 패키지 내에서만 접근 가능.
      • 접근 제어자를 명시하지 않을 때 적용.
    • private
      • 동일 클래스 내에서만 접근 가능.
      • 가장 제한적, 외부 접근 불가.
      • 생성자도 메서드의 한 종류이기때문에 접근제어자 사용이 가능하다 (클래스내의 생성자, 필드, 클래스의구상메서드에 사용 가능)
        • 서브클래스의 super도 불가능하다!!
        • 같은 클래스 라면 this.프라이빗메서드명 도 호출 가능 
  • class Example {
        private int value = 10;

        private void showValue() {
            System.out.println("Value: " + value);
        }

        public void accessPrivate() {
            showValue();
        }
    }

    public class AccessModifierExample {
        public static void main(String[] args) {
            Example ex = new Example();
            ex.accessPrivate(); // Value: 10
        }
    }
  • 캡슐화
    • 필드는 private, 접근은 public 메서드 사용  
    • class Student {
          private String name;

          public String getName() {
              return name;
          }

          public void setName(String name) {
              this.name = name;
          }
      }

      public class EncapsulationExample {
          public static void main(String[] args) {
              Student student = new Student();
              student.setName("Alice");
              System.out.println(student.getName()); // Alice
          }
      }

7. static 필드 및 메서드

  • 특징:
    • 클래스 단위에서 공유.
    • 객체 생성 없이 사용 가능.
    • static 메서드에서는 인스턴스 멤버 접근 불가.
      • static 필드나 static 메서드에 접근 가능하다 (인스턴스 필드, 메서드에는 접근 불가)

8. 배열

  • 초기화: 배열 선언 및 초기화 방식.
  • 참조값: 배열의 참조값 변경 가능.
  • 데이터 형의 뒤에 []를 써줘야함
  • public class ArrayExample {
        public static void main(String[] args) {
            int[] numbers = {1, 2, 3};
            int[] otherNumbers = numbers;
            otherNumbers[0] = 10;

            System.out.println(numbers[0]); // 10
        }
    }

9. 인터페이스

  • 정의:
    • 정보은닉을 위해 쓰인다.
    • 필드와 메서드는 모두 public이어야 한다 
    • public static final 필드와 public abstract 메서드로만 구성. (암묵적)
      • 인터페이스의 필드는 상수로 선언된.
        따라서 값을 초기화하지 않으면 컴파일 에러가 발생.
      • public interface Example {
            String hi = "Hello";  // 가능 (public static final 자동 추가)
            int value;            // 컴파일 에러 (초기화 필요)
        }
    • default와 static 메서드도 포함 가능(Java 8 이후).
    • interface Animal {
          void sound();
      }

      class Cat implements Animal {
          public void sound() {
              System.out.println("Cat meows");
          }
      }

      public class InterfaceExample {
          public static void main(String[] args) {
              Animal animal = new Cat();
              animal.sound(); // Cat meows
          }
      }
  • 구현:
    • 클래스는 여러 인터페이스를 구현 가능.

10. 패키지 및 import

  • 패키지:
    • 소스 파일의 첫 줄에 선언.
  • import:
    • *는 패키지 내 모든 클래스를 포함하나, 하위 패키지는 포함하지 않음.
    • 임포트 선언은 임포트하고 싶은 클래스의 완전수식클래스명을 지정하던가 그 클래스가 소속하는 패키지명과 와일드카드 표기로 패키지 내 전부를 임포트하는 식으로도 지정할 수 있다

11. null 및 기본 값

  • 참조형 변수: 초기화되지 않으면 null.
  • 기본값:
    • 정수: 0, 실수: 0.0, 논리: false, 참조형: null.

12. 추상 클래스

  • 추상 클래스는 인스턴스화할 수 없으며 추상 메서드를 포함
  • 명시적으로 abstract를 적어주어야 컴파일에러가 발생하지 않는다
  • abstract class Shape {
        abstract void draw();
    }

    class Circle extends Shape {
        void draw() {
            System.out.println("Drawing Circle");
        }
    }

    public class AbstractClassExample {
        public static void main(String[] args) {
            Shape shape = new Circle();
            shape.draw(); // Drawing Circle
        }
    }

13. 기타

  • 자바의 특징:
    • 플랫폼 독립성, 가비지 컬렉션, 멀티스레드 지원.
      • 1. 플랫폼에 의존하지 않는다
        2. 아키텍쳐에 의존하지 않는다
        3. 자동으로 메모리가 해방된다
        4. 실행시에 컴파일하면서 실행하는 실행시컴파일러 방식을 채용한다
        5. 멀티스레드에의한 병행처리를 서포트한다
        6. 보안성능이 높다
        7. Write Once, Run Anywhere가 표어임
    • java SE에는 GUI를 실현하는 AWT나 Swing, JavaFx라이브러리를 포함한다. 따라서 구이 베이스의 어플리케이션을 개발하려면 JavaSE가 맞다. Java EE는 웹베이스의 어플리케이션을 개발하는 기능을 제공한다.Java ME는 휴대전화나 PDA,공업용로봇어플리케이션 개발, Java DB는 JDK에 부속하는 간이 데이터베이스 관리소프트웨어이다.
 

 

 


주의할 점 및 시험 대비

  1. 자주 틀린 항목 보강:
    • 반복문과 중첩 루프: 변수 초기화 및 스코프 처리.
    • 접근제어자와 캡슐화: private의 정확한 사용법.
    • 생성자와 초기화 블록: this()와 super()의 위치 및 사용.
  2. 출제 빈도가 높은 영역:
    • 기본 문법: 반복문, 조건문, 연산자.
    • 객체지향: 상속, 다형성, 인터페이스.
    • 기타: static과 기본 생성자.
  3. 문제 풀이 시 체크리스트:
    • 메서드와 생성자의 서명 확인.
    • 상속 관계도 작성.
    • static과 인스턴스 멤버의 접근 가능 여부.

Java SE Bronze (Available only in Japan) Exam Number: 1Z0-818

Format: 選択問題

Duration: 65 分

Exam Price: ¥14,725

Number of Questions: 60 問

Passing Score: 60%

 

https://education.oracle.com/ko/x/pexam_1Z0-818

+ Recent posts