기본햄버거 생성

package composite;

import lombok.Data;

@Data // getter, setter 생성
public class Burger {
	private int price;
	private String desc;

	public Burger() {
		this(1500, "기본버거");
	}

	public Burger(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "가 만들어졌습니다.");
	}
	
	public static void main(String[] args) {
		System.out.println(new Burger().getPrice());
	}
}

 

코카콜라 만들기

package composite;

import lombok.Data;

@Data
public class Coke {
	private int price;
	private String desc;
	
	public Coke() {
		this(1500, "코카콜라");
	}
	
	public Coke(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "가 만들어졌습니다.");
	}
	
	public static void main(String[] args) {
		System.out.println(new Coke().getPrice());
	}
}

 

감자칩 만들기

package composite;

import lombok.Data;

@Data
public class FrenchFried {
	private int price;
	private String desc;
	
	public FrenchFried() {
		this(2000, "감자칩");
	}
	
	public FrenchFried(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "이 만들어졌습니다.");
	}
	
	public static void main(String[] args) {
		System.out.println(new FrenchFried().getPrice());
	}
}

 

Burger를 상속받아서 BigBurger 만들기

package composite;

import lombok.Data;

@Data
public class BigBurger extends Burger {
	public BigBurger() {
		super(4000, "빅버거");
	}
	
	public BigBurger(int price, String desc) {
		super(price, desc);
	}
	
	public static void main(String[] args) {
		System.out.println(new BigBurger().getPrice());
	}
}

 

Burger를 상속받아서 ShrimpBurger 만들기

package composite;

import lombok.Data;

@Data
public class ShrimpBurger extends Burger {

	public ShrimpBurger() {
		super(3500, "쉬림프버거");
	}

	public ShrimpBurger(int price, String desc) {
		super(price, desc);
	}
	
	public static void main(String[] args) {
		System.out.println(new ShrimpBurger().getPrice());
	}
}

 

콤포지션을 이용하여 클래스 안에 클래스를 사용하기

BigBurgerSet만들기

package composite;

import lombok.Data;

// 자바는 다중 상속이 안됨 (부모가 여럿이 될 수 없음)

@Data
public class BigBurgerSet {
	// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
	private BigBurger bigBurger;
	private Coke coke;
	private FrenchFried frenchFried;
	
	public BigBurgerSet() {
		this(new BigBurger(), new Coke(), new FrenchFried());
	}
	
	public BigBurgerSet(BigBurger bigBurger) {
		this.bigBurger = bigBurger;
		this.coke = new Coke();
		this.frenchFried = new FrenchFried();
	}

	public BigBurgerSet(BigBurger bigBurger, Coke coke, FrenchFried frenchFried) {
		this.bigBurger = bigBurger;
		this.coke = coke;
		this.frenchFried = frenchFried;
	}
	
	public static void main(String[] args) {
		System.out.println(new BigBurgerSet().getBigBurger());
	}

}

 

ShrimpBurgerSet  만들기

package composite;

import lombok.Data;

@Data
public class ShrimpBurgerSet {

	// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
	private ShrimpBurger shrimpBurger;
	private Coke coke;
	private FrenchFried frenchFried;
	
	public ShrimpBurgerSet() {
		this(new ShrimpBurger(), new Coke(), new FrenchFried());
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger) {
		this(shrimpBurger, new Coke(), new FrenchFried());
	}
	
	public ShrimpBurgerSet(Coke coke) {
		this(new ShrimpBurger(), coke, new FrenchFried());
	}
	
	public ShrimpBurgerSet(FrenchFried frenchFried) {
		this(new ShrimpBurger(), new Coke(), frenchFried);
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke) {
		this(shrimpBurger, coke, new FrenchFried());
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, FrenchFried frenchFried) {
		this(shrimpBurger, new Coke(), frenchFried);
	}
	
	public ShrimpBurgerSet(Coke coke, FrenchFried frenchFried) {
		this(new ShrimpBurger(), coke, frenchFried);
	}
	
	
	// 생성자가 제일 많은 것이 기준
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke, FrenchFried frenchFried) {
		this.shrimpBurger = shrimpBurger;
		this.coke = coke;
		this.frenchFried = frenchFried;
	}
	
	public static void main(String[] args) {
		System.out.println(new ShrimpBurgerSet().getShrimpBurger());
	}
}

 

