SELECT
    orderid, saleprice
FROM orders
WHERE saleprice > ALL(SELECT saleprice
                        FROM orders
                        WHERE custid='3');

ALL은 부속질의에 나온 값 모든 것들을 말한다

위의 코드에서는 모든 값들보다 큰 값을 걸러내는 것( and와 비슷 )

 

SELECT
    orderid, saleprice
FROM orders
WHERE saleprice > SOME(SELECT saleprice
                        FROM orders
                        WHERE custid='3');

 

SOME은 부속질의에 나온 값 중 하나의 조건만 만족해도 되는 것을 말한다(or과 비슷하다)

 

 

 

 

 

 

 

 

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

200507  (0) 2020.05.07
200506  (0) 2020.05.06
데이터베이스 무결성  (0) 2020.04.27
데이터 베이스 모델링  (0) 2020.04.24
자바 데이터베이스에서 자료 가져오기  (0) 2020.04.22

null 무결성 : null을 넣으면 안되는 것

참조 무결성 : 외래키 값은 null 이거나 참조 릴레이션의 기본키 값과 동일해야함

기본키 무결성 : 레코드에는 기본키를 하나만 가져야됨

도메인 무결성 : 남 녀 등 제한되어있는 데이터만 가져야함

유니크 무결성 : 중복되지 않은 자료를 넣는 것

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

200506  (0) 2020.05.06
데이터베이스 ALL, SOME  (0) 2020.05.06
데이터 베이스 모델링  (0) 2020.04.24
자바 데이터베이스에서 자료 가져오기  (0) 2020.04.22
200409  (0) 2020.04.09

데이터 베이스의 속성

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

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

조인 - 

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

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;

 

 

 

 

 

+ Recent posts