10회차 데이터베이스 | 데이터베이스 개요 및 쿼리 내용 정리

728x90
데이터 베이스 기본 개념
쿼리

데이터 베이스 기본 개념

1) 데이터베이스 (DB) 개념

  • 일정한 규칙으로 구조화되어 저장된 데이터의 모음

데이터베이스와 DBMS 구조

[ 데이터베이스의 특징 ] (4)
1) 실시간 접근성
실시간 처리에 대한 응답 가능
2) 지속적인 변화
데이터베이스 상태가 동적이다.즉, 새 데이터 삽입/삭제/갱신 등 항상 최신의 데이터를 유지한다.
3) 동시 공유
다수의 사용자가 동시에 같은 내용의 데이터 이용 가능
4) 내용에 따른 참조
데이터베이스에 있는 데이터 참조 시 사용자가 요구하는 데이터 내용 기준 찾음 </aside>

2) 데이터베이스의 종류

RDBMS와 NoSQL 구조 비교

(1) 관계형 데이터베이스 | RDBMS

: 모든 데이터를 2차원 테이블 형태 (행과 열)로 데이터 저장하는 데이터 베이스

: 테이블 형태로 데이터 관리

: SQL 언어 사용하여 데이터 조작 | (SQL : Structured Query Language)

        ex. MySQL, Oracle

  장점 : 스키마에 맞춰 데이터 관리하므로 ‘데이터 정합성’ 보장

  단점 : 시스템 커질수록 쿼리 복잡해져 성능 저하됨 (Scale-out 어렵고, Scale-up만 가능)

(2) NoSQL 데이터베이스 | Not Only SQL

: 데이터 간의 관계를 정의하지 않아 스키마 없이 자유롭게 데이터 관리하는 데이터베이스

: 컬렉션 형태로 데이터 관리

: SQL을 사용하지 않는 데이터베이스

         ex. MongoDB, redis

  장점 : 스키마 없이 Key-value 형태로 데이터 관리하니 자유롭다.

  단점 : 데이터 중복 발생하며, 중복된 데이터 변경 시 수정을 모든 컬렉션에서 수행해야 한다.

        스키마 존재하지 않아서 명확한 데이터 구조 보장하지 않아 데이터 구조 결정 어려울 수 있다.

❓ 그렇다면 RDBMS와 NoSQL은 각각 어느 경우에 적합한가 ?
RDBMS : 데이터 구조 명확하고 데이터의 일관성, 신뢰도 보장이 우선일 때 사용 권장
→ 데이터 변경 자주 일어나는 시스템에 적합, 정형화된 데이터에 적합

NoSQL : 정확한 데이터 구조 알 수 없고 데이터 처리 속도나 유연성, 확장성 우선일 때 사용 권장
→ 데이터 중복/수정 많이 일어나지 않는 시스템에 적합, 비정형화된 데이터에 적합
→ Scale-out 가능하다는 장점 O 확장성 중요하고 DB를 Scale-out 해야 하는 시스템에 적합
릴레이션 (relation)
→ 관계형 DB 의 릴레이션 = ‘테이블’
→ NoSQL DB의 릴레이션 = ‘컬렉션’

3) 데이터베이스의 무결성 제약 조건

  • 즉, 데이터의 정확성,일관성 보장하기 위해 (저장/삭제/수정)에 제약하는 조건이다.

1) 개체 무결성 (Entity Integrity)

  • 각 릴레이션의 기본키 PK는 중복X, NULL X
  • 각 릴레이션 당 하나의 PK는 존재해야 한다.

2) 참조 무결성 (Referential Integrity)

  • 외래키값은 NULL이거나 참조 중인 릴레이션의 PK값과 일치해야 한다.
  • 이로써 외래키의 무결성을 보장한다.

3) 도메인 무결성 (Attribute Integrity)

  • 속성들의 값은 정의된 도메인에 속한 값이어야 한다.

→ 그 중에서도 관계형 DB를 더 자세히 보자.