LotteriaApp 만들기 (햄버거 운영)

package composite;

public class LotteriaApp {
	public static void main(String[] args) {
		// 빅버거 세트
		BigBurgerSet set1 = new BigBurgerSet();
		
		System.out.println();
		
		// 기본버거
		Burger burger1 = new Burger();
		
		System.out.println();
		
		// 콜라
		Coke coke1 = new Coke();
		
		System.out.println();
		
		
		// BigBurgerSet
		BigBurgerSet set2 = new BigBurgerSet(
				new BigBurger(3000, "빅버거할인"),
				new Coke(),
				new FrenchFried()	
				);
		
		System.out.println();
		
		BigBurgerSet set3 = new BigBurgerSet(
				new BigBurger(2000, "빅버거할인"),
				new Coke(),
				new FrenchFried()
				);
		
		
		System.out.println();
		
		
		// 새우버거 세트 추가요
		ShrimpBurgerSet set4 = new ShrimpBurgerSet();
		
		System.out.println();
		
		
		BigBurgerSet set5 = new BigBurgerSet(
				new BigBurger(2000, "빅버거할인")
				);
		
		
		System.out.println();
	}
}

 

 

제네릭은 클래스 안에 들어갈 자료형을 선언 및 초기화시 정할 수 있는 것을 말한다.

package coffeeshop.test;

class Data1 {
	
	// 오브젝트 자료형은 받기는 쉬우나 받은뒤 사용하려면 캐스팅 해야하기 때문에 불편
	Object data;
}


// 제네릭
class Data <T> {
	T value;
}

// 콤마를 통해서 두개를 넣을 수 있다
class Str<K, V>{
	K k;
	V v;
}


public class GenericEx01 {
	public static void main(String[] args) {
		Data1 data1 = new Data1();
		data1.data = "오브젝트자료형";
		System.out.println((String)data1.data);
		
		
		
		Data<String> data = new Data<>();
		data.value = "제네릭문자열";
		System.out.println(data.value);
		
		// 제네릭에는 기본자료형이 들어갈 수 없다 (Wrapper 클래스로 감싸야한다)
		// Wrapper 클래스 = 기본자료형에 첫글자에 대문자(클래스자료형처럼) (기본자료형의 수만큼 있음)
		// int -> Integer / char -> Character
		Data<Integer> data2 = new Data<>(); 
		
		data2.value = 10;
		System.out.println(data2.value);
		
		
		Str<String, String> s = new Str<>();
		s.k = "비밀번호";
		s.v = "bitc5500";
		
		System.out.println(s.k);
		System.out.println(s.v);
	}
}

1.손님이 커피숍에 들어간다

오브젝트 손님
오브젝트 커피숍

------------------

2.손님이 바리스타에게 가서 주문

오브젝트 바리스타

---------------------

3.손님이 메뉴판을 본다

오브젝트 메뉴판
오브젝트 메뉴목록
오브젝트 메뉴

---------------------

4.손님이 바리스타에게 아메리카노를 주문한다

---------------------

5.바리스타가 아메리카노를 만든다

---------------------

6.바리스타가 아메리카노를 손님에게 준다

-----------------------

객체지향 프로그래밍에서는 현실에서 생명이 없는 것들도 살아있는 것처럼 취급한다.

오브젝트들은 각자의 역할이 있고 협력을 한다

오브젝트 => 역할(부모클래스) => 책임(메서드)

오브젝트 => 협력 => 메시지(함수의 호출)

역할, 책임, 협력, 메시지 -- 네개가 합쳐져서 객체지향을 이룬다 

역할은 대체될 수 없고 (부모클래스, 추상클래스, 인터페이스) 그 아래 오브젝트는 대체 될 수 있다.
(Protoss=역할 Object=질럿,드라군)

책임 없이 데이터만 있는 애들 - 클래스 자료형 : Beans, Model, 데이터베이스의 테이블

----------------------

배열
- 빠르다, 생성 후 배열길이를 줄이거나 늘릴 수 없다

링크드 리스트
- 느리다, 배열길이를 줄이거나 늘릴 수 있다

