데이터 베이스의 속성

데이터베이스의 속성들은 현실 세계의 개념들과 일치해야한다

1.현실세계의 개념 : 이름 나이 등

2.정보 모델링(ER다이어그램) : 개체1--- 관계 --- 개체2

3.논리적 모델(관계 데이터 모델)

4.데이터베이스의 속성 :

이름 나이
홍길동 30
한사전 25

 

데이터베이스 생명주기

1.요구사항분석
사용자들의 요구사항을 듣고 분석,
데이터베이스 구축의 범위를 정하는 단계

2.설계
분석된 요구사항을 기초로 주요 개념과 업무 프로세스 등을 식별하고(개념적 설계),
사용하는 DBMS의 종류에 맞게 변환(논리적 설계)한 후,
데이터베이스 스키마를 도출(물리적 설계)

3.구현
설계 단계에서 생성한 스키마를 실제 DBMS에 적용하여 테이블 및 관련 객체(, 인덱스 등)를 만듦

4.운영
구현된 데이터베이스를 기반으로 소프트웨어를 구축하여 서비스를 제공

5.감시 및 개선
데이터베이스 운영에 따른 시스템의 문제를 관찰하고 데이터베이스 자체의 문제점을 파악하여 개선

 

개념적 모델링

요구사항을 수집하고 분석한 결과를 토대로 업무의 핵심적인 개념을 구분하고 전체적인 뼈대를 만드는 과정

개체(entity)를 추출하고 각 개체들 간의 관계를 정의하여 ER 다이어그램(ERD, Entity Relationship Diagram)을 만드는 과정까지를 말함

 

논리적 모델링

개념적 모델링에서 추출하지 않았던 상세 속성도 추출

정규화, 데이터표준화

 

물리적 모델링(physical modeling)

작성된 논리적 모델을 실제 컴퓨터의 저장 장치에 저장하기 위한 물리적 구조를 정의하고 구현하는 과정

DBMS의 특성에 맞게 저장 구조를 정의해야 데이터베이스가 최적의 성능을 낼 수 있음

CREATE TABLE Book (
  bookid      INT PRIMARY KEY, 
  bookname    VARCHAR(40),
  publisher   VARCHAR(40),
  price       INT 
);

 물리적 모델링시 트랜잭션, 저장 공간 설계 측면에서

1. 응답시간 최소화

2.트랜잭션 동시 발생한도 검토

3.저장공간 효율적 배치

 

ER모델

ER(Entity Relationship) 모델 : 세상의 사물을 개체(entity)와 개체 간의 관계(relationship)로 표현함

*개체(entity) : 독립적인 의미를 지니고 있는 유무형의 사람 또는 사물. 개체의 특성을 나타내는 속성(attribute)에 의해 식별됨. 개체끼리 서로 관계를 가짐.

남편 -- 결혼하다 -- 아내

 

ER 다이어그램

ER 모델은 개체와 개체 간의 관계를 표준화된 그림으로 나타냄

*직원한명이 여러 프로젝트에 참여 할 수 있기 때문에 1:N

 

개체 타입의 유형

강한 개체(strong entity) : 다른 개체의 도움 없이 독자적으로 존재할 수 있는 개체

ex ) 직원

약한 개체(weak entity) : 독자적으로는 존재할 수 없고 반드시 상위 개체 타입을 가짐

ex ) 직원의 가족 (해당 직원이 없으면 )

 

속성(attribute)

개체가 가진 성질

사람 - 이름, 나이

 

관계타입 유형

차수에 따른 유형

1진 관계 : 개체 하나로 관계를 만드는 것 

임꺽정의 멘토는 같은 테이블의 1번인 홍길동이기 때문에 1테이블로 관계를 만들 수 있다

번호 이름 멘토
1 홍길동  
2 임꺽정 1

개체1 --- 관계 --- 개체1

 

2진 관계 : 두개의 개체가 관계를 맺음

3진 관계 : 3개의 개체가 관계를 맺음

 

대응수(카디널리티)에 따른 유형

관계 대응수(cardinality) : 두 개체 타입의 관계에 실제로 참여하는 개별 개체

1:1 대응 ex) 직원들은 사무실에 각각의 컴퓨터를 1대씩 할당 받았다 