[관계형 데이터베이스의 구성]

관계형 DB의 테이블 구조

1) 엔티티 | Entity

  • 자체로 여러 개 속성을 지니는 명사
  • ex. 회원 Entity → 속성(id, 이름, 주소)

2) 릴레이션 | relation (=테이블)

  • 관계형 DB의 릴레이션 = 행과 열로 구성된 테이블 의미
  • 엔티티에 관한 속성 데이터들을 DB 상 한 릴레이션에 정보 구분하여 저장/관리
  • 한 엔티티에 대한 하나의 릴레이션 테이블 구성함
  • 릴레이션 = (스키마 + 인스턴스) 조합

3) 스키마

  • 테이블의 헤더 부분
  • 릴레이션의 기본 구조 뼈대 정의된 부분

4) 인스턴스

  • 테이블 상의 실질적인 데이터 집합들

   (a) 속성 | Attribute
- 릴레이션 테이블 상의 열 부분 ex. 성별
- 도메인 : 각 속성이 가질 수 있는 값의 범위 ex. 성별 = {남성, 여성}
- 차수 : 속성의 전체 개수 (잘 안변함)
   (b) 튜플 | Tuple
- 릴레이션 테이블 상의 행 부분 - 카디널리티 : 튜플의 전체 개수 (잘 변함)


→ 여러 테이블들의 관계를 보자.

[테이블 간의 관계]

  • 데이터베이스에는 여러 개의 테이블이 존재하고, 테이블 간에는 서로의 관계가 정의되어 있다.

1) 1:1 관계

하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우

이 구조에선 한 사용자는 하나의 전화번호를 갖고, 반대도 동일한 관계를 가지므로 1:1 관계이다.

1대 1관계

2) 1:N 관계

하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우

이 구조에선 한 사용자가 여러 개의 전화번호를 가질 수 있지만, 여러 명의 사용자가 하나의 번호는 가질 수 없는 구조이다. (반대는 안되는 구조)

1대 N 관계

3) N:M 관계

여러 개의 레코드가 다른 테이블의 여러 개 레코드와 관련있는 경우

  • 보통 두 테이블 직접 연결 X. 각 테이블의 PK를 FK로 참조하고 있는 (매핑(연결) 테이블) 사용함
  • 즉, 양쪽 두 테이블과 1:N 관계 형성하는 새로운 테이블로 N:M 관계를 나타낸다.

ex. 학생이 여러 강의를 수강하지만, 강의도 여러 학생을 수용한다.

N대 M 관계

키 | Key (슈퍼키, 후보키, 기본키, 외래키, 대체키)

  • 정의 : 릴레이션에서 특정 튜플(Tuple) 식별 시 사용하는 속성(Attribute) 집합이다.
  • 각 튜플 유일 식별 장치
  • 릴레이션 간의 관계 알려주는 장치

키 소속 다이어그램

[키의 종류]
1) 슈퍼키
각 행을 유일하게 식별할 수 있는 속성들의 집합유일성만 만족하면 모두 슈퍼키
2) 후보키
각 행 유일하게 식별할 수 있는 최소한의 속성 집합기본키 될 수 있는 여러 후보키 (유일성, 최소성 동시 만족 키)
3) 기본키 PK
여러 후보키 中 선정된 대표키Null 값 가질 수 없고, 중복 안되고, 테이블 당 1개의 PK만 존재
→ 인조키(대리키) : 기본키 마땅한 속성 없을 때, 일련번호 인위적 생성한 기본키
→ 자연키 : 여러 속성 중 중복 X 자연스레 뽑아나온 기본키
4) 외래키 FK
다른 테이블의 기본키를 참조 or 자기 자신 PK를 참조하는 참조키Null 값 가질 수 있고, 테이블 당 여러 개 FK 존재 가능개체 간 관계 식별 시 사용 多
5) 대체키
후보키들 중 기본키로 선정되지 않은 후보키들