어레이리스트
- 배열길이를 줄이거나 늘릴 수 있다
- 순차적으로 정렬되서 랜덤엑세스가 가능하다(검색효율이 뛰어나다)
- 수정 삭제시 링크드 리스트 보다 느리다

----------------------------

 

 

 

기본버거 콜라 감자튀김을 만든다

package composite;

import lombok.Data;

@Data // getter, setter 생성
public class Burger {
	private int price;
	private String desc;

	public Burger() {
		this(1500, "기본버거");
	}

	public Burger(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "가 만들어졌습니다.");
	}
}
package composite;

import lombok.Data;

@Data
public class Coke {
	private int price;
	private String desc;
	
	public Coke() {
		this(1500, "코카콜라");
	}
	
	public Coke(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "가 만들어졌습니다.");
	}
}
package composite;

import lombok.Data;

@Data
public class FrenchFried {
	private int price;
	private String desc;
	
	public FrenchFried() {
		this(2000, "감자칩");
	}
	
	public FrenchFried(int price, String desc) {
		this.price = price;
		this.desc = desc;
		System.out.println(desc + "이 만들어졌습니다.");
	}
}

 

버거를 상속 받아 빅버거와 쉬림프버거를 만든다

package composite;

public class BigBurger extends Burger {
	public BigBurger() {
		super(4000, "빅버거");
	}
	
	public BigBurger(int price, String desc) {
		super(price, desc);
	}
}
package composite;

public class ShrimpBurger extends Burger {

	public ShrimpBurger() {
		super(3500, "쉬림프버거");
	}

	public ShrimpBurger(int price, String desc) {
		super(price, desc);
	}
}

 

 

 

콤포지션

- 상속이 아닌 만들어 놓은 클래스를 가져오는 것

 

빅버거, 쉬림프버거, 감자튀김, 콜라 를 이용해서 세트를 만들기

package composite;

import lombok.Data;

// 자바는 다중 상속이 안됨 (부모가 여럿이 될 수 없음)

@Data
public class BigBurgerSet {
	// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
	private BigBurger bigBurger;
	private Coke coke;
	private FrenchFried frenchFried;
	
	public BigBurgerSet() {
		this(new BigBurger(), new Coke(), new FrenchFried());
	}

	public BigBurgerSet(BigBurger bigBurger, Coke coke, FrenchFried frenchFried) {
		this.bigBurger = bigBurger;
		this.coke = coke;
		this.frenchFried = frenchFried;
	}

}
package composite;

import lombok.Data;

@Data
public class ShrimpBurgerSet {

	// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
	private ShrimpBurger shrimpBurger;
	private Coke coke;
	private FrenchFried frenchFried;

	public ShrimpBurgerSet() {
			this(new ShrimpBurger(), new Coke(), new FrenchFried());
		}

	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke, FrenchFried frenchFried) {
			this.shrimpBurger = shrimpBurger;
			this.coke = coke;
			this.frenchFried = frenchFried;

		}

}

 

실행 파일을 만들어서 실행해보기

package composite;

public class LotteriaApp {
	public static void main(String[] args) {
		// 빅버거 세트
		BigBurgerSet set1 = new BigBurgerSet();
		
		System.out.println();
		
		// 기본버거
		Burger burger1 = new Burger();
		
		System.out.println();
		
		// 콜라
		Coke coke1 = new Coke();
		
		System.out.println();
		
		
		// BigBurgerSet
		BigBurgerSet set2 = new BigBurgerSet(
				new BigBurger(3000, "빅버거할인"),
				new Coke(),
				new FrenchFried()	
				);
		
		System.out.println();
		
		BigBurgerSet set3 = new BigBurgerSet(
				new BigBurger(2000, "빅버거할인"),
				new Coke(),
				new FrenchFried()
				);
		
		System.out.println();
		
		
		// 새우버거 세트 추가요
		ShrimpBurgerSet set4 = new ShrimpBurgerSet();
		
		System.out.println();
	}
}

 

생성자 오버로딩

package composite;

import lombok.Data;

@Data
public class ShrimpBurgerSet {

	// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
	private ShrimpBurger shrimpBurger;
	private Coke coke;
	private FrenchFried frenchFried;
	