1:N 대응 ex) 각 학과에 여러학생들이 있다

N:M 대응 ex) 학생들은 여러 강좌를 들을 수 있다

 

ISA 관계

상위개체와 하위개체

 

참여 제약조건

그런경우는 잘 없지만 전체참여인 경우를 알아두자

 

역할

 

IE 표기법

 

ER모델을 관계 데이터 모델로 매핑(사상)

 

개체 타입의 사상

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

데이터베이스 ALL, SOME  (0) 2020.05.06
데이터베이스 무결성  (0) 2020.04.27
자바 데이터베이스에서 자료 가져오기  (0) 2020.04.22
200409  (0) 2020.04.09
오라클 예제 및 문제  (0) 2020.04.08

데이터 베이스에서 자료 가져오기

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class BookList {
	Connection con; // 멤버변수
	String query;
	Statement stmt;
	ResultSet rs;

	public BookList() {

		// 11g express edition은 orcl 대신 XE를 입력한다
		
		// 연결 문자열
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			
			// 파일 입출력(자바 파일 검색)
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			
			// 네트워크 입출력 + 객체 생성
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}

	private void printBook() throws Exception {
		query = "SELECT * FROM Book"; // sql문
		stmt = con.createStatement();
		rs = stmt.executeQuery(query);
		System.out.println("BOOK NO \tBOOK NAME \t\tPUBLISHER \tPRICE");
		while (rs.next()) { // 한줄씩 읽는다 (튜플)
			System.out.print("\t" + rs.getInt(1));
			System.out.print("\t" + rs.getString(2));
			System.out.print("\t\t" + rs.getString(3));
			System.out.println("\t" + rs.getInt(4));
		}
		con.close();

	}

	public static void main(String[] args) {
		BookList so = new BookList();
		try {
			so.printBook();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

파일을 나눠보자

BookList.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class BookList {
	Connection con;

	public BookList() {

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}

	void printBook() throws Exception {
		String query = "SELECT bookid, bookname, publisher, price FROM Book"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		System.out.println("BOOK NO \tBOOK NAME \t\tPUBLISHER \tPRICE");
		while (rs.next()) {
			System.out.print("\t" + rs.getInt(1));
			System.out.print("\t" + rs.getString(2));
			System.out.print("\t\t" + rs.getString(3));
			System.out.println("\t" + rs.getInt(4));
		}
		con.close();
	}
}

 

CustomerList.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CustomerList {
	Connection con;

	public CustomerList() {

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}
	
	void printCustomer() throws Exception {
		String query = "SELECT custid, name, address, phone FROM customer"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		System.out.println("custid \tname \t\taddress \tphone");
		while (rs.next()) {
			System.out.print("\t" + rs.getInt(1));
			System.out.print("\t" + rs.getString(2));
			System.out.print("\t\t" + rs.getString(3));
			System.out.println("\t" + rs.getString(4));
		}
		con.close();
	}
}

 

Basic.java

프로그램을 실행할 main 스택이 있는 클래스

public class Basic {
	public static void main(String[] args) {
		BookList so = new BookList();
		try {
			so.printBook();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		CustomerList cl = new CustomerList();
		try {
			cl.printCustomer();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

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

변수를 사용하는 방법

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CustomerList {
	Connection con;
	
	int custId;
	String name;
	String adress;
	String phone;

	public CustomerList() {

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}
	
	// 변수를 쓰는 방법
	void getCustomer() throws Exception {
		String query = "SELECT custid, name, address, phone FROM customer"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		System.out.println("custid, tname, address, phone");
		while (rs.next()) {
			custId = rs.getInt(1);
			name = rs.getString(2);
			adress = rs.getString(3);
			phone = rs.getString(4);
			
			printCustomer();
		}
		con.close();
	}
	
	void printCustomer() throws Exception {
		System.out.println(custId + ", " + custId + ", " + adress + ", " + phone);
	}

}

 

배열을 사용하는 방법

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CustomerList {
	Connection con;
	
	int custIdArr[] = new int[10];
	String nameArr[] = new String[10];
	String adressArr[] = new String[10];
	String phoneArr[] = new String[10];
	
	

	public CustomerList() {

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}
	
	// 배열을 쓰는 방법
	void getCustomer() throws Exception {
		String query = "SELECT custid, name, address, phone FROM customer"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		
		int index = 0;
		while (rs.next()) {
			custIdArr[index] = rs.getInt(1);
			nameArr[index] = rs.getString(2);
			adressArr[index] = rs.getString(3);
			phoneArr[index] = rs.getString(4);
			
			index++;
		}
		con.close();
	}
	
	void printCustomer() throws Exception {
		System.out.println("custid, tname, address, phone");
		for (int i = 0; i < 10; i++) {
			System.out.println(custIdArr[i] + ", " + nameArr[i] + ", " + adressArr[i] + ", " + phoneArr[i]);
		}
	}

}

 

객체를 사용하는 방법

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CustomerList {
	Connection con;

	int index;

	// 객체를 쓰는 방법 (내부 클래스)
	class Customer {
		int custId;
		String name;
		String adress;
		String phone;
	}
	
	Customer c1;

	public CustomerList() {
		// 객체
		c1 = new Customer();

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}

	// 객체를 쓰는 방법
	void getCustomer() throws Exception {
		String query = "SELECT custid, name, address, phone FROM customer"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		System.out.println("custid, tname, address, phone");

		while (rs.next()) {
			c1.custId = rs.getInt(1);
			c1.name = rs.getString(2);
			c1.adress = rs.getString(3);
			c1.phone = rs.getString(4);
			
			printCustomer();

		}
		con.close();
	}

	void printCustomer() throws Exception {
		System.out.println(c1.custId + ", " + c1.name + ", " + c1.adress + ", " + c1.phone);
	}	
	
}

 

객체 배열을 사용하는 방법

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CustomerList {
	Connection con;

	int index;
	
	// 객체 배열을 쓰는 방법
	class Customer {
		int custId;
		String name;
		String adress;
		String phone;
	}
	
	Customer cArr[];

	public CustomerList() {
		
		// 객체 배열
		cArr = new Customer[10];
		for (int i = 0; i < cArr.length; i++) {
			cArr[i] = new Customer();
		}

		// 11g express edition은 orcl 대신 XE를 입력한다
		String url = "jdbc:oracle:thin:@localhost:1521:XE";

		String userid = "c##madang";
		String pwd = "c##madang";

		try { // 드라이버를 찾는 과정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		} catch (Exception e) {
		}

		try { // 데이터베이스를 연결하는 과정
			System.out.println("데이터베이스연결 준비...");
			con = DriverManager.getConnection(url, userid, pwd);
			System.out.println("데이터베이스연결 성공");
		} catch (Exception e) {
		}
	}
	
	// 객체 배열을 쓰는 방법
	void getCustomer() throws Exception {
		String query = "SELECT custid, name, address, phone FROM customer"; // sql문
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		
		index = 0;
		while (rs.next()) {
			cArr[index].custId = rs.getInt(1);
			cArr[index].name = rs.getString(2);
			cArr[index].adress = rs.getString(3);
			cArr[index].phone = rs.getString(4);
			
			index++;
		}
		con.close();
	}
	
	void printCustomer() throws Exception {
		System.out.println("custid, tname, address, phone");
		for (int i = 0; i < index; i++) {
			System.out.println(cArr[i].custId + ", " + cArr[i].name + ", " + cArr[i].adress + ", " + cArr[i].phone);
		}
	}
	
	
	
}

 

 

 

 

 

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

데이터베이스 무결성  (0) 2020.04.27
데이터 베이스 모델링  (0) 2020.04.24
200409  (0) 2020.04.09
오라클 예제 및 문제  (0) 2020.04.08
200408  (0) 2020.04.08

기본키 - 개체 무결성

자바에서 DB에 데이터 전송할 때는 속성명을 모두 적어줘야한다

쿼리를 실행하고 F10을 누르면 COST가 나온다

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

데이터베이스

릴레이션 - 테이블

릴레이션쉽 - 테이블 연결

인스턴스 - 테이블의 모든 튜플들 모음

넓은 의미의 스키마 - 데이터베이스의 모든객체

좁은 의미의 스키마 - 테이블

도메인 - 값의 범위 제한 (1~100)

원자성 - 한 속성에 한가지 데이터만 넣는.. 느낌

관계대수 - 쿼리를 수식으로 만들어 놓음

제약조건 - constraints

기본키 - 유일해야한다, 테이블에 있는 후보키들 중에 선택된 1개

복합키 - 속성을 묶은 쌍을 키로 사용

후보키 -  alternate key, 대체키, 기본키가 되지 않은 속성이나 속성을 묶은 쌍

슈퍼키 - 중복되지 않은 속성 뿐만 아니라 속성과 속성을 묶은 쌍도 슈퍼키다

대리키 - surrogate key, artificial key , 긴급할 때 기본키 대용으로 쓰는 것  - rownum 같은 것

외래키 - 다른테이블이나 같은테이블(멘토의 경우)에서 참조하는 키

관계대수

프로젝션 - SELECT

셀렉션 - WHERE

 

데이터베이스 용어

 

출처

https://cafe.naver.com/busanit2018db

 

2020 부산 IT : 네이버 카페

부산IT 자바응용

cafe.naver.com

 

프로시저와 함수의 차이

프로시저 - 리턴값이 없는 함수

함수 - 리턴값이 없는 함수 (SELECT 와 FROM사이에 있는 모든 것)

DATE - 날짜계산 등 편하기 때문에 (+연산) 3월31일 +1일 = 4월 1일

SYSDATE - 시스템 시간을 가져옴

SYSTIMESTAMP - 더 정밀한 시스템 시간을 가져옴

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

 

 

'Database' 카테고리의 다른 글

데이터베이스 // 순위 매기기  (0) 2020.09.10
spring boot // 트랜잭션 격리수준  (0) 2020.07.27
20200427 ResultSet  (0) 2020.04.27

조인 - 

상관 서브 쿼리 - 주 쿼리부터 생각하고 서브쿼리를 이용한다

EXISTS - 조인과 비슷한 것이라고 생각하면서 사용 - 상관 서브 쿼리에서 주로 사용한다

 

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

데이터 베이스 모델링  (0) 2020.04.24
자바 데이터베이스에서 자료 가져오기  (0) 2020.04.22
오라클 예제 및 문제  (0) 2020.04.08
200408  (0) 2020.04.08
오라클 서브쿼리 문제  (0) 2020.04.03

환경

윈도우10 64비트
오라클 18C

 

 

 

 

 

 

시스템에서 아래 파일 쿼리를 실행한다

F5를 누르면 워크시트에 있는 모든 쿼리가 실행된다

 

12c_script.txt
0.00MB

 

새로운 유저를 만든다 아이디 비번모두 c##madang

테스트 - 저장 - 접속

 

 

 

문제

-- 도서번호가 1인 도서의 이름
SELECT bookname
FROM BOOK
WHERE BOOKID = 1;

-- 가격이 20000원 이상인 도서의 이름
SELECT bookname
FROM BOOK
WHERE PRICE >= 20000;

-- 박지성의 총 구매액
SELECT SUM(SALEPRICE)
FROM ORDERS
WHERE CUSTID = 
(   
    SELECT CUSTID
    FROM customer
    WHERE name = '박지성'
);

-- 박지성의 총 구매액 다른방법
SELECT SUM(SALEPRICE)
FROM CUSTOMER, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID AND NAME LIKE '박지성';


-- 박지성이 구매한 도서의 수
SELECT COUNT(ROWNUM)
FROM ORDERS
WHERE CUSTID = 
(   
    SELECT CUSTID
    FROM customer
    WHERE name = '박지성'
);

-- 박지성이 구매한 도서의 수 다른방법
SELECT COUNT(*)
FROM CUSTOMER, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID AND CUSTOMER.NAME LIKE '박지성';


-- 도서의 총개수
SELECT COUNT(*)
FROM BOOK;


-- 출판사의 총개수
SELECT COUNT(DISTINCT publisher)
FROM BOOK;


-- 모든 고객의 이름 주소
SELECT NAME, ADDRESS
FROM customer;


-- 2014년 7월4일 ~ 7월7일 사이에 주문받은 도서의 주문번호
SELECT *
FROM ORDERS
WHERE ORDERDATE BETWEEN '14/07/04' AND '14/07/07';


-- 2014년 7월4일 ~ 7월7일 사이에 주문받은 도서를 제외한 도서의 주문번호
SELECT *
FROM ORDERS
WHERE ORDERDATE < '14/07/04' OR ORDERDATE > '14/07/07';


-- 성이 '김'씨인 고객의 이름과 주소
SELECT *
FROM customer
WHERE NAME LIKE '김%';


-- 성이 '김'씨이고 이름이 '아'로 끝나는 고객의 이름과 주소
SELECT *
FROM customer
WHERE NAME LIKE '김%아';

 

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

-- 박지성이 구매한 도서의 출판사 수
SELECT COUNT(DISTINCT b.publisher)
FROM (
    SELECT BOOKID
    FROM CUSTOMER C, ORDERS O
    WHERE c.custid = o.custid AND NAME = '박지성'
) A, BOOK B
WHERE a.bookid = b.bookid;


-- 박지성이 구매한 도서의 출판사 수 다른방법
SELECT COUNT(DISTINCT b.publisher)
FROM CUSTOMER C, ORDERS O, BOOK B
WHERE c.custid = O.CUSTID AND b.bookid = o.bookid AND NAME = '박지성';


-- 박지성이 구매한 도서의 이름, 가격, 정가와 판매가격의 차이
SELECT b.bookname, b.price, o.saleprice, (b.price - o.saleprice)
FROM BOOK B, customer C, ORDERS O
WHERE O.bookid = b.bookid AND o.custid = c.custid AND NAME = '박지성';


-- 박지성이 구매하지 않은 도서의 이름
SELECT DISTINCT BOOKNAME
FROM BOOK
WHERE BOOKID NOT IN (SELECT BOOKID
                    FROM customer C, ORDERS O
                    WHERE c.custid = O.CUSTID AND c.name = '박지성');


-- 박지성이 구매하지 않은 도서의 이름 다른방법1
SELECT DISTINCT BOOKNAME
FROM BOOK
WHERE NOT EXISTS (SELECT BOOKID
                    FROM customer C, ORDERS O
                    WHERE c.custid = O.CUSTID AND BOOK.BOOKID = O.BOOKID AND c.name = '박지성');


-- 박지성이 구매하지 않은 도서의 이름 다른방법2   
select bookname
from book
minus
select b.bookname 
from customer c , orders o , book b 
where c.custid = o.custid
    and o.bookid = b.bookid
    and name like '박지성';


-- 주문하지 않은 고객의 이름 (조인 사용)
SELECT NAME
FROM CUSTOMER
MINUS
SELECT DISTINCT NAME
FROM CUSTOMER C, ORDERS O, BOOK B
WHERE C.CUSTID = O.CUSTID AND B.BOOKID = O.BOOKID;


-- 주문하지 않은 고객의 이름 NOT IN
SELECT NAME
FROM CUSTOMER
WHERE CUSTID NOT IN (
                    SELECT CUSTID
                    FROM ORDERS
                    GROUP BY custid
                    );
                    
-- 주문하지 않은 고객의 이름 NOT EXISTS
SELECT NAME
FROM CUSTOMER
WHERE NOT EXISTS (
                SELECT CUSTID
                FROM ORDERS
                WHERE customer.custid = orders.custid
                );


-- 주문 금액의 총액과 주문의 평균 금액
SELECT SUM(SALEPRICE), AVG(SALEPRICE)
FROM ORDERS;


-- 고객의 이름과 고객별 구매액
SELECT C.NAME, SUM(o.saleprice)
FROM customer C, ORDERS O
WHERE C.CUSTID = O.CUSTID
GROUP BY C.NAME;


-- 고객의 이름과 고객이 구매한 도서 목록
SELECT c.name, b.bookname
FROM CUSTOMER C, ORDERS O, BOOK B
WHERE c.custid = o.custid AND B.BOOKID = O.BOOKID;


-- 도서의 가격(BOOK 테이블)과 판매가격(ORDERS 테이블)의 차이가 가장 많은 주문
SELECT *
FROM BOOK B, ORDERS O
WHERE b.bookid = o.BOOKid AND (B.PRICE - o.saleprice) = ( 
                                                        SELECT MAX(ABS(B.PRICE - o.saleprice))
                                                        FROM BOOK B, ORDERS O
                                                        WHERE b.bookid = o.BOOKid
                                                        );


-- 도서의 판매액 평균보다 자신의 구매액 평균이 더 높은 고객의 이름
SELECT C.NAME, AVG(o.saleprice)
FROM customer C, ORDERS O
WHERE c.custid = o.CUSTid
GROUP BY C.NAME
HAVING AVG(o.saleprice) > (
                            SELECT AVG(SALEPRICE)
                            FROM ORDERS
                            );

.

 

 

 

 

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

자바 데이터베이스에서 자료 가져오기  (0) 2020.04.22
200409  (0) 2020.04.09
200408  (0) 2020.04.08
오라클 서브쿼리 문제  (0) 2020.04.03
200402 // SYNONYM, VIEW, CRUD, 인덱스 INDEX, , 클러스터링  (0) 2020.04.02

캐싱

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

오라클은 한번 실행한 쿼리코드는 컴파일 하지 않는다(이미 컴파일 된 것으로 실행)

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

인덱스
자바 db연동
웹 db 연동
데이터베이스 설계 - 포트폴리오

https://cafe.naver.com/busanit2018db

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

DBMS = 계정(USER)

SYSTEM (ROOT)에서 "MADANG"

GRANT 

테이블생성

데이터입력

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

넓은 의미의 스키마 - 인덱스 패키지 시퀀스 테이블 등 모든 것(오브젝트, 객체)들을 포함

아래 모든 것들은 객체(오브젝트,객체,resource)

GRANT CONNECT, RESOURCE TO c##madang; -- connect 연결 , resource 자원(객체, 오브젝트)

계정안에서 resource 권한을 쓰도록하는것 RESOURCE

 

conn c##madang/c##madang;

관리자 -> c##madang 으로 이동

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

DCL - control
DML - manipulation
DDL - define

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

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

 

오라클 자체 명령어

좁은 의미의 스키마 - 칼럼명(열이름)

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

DISTINCT 는 SELECT에 한번만 적으면 모든 레코드(행)의 중복을 모두 없앤다

단항연산자 NOT 

문자열은  = 보다 LIKE를 사용하는게 관례

% 아무거나 여러개

'%김%' ->앞에 갯수상관없이 아무거나(0개도 가능) 중간에 김, 뒷쪽에 갯수상관없이 아무거나

'_김%' -> 첫글자 아무거나 두번째 김 나머지 아무거나

ORDER BY 는 성능을 많이 잡아먹는다(느리다) -> 인덱스를 이용해서 전처리해야함

AS "별칭" - 앨리어스

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

 

스칼라 서브쿼리

1. 드라이빙 테이블은 무조건 풀스캔
2. 드리븐 테이블이 PK가 아니면 스칼라 서브쿼리 사용금지
3. 드리븐 테이블의 내용이 커질 것으로 예상 된다면 안쓰는 것이 좋다
- LEFT OUTER JOIN으로 바꿔서 이용하는 것이 좋다

드리븐 테이블이 작으면 작을수록 성능이좋다

SELECT ID, TITLE, (SELECT COUNT(*) FROM REPLY WHERE BOARDID = B.ID) 
FROM BOARD B;

WHERE BOARDID = B.ID

BOARDID는 드라이빙 테이블 - 모두 읽는다(FULL SCAN)

B.ID는 드리븐 테이블 - 프라이머리 키이기 때문에 일치하면 검색멈춤

 

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

프라이머리키 테이블에 하나씩

프라이머리키가 있는 테이블을 먼저 생성해야한다

외래키(참조) - 원본테이블에 있는 프라이머리키가 있어야만 갖고오는 것

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

 

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

200409  (0) 2020.04.09
오라클 예제 및 문제  (0) 2020.04.08
오라클 서브쿼리 문제  (0) 2020.04.03
200402 // SYNONYM, VIEW, CRUD, 인덱스 INDEX, , 클러스터링  (0) 2020.04.02
오라클 서브쿼리, IN, EXISTS 차이  (0) 2020.04.02

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

+ Recent posts