데이터 베이스 쿼리 | SQL

  • SQL 에는 데이터 정의어(DDL), 데이터 조작어 (DML), 데이터 제어어 (DCL) 로 나뉜다.
  • DBMS는 SQL문 해석하고 프로그램으로 변환하여 실행한 후 결과를 알려준다.

1) DDL 정의어 | Definition

  • 테이블 구조 생성,수정,삭제
  • CREATE, ALTER, DROP

2) DML 조작어 | Manipulaion

  • 테이블 내의 대상 데이터 검색/삽입/수정/삭제

3) DCL 제어어 | Control

  • 데이터 무결성 유지, 데이터 사용 권한 관리
  • commit, rollback, grank, revoke 등

⬛ 데이터 조작어 (검색/삽입/수정/삭제)

데이터 검색 : SELECT 문 (= 질의어)

SELECT [ALL | DISTINCT] 속성리스트
FROM 테이블리스트
[WHERE 조건]
[GROUP BY 속성리스트 [HAVING 조건]]
[ORDER BY 속성리스트 [ASC | DESC]]

데이터 삽입 : INSERT 문

기존 테이블에 새 튜플(행) 추가하는 명령어

INSERT INTO 테이블이름(속성 리스트)
VALUES (값 리스트);

데이터 수정 : UPDATE 문

UPDATE 테이블이름
SET 속성1=속성값1, 속성2=속성값2, ...
[WHERE 조건];

데이터 삭제 : DELETE 문

DELETE
FROM 테이블이름
[WHERE 조건];

→ 이 중 ‘데이터 검색’에 해당하는 SQL 질의와 관련한 전반 문법을 정리했다.

1. 기본 검색

(1) 기본 검색

ex. 모든 도서의 이름, 가격 검색하시오

SELECT bookname, price
FROM Book;

(2) 중복 제거 | DISTINCT 키워드

ex. 도서 테이블에 있는 모든 출판사 (중복 없이) 검색하시오.

SELECT DISTINCT publisher
FROM Book;

2. 조건 검색 | WHERE 조건

  • 조건에 맞는 검색을 위해 WHERE 절사용

WHERE 조건 연산자

 (1) 단순 비교 | =, <, >, ≤, ≥

ex. 가격이 20,000원 미만인 도서 검색하시오.

SELECT *
FROM Book
WHERE price <= 20000;

 (2) 범위 | BETWEEN 연산자

ex. 가격이 10,000원 이상 20,000이하인 도서 검색하시오.

SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000;
//= (WHERE price >= 10000 AND price <= 20000); 

 (3) 집합 | IN 연산자, NOT IN 연산자

  • WHERE 절에서 같은 속성 내부에 여러 값 비교 시 적합

ex. 출판사가 ‘굿스포츠’ 혹은 ‘대한미디어’인 도서 검색하시오 | IN 연산자

SELECT * 
FROM Book
WHERE publisher IN ('굿스포츠', '대한미디어');

ex. 출판사가 ‘굿스포츠’ 혹은 ‘대한미디어’가 아닌 도서 검색하시오 | OUT 연산자

SELECT *
FROM Book
WHERE publicher NOT IN ('굿스포츠', '대한미디어');

 (4) 문자열 패턴 비교 | LIKE 연산자

문자열 LIKE에 활용하는 와일드 문자 종류

ex. “축구의 역사”를 출간한 출판사 검색하시오

SELECT bookname, publisher
FROM Book
WHERE bookname LIKE '축구의 역사';

→ 일부 문자열 포함한 비교 | LIKE ‘%문자%’

ex. 도서 이름에 ‘축구’가 포함된 출판사 검색하시오

SELECT bookname, publisher
FROM Book
WHERE bookname LIKE '%축구%';

→ 특정 위치 한 문자 대신 비교 | (_) 밑줄 문자

ex. 도서 이름 왼쪽 두 번째 위치에 ‘구’ 포함하는 도서 검색하시오