	public ShrimpBurgerSet() {
		this(new ShrimpBurger(), new Coke(), new FrenchFried());
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger) {
		this(shrimpBurger, new Coke(), new FrenchFried());
	}
	
	public ShrimpBurgerSet(Coke coke) {
		this(new ShrimpBurger(), coke, new FrenchFried());
	}
	
	public ShrimpBurgerSet(FrenchFried frenchFried) {
		this(new ShrimpBurger(), new Coke(), frenchFried);
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke) {
		this(shrimpBurger, coke, new FrenchFried());
	}
	
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, FrenchFried frenchFried) {
		this(shrimpBurger, new Coke(), frenchFried);
	}
	
	public ShrimpBurgerSet(Coke coke, FrenchFried frenchFried) {
		this(new ShrimpBurger(), coke, frenchFried);
	}
	
	
	// 생성자가 제일 많은 것이 기준
	public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke, FrenchFried frenchFried) {
		this.shrimpBurger = shrimpBurger;
		this.coke = coke;
		this.frenchFried = frenchFried;
	}
	
	public static void main(String[] args) {
		ShrimpBurgerSet s1 = new ShrimpBurgerSet(new Coke(), new FrenchFried());
	}
}

 

STUDENT 테이블과 DEPARTMENT 테이블을 사용하여 '서진수' 학생과
1전공(DEPTNO2)이 동일한 학생들의 이름과 1전공 이름을 출력하세요

 

먼저 서진수 학생의 전공을 추린다

SELECT DEPTNO1
FROM STUDENT
WHERE NAME = '서진수';

 

101번을 전공하는 학생이름과 전공을 출력한다

SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO = 101 AND S.DEPTNO1 = d.deptno;

 

101자리에 맨 위 코드를 서브쿼리한다

SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO =
(
  SELECT DEPTNO1
  FROM STUDENT
  WHERE NAME = '서진수'
) 
AND S.DEPTNO1 = d.deptno;

 

PROFESSOR 테이블과 DEPARTMENT 테이블을 조회하여 '주승재' 교수보다 나중에 입사한 사람의 이름과 입사일, 학과명을 출력하세요.

 

먼저 주승재교수의 입사일을 확인

SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재';

 

위 코드를 서브쿼리하여 주승재 교수보다 입사일이 늦은 사람들을 추리기

SELECT P.NAME , P.HIREDATE, d.dname
FROM PROFESSOR P, DEPARTMENT D
WHERE HIREDATE > 
(
SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재'
)
AND p.deptno = d.deptno;

 

 

STUDENT 테이블에서 1전공(DEPTNO1)이 201번인 학과의 평균 몸무게보다
몸무게가 많은 학생들의 이름과 몸무게를 출력하세요.

 

먼저 학생들의 평균 몸무게를 확인

SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1;

 

위 코드를 서브쿼리하여  필요한 요소를 출력

SELECT NAME, WEIGHT
FROM STUDENT
WHERE WEIGHT >
(
SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1
);

 

EMP2 테이블을 사용하여 전체 직원 중 '과장' 직급의
최소 연봉자보다 연봉이 높은 사람의 이름과 직급, 연봉을 출력하세요.
단, 연봉 출력 형식은 아래와 같이 천 단위 구분 기호와 $표시를 하세요.

SELECT NAME, POSITION, to_char(pay, '$999,999,999') SALAERY
FROM EMP2
WHERE pay >
(
    SELECT MIN(PAY)
    FROM EMP2
    WHERE POSITION = '과장'
);

 

EMP2 테이블과 DEPT2 테이블을 조회하여 각 부서별 평균 연봉을 구하고
그중에서 평균 연봉이 가장 적은 부서의 평균 연봉보다
적게받는 직원들의 부서명, 직원명, 연봉을 출력하세요.

SELECT DEPT2.DNAME, EMP2.NAME, TO_CHAR(EMP2.PAY, '$999,999,999') SALARY
FROM EMP2, DEPT2
WHERE PAY < 
(
SELECT *
FROM
(
SELECT AVG(PAY)
FROM EMP2
GROUP BY  DEPTNO
ORDER BY  AVG(PAY)
)
WHERE ROWNUM = 1
) AND EMP2.DEPTNO = DEPT2.DCODE;

 

 

 

 

 

오라클은 사용자를 생성하면 데이터베이스도 자동으로 생성한다

1. 사용자
2. DB
3. 테이블

-----------

SYNONYM은
CREATE PUBLIC SYNONYM EMP FOR SCOTT.EMP; (다른 사용자의 테이블을 시노님으로 가져오기)
위처럼 쓰면 FROM EMP; 처럼 이용해도 가져와진다.

위처럼 쓰지 않으면 다른테이블을 가져올때 항상
FROM SCOTT.EMP; 처럼 사용해야 한다

---------------------------------

뷰의 핵심은 동기화

외부직원에게 테이블의 민감한 정보를 제외하고 제공할때 복제해서주면 동기화의 문제와 다시합칠때 문제가 있다

VIEW를 이용하면 정보를 은닉하여 보여주고 싶은 것만 보여주고 동기화도 자동으로 된다

 

---------------------------------

CRUD (필수 꼭외울 것)

INSERT - C (create)

SELECT - R (read)

UPDATE - U

DELETE - D

--------------------------------

SELECT * 
FROM EMP; 를 하면 DB에 검색을 바로 하는게 아니라 DBMS(오라클)를 검색한다
1. 파싱 ( 코드 구문분석)
2. 데이터딕셔너리에게 메타데이터를 물어본다 (EMP테이블이 있어? ENAME라는 컬럼이 있어?)
3. 있으면 DB(램을 검색하고 램에 없으면 하드에서 램으로 올려서 검색)
(한번 수행했던 쿼리는 다시 수행하면 파싱이나 딕셔너리접근을 하지않아서 빠르게 출력된다)

 

--------------------------------

CPU - 캐시메모리 - 램

이면 캐시메모리가 캐시 역할

CPU - 램 - 하드디스크

이면 램이 캐시 역할

 

CPU가격은 캐시메모리가 정한다(속도가 매우 빠르기때문)

---------------------------------

최근 프로그래밍에서 속도증가는 자료구조 등 보다 하드디스크접근(I/O)을 줄이는 것에 집중되어 있다

디스크 접근(I/O)을 줄이는 방법
1.캐시메모리를 늘리기 / 메모리에 자주쓰는 데이터를 올리는 기법
2.시퀀셜 엑세스 기법
3.랜덤엑세스 기법

1번이 가장 중요

 

2.시퀀셜 엑세스 기법

순서대로 블록 전체를 다 읽어서 필요한 데이터를 찾아낸다.(풀스캔)

풀스캔 - 찾을 데이터가 많으면 많을수록 유리해진다

 

3.랜덤 엑세스 기법 (프라이머리 키)

필요한 블록만 하나씩 가져오는 것

데이터가 적으면 적을수록 유리해진다

통상 15%이내의 데이터를 검색할 때 시퀀셜보다 랜덤 엑세스가 유리하다

----------------------------

클러스터 - 군집화

클러스터링 팩터 전략
데이터를 아무곳에나 놓는 것이 아니라 비슷한것은 모아두는 것(검색시 속도향상)

------------------------------

 

 

 

'Database > OracleSQL' 카테고리의 다른 글

200408  (0) 2020.04.08
오라클 서브쿼리 문제  (0) 2020.04.03
오라클 서브쿼리, IN, EXISTS 차이  (0) 2020.04.02
오라클 DML, INSERT, SELECT, UPDATE, DELETE  (0) 2020.04.02
오라클 VIEW  (0) 2020.04.02

서브쿼리

SELECT *
FROM EMP
WHERE SAL > 800;

800을 서브쿼리로 바꾸기

SELECT *
FROM EMP
WHERE SAL > 
(
    SELECT SAL
    FROM EMP
    WHERE ENAME = 'SMITH'
);

 

 

조건이 1개, 비교값도 1개일 경우

SELECT *
FROM EMP
WHERE SAL > 
(
    SELECT SAL
    FROM EMP
    WHERE ENAME = 'SMITH'
);

 

조건이 1개, 비교값이 여러개일 경우

SELECT *
FROM EMP
WHERE SAL IN 
(
    SELECT SAL
    FROM EMP
    WHERE JOB = 'MANAGER'
);


--위 코드는 아래와 같다

SELECT *
FROM EMP
WHERE SAL IN (2975, 2850, 2450);

 

 