SELECT *
FROM Book
WHERE bookname LIKE '_구%';

 (5) 복합 조건 검색 | 논리 연산자 (AND, OR, NOT)

→ AND

ex. 축구에 관한 도서 중에서 가격이 20,000원 이상인 도서 검색하시오

SELECT *
FROM Book
WHERE bookname LIKE '%축구%' AND price >= 20000;

→ OR

ex. 출판사가 ‘굿스포츠’ 혹은 ‘대한미디어’인 도서 검색하시오

SELECT *
FROM BOok
WHERE publisher = '굿스포츠' OR publisher = '대한미디어';

 (6) 검색 결과의 정렬 | ORDER BY절

  • 특정 순서대로 결과를 출력할 때 사용

→ ORDER BY : 기본 오름차순 ASC 이다. (내림차순 DESC 키워드 사용해야 함)

ex. 도서를 이름 순으로 검색하시오.

SELECT * 
FROM Book
ORDER BY bookname;

ex. 도서를 가격 순으로 검색하고, 가격이 같으면 이름순으로 검색하시오.

SELECT *
FROM Book
ORDER BY price, bookname;

ex. 도서를 가격 내림차순으로 검색하는데, 가격이 같다면 출판사 이름 오름차순으로 출력하시오.

SELECT *
FROM Book
ORDER BY price DESC, publisher ASC;

 

3. 집계 함수의 사용

집계함수 종류

 (1) SUM

ex. 2번 고객이 주문한 도서의 총판매액을 출력하고, 별칭은 ‘총매출’로 출력하시오

SELECT SUM(saleprice) AS 총매출 **//속성 이름 별칭 지칭 키워드** 
FROM Orders
WHERE custid = 2;

 (2) AVG, MIN, MAX

ex. 고객이 주문한 도서의 (총판매액, 평균값, 최저가, 최고가)를 구하시오

SELECT SUM(saleprice) AS Total,
			 AVG(saleprice) AS Average,
			 MIN(saleprice) AS Minimum,
			 MAX(saleprice) AS Maximum
FROM Orders;

 (3) COUNT | 행의 개수 센다.

ex. 마당서점의 도서 판매 건수를 구하시오.

SELECT COUNT(*)
FROM Orders;

ex. 마당서점의 (중복 제거)하여 출판사 수를 구하시오

SELECT COUNT (DISTINCT(publisher)),
FROM Book;

 (4) Group By 절 | 그룹화 시킴 (-별로)

ex. 고객별로 주문한 도서의 총수량과 총판매액을 구하시오.

→ 각 고객 id별로 (주문한 총수량, 총판매액) 구해짐

SELECT custid, COUNT(*) AS 도서수량, SUM(saleprice) AS 총액
FROM Orders
GROUP BY custid;

 (5) HAVING 절 | GROUP BY 로 그룹화한 것에 대한 조건 표시

  • HAVING은 조건절이라 WHERE 뒤에 있어야 하고,
  • 검색 조건에는 (집계 함수) 와야 함 | SUM, COUNT, MAX, MIN, COUNT 등

ex. 가격 8000원 이상인 도서를 구매한 고객에 대하여, 고객별 주문 도서의 총수량을 구하시오.

(단, 2권 이상 구매한 고객만 구하시오.)

SELECT custid, COUNT(*) AS 도서수량 
FROM Orders
WHERE saleprice>=8000 
GROUP BY custid 
HAVING count(*) >=2;

[여러 개 테이블에 대한 SQL 질의] : 조인, 부속 질의

4. 조인 검색

여러 개의 테이블을 단일 테이블로 만드는 연산

  • 이 때, 여러 개의 테이블을 연결할 수 있는 ‘속성’이 필요하다. (= 조인 속성)
  • 조인 속성의 이름은 달라도 되지만, 도메인은 같아야 한다.
  • 일반적으로 FK(외래키)를 조인 속성으로 이용한다.

🎈 아래처럼 Customer, Book, Orders 테이블 3개가 존재한다고 가정하고 설명한다.

Customer, Book, Order 테이블