STUDENT 테이블과 DEPARTMENT 테이블을 사용하여 
'서진수'학생과 1전공(DEPTNO1)이 동일한 학생들의 
이름과 1전공 이름을 출력하세요

 

먼저 서진수 학생의  전공번호를 확인한다

SELECT DEPTNO1
FROM STUDENT
WHERE NAME = '서진수';

 

전공이 101인 학생의 이름과 전공이름을 출력한다

SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO = 101 AND S.DEPTNO1 = d.deptno;

 

101자리에 서브쿼리를 넣는다

SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO =
(
SELECT DEPTNO1
FROM STUDENT
WHERE NAME = '서진수'
) AND S.DEPTNO1 = d.deptno;

 

 

PROFESSOR 테이블과 DEPARTMENT 테이블을 조회하여

'주승재'교수보다 나중에 입사한 사람의 이름과 입사일, 학과명을 출력하세요.

 

먼저 주승재 교수의 입사일을 확인한다

SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재';

 

위의 테이블을 서브쿼리하여 이름과 입사일 학과명을 출력한다

SELECT P.NAME , P.HIREDATE, d.dname
FROM PROFESSOR P, DEPARTMENT D
WHERE HIREDATE > 
(
SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재'
)
AND p.deptno = d.deptno;

 

STUDENT 테이블에서 1전공(DEPTNO1)이 201번인 학과의

평균 몸무게보다 몸무게가 많은 학생들의 이름과 몸무게를 출력하세요.

 

먼저 201번 학과의 평균 몸무게를 검색한다

SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1;

 

위의 테이블을 서브쿼리하여 학생들의 이름과 몸무게를 출력한다

SELECT NAME, WEIGHT
FROM STUDENT
WHERE WEIGHT >
(
SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1
);

 

EMP2 테이블을 사용하여 전체 직원 중 '과장' 직급의 최소 연봉자보다
연봉이 높은 사람의 이름과 직급, 연봉을 출력하세요.
단, 연봉 출력 형식은 아래와 같이 천 단위 구분 기호화 $표시를 하세요.

 

먼저 EMP2 테이블의 과장직급의 최소 연봉을 구한다

    SELECT MIN(PAY)  -- MIN함수는 월급을 찾는다
    FROM EMP2
    WHERE POSITION = '과장'

 

4900만원이 최소치이므로 WHERE으로 그 이상인 사람들을 찾을 수 있다.

SELECT NAME, POSITION, to_char(pay, '$999,999,999')
FROM EMP2
WHERE pay > 49000000;

 

서브쿼리로 처음 코드를 넣으면

SELECT NAME, POSITION, to_char(pay, '$999,999,999')
FROM EMP2
WHERE pay >
(
    SELECT MIN(PAY)
    FROM EMP2
    WHERE POSITION = '과장'
);

 

 

EMP2 테이블과 DEPT2 테이블을 조회하여 각 부서별 평균 연봉을 구하고
그중에서 평균 연봉이 가장 적은 부서의 평균 연봉보다
적게받는 직원들의 부서명, 직원명, 연봉을 출력하세요.

 

먼저 각부서별 평균연봉을 구한다

SELECT AVG(PAY)
FROM EMP2
GROUP BY  DEPTNO
ORDER BY  AVG(PAY);

 

위의 코드를 서브쿼리하여서 1번째 것을 출력

SELECT *
FROM
(
  SELECT AVG(PAY)
  FROM EMP2
  GROUP BY  DEPTNO
  ORDER BY  AVG(PAY)
)
WHERE ROWNUM = 1;

 

그리고 출력할 것들을 SELECT 정리하고 25000000자리에 위 코드를 서브쿼리한다

SELECT DEPT2.DNAME, EMP2.NAME, TO_CHAR(EMP2.PAY, '$999,999,999') SALARY
FROM EMP2, DEPT2
WHERE PAY < 25000000 AND EMP2.DEPTNO = DEPT2.DCODE;

 

SELECT DEPT2.DNAME, EMP2.NAME, TO_CHAR(EMP2.PAY, '$999,999,999') SALARY
FROM EMP2, DEPT2
WHERE PAY < 
(
  SELECT *
  FROM
  (
    SELECT AVG(PAY)
    FROM EMP2
    GROUP BY  DEPTNO
    ORDER BY  AVG(PAY)
  )
  WHERE ROWNUM = 1
) 
AND EMP2.DEPTNO = DEPT2.DCODE;

 

 

IN 과  EXISTS의 차이

IN 은 서브쿼리 데이터를 WHERE 오른쪽의 DEPTNO 와 비교해서 같은 값인 경우에만 출력한다

    SELECT DEPTNO
    FROM DEPT
    WHERE DEPTNO = 20;

20이 출력

 

DEPTNO가 20인 모든 데이터를 출력

SELECT * FROM DEPT
WHERE DEPTNO IN (
    SELECT DEPTNO
    FROM DEPT
    WHERE DEPTNO = 20
    );

 

EXISTS는 서브쿼리 데이터가 있으면 메인 쿼리를 모두 실행하고, 없으면 아예 실행하지 않는다

SELECT * FROM DEPT
WHERE EXISTS (
    SELECT DEPTNO
    FROM DEPT
    WHERE DEPTNO = 20
    );

 

SELECT * FROM DEPT
WHERE EXISTS (
    SELECT DEPTNO
    FROM DEPT
    WHERE DEPTNO = 50
    );

 

 

 

'Database > OracleSQL' 카테고리의 다른 글

오라클 서브쿼리 문제  (0) 2020.04.03
200402 // SYNONYM, VIEW, CRUD, 인덱스 INDEX, , 클러스터링  (0) 2020.04.02
오라클 DML, INSERT, SELECT, UPDATE, DELETE  (0) 2020.04.02
오라클 VIEW  (0) 2020.04.02
오라클 ANSI JOIN  (0) 2020.04.02

DML

CRUD (필수 꼭외울 것)

INSERT - C (create)

SELECT - R (read)

UPDATE - U

DELETE - D

 

INSERT

데이터를 삽입할 때 사용

INSERT INTO dept2 (dcode, dname, pdept, area)
VALUES(9000, 'temp_1',1006, 'Temp Area');

 

제대로 들어갔는지 확인 해본다

SELECT *
FROM dept2;

 

날짜의 경우 INSERT 할때 

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS';

위 코드를 이용하여 형식을 바꾼뒤 '2014-10-23' 으로 넣거나

요소 입력시 TO_DATE를 이용하여 입력하여야한다.

자동으로 입력하려면 SYSDATE를 요소에 입력한다.

TO_DATE('2014-10-23', 'YYYY-MM-DD')

 

 

음수값 입력하기

CREATE TABLE t_minus(
no1 NUMBER,
no2 NUMBER(3),
no3 NUMBER(3,2));
INSERT INTO t_minus VALUES(1, 1, 1);

INSERT INTO t_minus VALUES(1.1, 1.1, 1.1);

INSERT INTO t_minus VALUES(-1.1, -1.1, -1.1);
SELECT * FROM t_minus;

NUMBER(3) - 정수자리를 3자리 (999) 로 지정

NUMBER(3, 2) - 정수자리를 3자리 (999) , 소수자리를 2자리 (0.99) 로 지정 

 

INSERT와 서브 쿼리를 사용하여 여러 행 입력하기

먼저 PROFESSOR 테이블을 복사하여 PROFESSOR3를 만든다

--INSERT와 서브쿼리를 사용하여 여러행 입력하기
CREATE TABLE professor3
AS
SELECT * FROM professor
WHERE 1 = 2; -- 아무데이터도 넣지 않기위해 무조건 틀린 조건이 나오도록 함

 

확인을 위해 select 해본다

SELECT *
FROM professor3;

의도 대로 데이터가 없는 테이블이 생성 되었다

 

 

서브쿼리로 여러건의 데이터를 한꺼번에 입력해본다

INSERT INTO professor3
SELECT * FROM professor;

 

professor3을 다시 확인해보면

SELECT *
FROM professor3;

자료들이 정상적으로 입력되어 있다

 

조건을 걸어서 입력하려면

INSERT INTO professor3
SELECT * FROM professor
WHERE PROFNO > 4000;

위와 같이 아래에 조건을 넣으면 된다 ( PROFNO가 4000번을 초과하는 행만 넣기)

 

 