⬛ 내부 조인 | inner Join (교집합) 조인

  • 기준 테이블과 JOIN 테이블의 중복된 값을 보여주는 조인

1) 동등 조인 : 동등 조건을 기준 조인

ex. 고객 이름과 고객이 주문한 도서의 판매 가격을 검색하시오.

//고객 이름 = Customer, 고객의 주문 정보 = Orders에 있음

SELECT name, saleprice
FROM Customer, Orders
WHERE Customer.custid = Orders.custid; //동등 조인

ex. 고객별로 주문한 모든 도서의 총판매액을 구하고, 고객별로 정렬하시오.

SELECT name, SUM(saleprice) //이름, 총판매액
FROM Customer, Orders
WHERE Customer.custid = Orders.custid //테이블 조인
GROUP BY Customer.name //고객별
ORDER BY Customer.name; //정렬 

ex. 가격이 20,000원인 도서를 주문한 고객의 이름과 도서의 이름을 구하시오.

//고객 주문 정보는 Orders 에 있지만

고객 이름과 책 이름이 각각 Customers, Book 에 있기 때문에

총 3개의 테이블을 조인해야 한다.이때 Orders의 FK에 각각의 PK를 매핑시켜 조인한다.

SELECT Customer.name, Book.bookname
FROM Customer, Orders, Book
WHERE Customer.custid = Orders.custid AND Orders.bookid = Book.bookid 
		AND Book.price = 20000;

2) INNER JOIN 활용 문법

INNER JOIN 결과

SELECT * 
FROM TableA A 
INNER JOIN TableB B 
ON A.key = B.key

⬛ 외부 조인

  • 두 테이블 중 한쪽에만 데이터 있어도 나온다.
  • 조인 후 해당 항목 없으면 NULL 로 표시됨

1) LEFT OUTER JOIN

  • 왼쪽 테이블 기준으로 JOIN 모든 값 보여주고, (오른쪽 테이블은 공통된 값 있는 것만 보여줌)

→ 따라서, 오른쪽 테이블에 매핑된 값 없을 경우 NULL로 채움

LEFT OUTER JOIN

SELECT * 
FROM TableA A
LEFT JOIN TableB B 
ON A.key = B.key

ex. 도서 구매하지 않은 고객 포함하여 고객 이름과 고객이 주문한 판매 가격 구하시오.

SELECT Customer.name, saleprice
FROM Customer LEFT OUTER JOIN Orders 
ON Customer.custid = Orders.custid;

2) RIGHT OUTER JOIN

  • 오른쪽 테이블 기준으로 JOIN  모든 값 보여주되 (왼쪽 테이블은 공통된 값 있는 것만 보여줌)

→ 따라서, 왼쪽 테이블에 매핑되는 값 없을 경우 NULL로 채움

RIGHT OUTER JOIN

SELECT * FROM TableA A
RIGHT JOIN TableB B ON
A.key = B.key

3) FULL OUTER JOIN

  • 왼쪽과 오른쪽 테이블 합칩합
  • 두 테이블의 모든 값들을 보여줌

FULL OUTER JOIN

SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON
A.key = B.key

4) FULL ONLY OUTER JOIN

  • 교집합 제외 FULL
  • 두 테이블의 공통된 부분 제외하고 보여줌
SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON
A.key = B.key WHERE A.key IS NULL
OR B.key IS NULL

⬛ 추가 조인

1) CROSS JOIN

크로스 조인

모든 경우의 수를 전부 표현해주는 방식이다.

A가 3개, B가 4개면 총 3*4 = 12개의 데이터가 검색된다.

SELECT
A.NAME, B.AGE
FROM EX_TABLE A
CROSS JOIN JOIN_TABLE B

2) SELF JOIN

  • 자기 자신과 조인
  • 하나의 테이블을 여러번 복사해서 조인한다고 생각하면 편하다.
  • 자신이 갖고 있는 칼럼을 다양하게 변형시켜 활용할 때 사용한다.
SELECT
A.NAME, B.AGE
FROM EX_TABLE A, EX_TABLE B

3) 자연 조인

  • 동등 조인에서 조인에 참여한 속성들 중 (중복 속성) 제거한 결과 반환

4) 세미 조인

  • 자연조인 한 후 두 릴레이션 중 한쪽 릴레이션의 결과만 반환

5. 부속 질의 이용한 [검색]

  • 부속 질의 = SQL문 안에 다른 SQL문이 중첩된 질의

→ 부속 질의를 활용한 데이터 검색

: WHERE 절에 또 다른 테이블 결과를 이용하려고 다시 SELECT 문을 괄호로 묶는다.

  • 1) 부속 질의 먼저 처리 → 2) 전체 질의 처리

ex. 가장 비싼 도서의 이름을 보이시오.

//모두 Book 테이블 상에 있지만, 가장 비싼 가격에 해당하는 책 이름을 추출해야 한다.

→ ‘가장 비싼 가격’ 찾기 위해 부속 질의 처리 후, 그 값에 해당하는 bookname을 추출함

SELECT bookname
FROM Book
WHERE price = (SELECT MAX(price) FROM Book);

❓ 조인 vs 부속 질의

→ 일반적으로 여러 테이블 연관 시킬 때 데이터 대량인 경우,

    데이터를 모두 합치는 조인 보다는 필요한 데이터만 찾아서 공급해주는 부속 질의 성능이 더 좋다.

1) 조인 사용 : Customer 테이블과 Orders 테이블을 고객 번호로 조인한 후→ 필요 데이터 추출]

    즉, 조인은 모두 합친 뒤 필요 데이터를 추출한다.

2) 부속 질의 사용 : Customer 테이블에서 박지성 고객의 고객번호 (일부) 찾고, 찾은 고객 번호 바탕으로 Orders 테이블에서 확인

  즉, 부속 질의는 애초에 필요한 데이터 추출  한 뒤, 원하는 데이터 재추출


6. 여러 테이블 간의 집합 연산 | 교집합, 합집합, 차집합

  1. 교집합 | INTERSECT
  2. 합집합 | UNION
  3. 차집합 | MINUS

ex. 도서 주문하지 않은 고객의 이름을 보이시오.

// 모든 고객 - (주문한 고객) = 주문하지 않은 고객

SELECT name
FROM Customer
MINUS // 빼기 
SELECT name
FROM Customer
WHERE custid IN (SELECT custid FROM Orders);

7. EXISTS | 상관 부속질의문

  • 조건에 맞는 투플이 존재하면 결과에 포함시킨다.

ex. 주문이 있는 고객의 이름과 주소를 보이시오.

SELECT name, address
FROM Customer ct
WHERE EXISTS (SELECT * FROM Orders od WHERE cs.custid = od.custid);

[추가] SELECT 쿼리의 수행 순서

FROM 보고, WHERE 조건 보고, GROUP BY 보고, HAVING 보고, SELECT 한 상태에서, ORDER BY 함

   FROM, ON, JOIN 
   >> WHERE, GROUP BY, HAVING 
   >> SELECT 
   >> DISTINCT 
   >> ORDER BY
   >> LIMIT

⬛ 데이터 정의어 (테이블 생성/변경/삭제)

  • 테이블의 구조를 정의

1) 테이블 생성 | CREATE 문

  • PK 지정
CREATE TABLE 테이블 이름[(속성리스트)]
AS SELECT 문
[WITH CHECK OPTION];

//예시
CREATE TABLE NewBook (
	bookid     NUMBER,
	bookname   VARCHAR(20),
	publisher  VARCHAR(20),
	price      NUMBER,
	PRIMARY KEY (bookid)); //PK 지정

2) 테이블 수정 | ALTER 문

이미 생성된 테이블의 속성 변경이나 제약을 변경