INSERT ALL을 이용한 여러 테이블에 여러행 입력하기

먼저 테스트 테이블을 생성

CREATE TABLE prof_3
(
profno NUMBER,
name VARCHAR2(25)
);

CREATE TABLE prof_4
(
profno NUMBER,
name VARCHAR2(25)
);

 

다른 테이블의 데이터를 가져와서 입력

INSERT ALL
WHEN profno BETWEEN 1000 AND 1999 THEN INTO prof_3 VALUES(profno, name)
WHEN profno BETWEEN 2000 AND 2999 THEN INTO prof_4 VALUES(profno, name)
SELECT profno, name -- 모든 profno, name를 가져오기
FROM professor;

 

또는 아래와 같이 WHERE를 써도 된다

INSERT ALL
INTO prof_3 VALUES (profno, name)
INTO prof_3 VALUES (profno, name)
SELECT profno, name
FROM professor
WHERE profno BETWEEN 3000 AND 3999;

 

 

UPDATE

기존데이터를 다른 데이터로 변경 할때 사용

문법

UPDATE table
SET column = value
WHERE 조건;

 

 

직급이 조교수인 교수들의 BONUS를 200만원으로 인상

UPDATE professor
SET bonus = 200
WHERE position = '조교수';

 

확인해본다

SELECT *
FROM professor;

 

 

차범철 교수의 직급과 동일한 직급을 가진 교수들 중 현재 급여가 250만원이 안되는 교수들의 급여를 15%인상

UPDATE professor
SET pay = pay * 1.15
WHERE position =
(
SELECT position
FROM professor
WHERE name = '차범철'
)
and pay < 250;

 

UPDATE 조인

일반적인 UPDATE가 아닌 다른 테이블과 조인을 하는 UPDATE에 대해서 살펴본다

 

일반적인 UPDATE

UPDATE emp
SET sal = (sal + sal*0.1)
WHERE JOB = 'CLERK';

 

 

일반적인 UPDATE 조인

UPDATE emp E
SET sal = (sal + sal*0.1)
WHERE EXISTS
(
    SELECT 1 FROM DEPT D
    WHERE D.LOC = 'DALLAS' AND E.DEPTNO = D.DEPTNO
);

#여기서 서브쿼리안에  E.DEPTNO를 쓸 수 있는 것은 
코드를 실행할 때 코드안의 모든 테이블을 가장 먼저 불러오기 때문이다
그렇기 때문에 서브쿼리 밖에 있는 emp E를 서브쿼리 안에서 쓸 수 있는 것

 

 

테스트를 위한 테이블 생성

CREATE TABLE DEPT_HIST
(
    EMPNO NUMBER(4),
    APPOINTSEQNO NUMBER(4),
    DEPTNO NUMBER(2),
    APPOINTDD DATE
);

 

 

부서 번호가 20인 사원 발령 부서 번호 99로 데이터를 INSERT

INSERT INTO DEPT_HIST
SELECT EMPNO, 1 APPOINTSEQNO, 99 DEPTNO, SYSDATE APPOINTDD
FROM emp
WHERE DEPTNO = 20;

COMMIT;

 

 

EMP 테이블에 존재하지 않는 사원번호 2건을 INSERT

INSERT INTO DEPT_HIST VALUES (9322, 1, 99, SYSDATE);
INSERT INTO DEPT_HIST VALUES (9322, 1, 99, SYSDATE);

COMMIT;

 

 

잘못된 부서번호 99를 20으로 UPDATE

SELECT e.empno, e.deptno tobe_deptno, d.deptno asis_deptno
FROM emp e, dept_hist d
WHERE e.empno = d.empno;

 

UPDATE DEPT_HIST D
SET d.deptno = 
(
SELECT e.deptno FROM EMP e
WHERE e.empno = d.empno
);

COMMIT;

 

SELECT *
FROM DEPT_HIST;

 

 

DELETE

데이터를 삭제할 때 사용

DELETE FROM dept2
WHERE dcode >= 9000 AND dcode <= 9999;

 

DELETE는 데이터를 삭제하는 것이지만, 눈에 보이지 않게만 할뿐 데이터는 저장소에 저장되어 있다.
특별한 툴(BBED 등)을 이용하여 복구 할 수 있다

 

+ Recent posts