ALTER TABLE 테이블이름
	[ADD] 속성 추가 
	[DROM COLUMN] 속성 제거 
	[ALTER COLUMN] 속성 대체
	[ALTER COLUMN] 속성이름 NULL/NOT NULL
	[ADD PRIMERY KEY] 기본키 추가
	[ADD | DROP] 제약사항 추가 /삭제

3) 테이블 전체 삭제 | DROP문

데이터만 삭제하고 싶으면 DELETE문 사용

테이블 전체 삭제는 DROP문

DROP TABLE 테이블이름;

⬛ SQL 내장 함수

1. 숫자 함수

1) 절댓값 함수 : ABS 함수

ex. -78과 78의 절댓값 구하시오.

SELECT ABS(-78), ABS(+78)
FROM Dual;

2) 반올림 함수 : ROUND 함수

ex. 4.753을 소수 첫째 자리에서 반올림한 값을 구하시오.

SELECT ROUND(4.753, 1)
FROM Dual;

→ 함수를 복합적으로 사용도 가능

ex. 고객별 평균 주문 금액을 백 원 단위로 반올림한 값을 구하시오.

//속성 옆에 “열이름” 지정하면 속성 이름 변경되어 출력된다.

//또한, ROUND 함수 -2로 지정되면 백원 단위의 반올림이 된다.

SELECT custid "고객번호", ROUND( SUM(saleprice) /COUNT(*), -2) "평균금액"
FROM Orders
GROUP BY custid;  

2. 문자 함수

  • 문자열 가공한 결과 반환

1) 데이터 문자열 치환하는 함수 : REPLACE 함수

ex. 도서 제목에 ‘야구’가 포함된 도서를 ‘농구’로 변경한 후 도서 목록을 보이시오.

SELECT bookid, REPLACE(bookname, '야구', '농구') bookname, publisher, price
FROM Book;

//REPLACE 함수는 bookname 속성에 있는 ‘야구’ → ‘농구’ 이름 치환시키고 
//속성명을 bookname으로 재지정했다.

2) 글자 수 세기 | LENGTH 함수

  • 글자 수 센다. cf. 바이트 수 세기 (LENGTHB 함수)
  • 공백도 하나의 문자로 간주하여 센다.

ex. ‘굿스포츠’에서 출판한 도서 제목과 제목의 글자 수, 바이트 수 보이시오.

SELECT bookname "제목", LENGTH(bokname) "글자수", LENGTHB (bookname) "바이트수"
FROM Book
WHERE publisher = '굿스포츠';

3) 문자열 특정 위치에서 시작하여 지정 길이만큼 문자열 반환 | SUBSTR 함수

  • substring 준말

ex. 마당서점 고객 중 같은 ‘성씨’ 가진 사람 몇 명인지 성별 인원 수 구하시오.

SELECT SUBSTR(name, 1,1) "성", COUNT(*) "인원"
FROM Customer
GROUP BY SUBSTR(name, 1, 1);

3. 날짜/시간 함수

 (1) TO_DATE 함수 | 문자형 데이터 → DATE 형으로 반환

 (2) TO_CHAR 함수 | DATE 형 데이터 → 문자형 데이터로 반환

 (3) 날짜형 대상 +, - 연산

→ 원하는 날짜 이전(-), 이후(+) 계산 가능

ex/ 2020년 7월 1일의 5일 전, 5일 후는 다음과 같이 구할 수 있다.

SELECT TO_DATE('2020-07-01', 'yyyy-mm-dd') - 5 BEFORE,
	   TO_DATE('2020-07-01', 'yyyy-mm-dd') + 5 BEFORE,

 (4) 현재 날짜 출력 함수 | SYSDATE 함수, SYSTIMESTAMP 함수

→ SYSDATE 함수 : 현재 날짜 시간 반환

→ SYSTIMESTAMP 함수 : 현재 날짜, 시간, 초 이하의 시간, 서버 TIMEZONE 출력

4. NULL값 처리

1) NULL 여부 확인 | IS NULL, IS NOT NULL

  • null인 데이터나 null이 아닌 데이터 추출 시 활용

2) NVL 함수

  • null 데이터를 다른 임의의 값으로 대체함
  • NVL (속성, 대체값) ;/ /해당 속성에 있는 null 데이터를 대체값으로 출력

[추가] 부속 질의

  • 부속 질의는 SQL문 안에 다른 SQL문이 중첩된 질의
  • 부속 질의 위치와 역할에 따라 SELECT 부속질의/ FROM 부속질의/WHERE 부속질의 구분

1) 스칼라 부속 질의 | SELECT 부속 질의

  • 부속 질의가 SELECT 절에서 사용됨
  • 단일값 반환하기 위해 사용하기 때문에 스칼라 부속 질의라고 한다.

ex. 고객별 판매액을 보이시오. (고객이름과 고객별 판매액 출력)

SELECT (SELECT name FROM Customer cs 
 		WHERE cs.custid = od.custid) "name", SUM(saleprice) "total"
FROM Orders od
GROUP BY od.custid;

2) 인라인 뷰 | FROM 부속 질의

  • 부속 질의가 FROM 절에서 사용됨
  • 결과를 뷰의 형태로 반환하기 때문에 인라인 뷰

뷰 : 전체 테이블의 일부만 보여준다. 기존테이블에서 일시적으로 만들어진 가상 테이블 의미

ex. 고객번호가 2 이하인 고객의 판매액을 보이시오. (고객이름, 고객별 판매액 출력)

SELECT cs.name, SUM(od.saleprice) "total"
FROM (SELECT custid, name
			FROM Customer
			WHERE custid <=2) cs,  Orders od
WHERE cs.custid = od.custid
GROUP BY cs.name;

3) 중첩 질의 | WHERE 부속 질의

  • 부속 질의가 WHERE 절에서 사용됨
  • 결과 한정시키기 위해 사용한다.

ex. 평균 주문 금액 이하의 주문에 대해서 주문번호와 금액 보이시오.

SELECT orderid, saleprice //주문번호, 금액 뽑음
FROM Orders
WHERE saleprice <= (SELECT AVG(saleprice) //평균 이하의 주문 금액에서 
		           FROM Orders);

[추가] 조인의 원리

  • 조인의 원리는 중첩 루프 조인/정렬 병합 조인/해시 조인 등이 있다.

1) 중첩 루프 조인 (NLJ) Nested Loop Join

  • 중첩 for문과 같은 원리로 조건에 맞는 조인 하는 방법이다.
  • 랜덤 접근 시 비용 많이 증가하므로 대용량 테이블에서느 사용X

(첫 테이블 행을 한 번에 하나씩 읽고, 그 다음 테이블에서도 행을 하나씩 읽어 조건에 맞는 레코드 찾아 결과값 반환한다.)

for each row in t1 matching reference key {
		for each row in t2 matching reference key {
				if row satisfies join conditions, send to client 
		}
}

2) 정렬 병합 조인

  • 각각의 테이블을 조인할 필드 기준으로 정렬하고, 정렬 끝난 이후 조인 작업 수행하는 조인

3) 해시 조인

  • 해시 테이블 기반으로 조인하는 방법
  • 보통 중첩 루프 조인보다 효율적

[추가] 스키마의 정의 

* 스키마 : DB 구조와 제약조건에 관한 전반적 명세 기술한 것 

1. 외부 스키마 : 사용자가 보는 데이터 (사용자가 필요한 일부분 보여주는 뷰). 서브 스키마 = View (뷰)

2. 개념 스키마 : DB 전체 논리적 구조. 전체적인 뷰 (조직체 전체를 관장하는 입장에서 DB 정의한 것)

개념 스키마가 일반적인 DB 전체 테이블 상의 헤더 (스키마)를 의미한다고 함 (전체 DB 논리적 구조)

3. 내부 스키마 : 물리적인 저장장치(하드디스크) 상에서 DB가 저장되는 방법을 기술한 것 

스키마 분류

728x90