릴레이션
= 행과 열로 구성된 테이블 = 엔터티 = 개체(Entity)Domain
: 값들의 집합속성(attribute)
: 릴레이션 스키마의 열, 세로 값(컬럼)튜플(Tuple)
: 가로 값(행)도메인(domain)
: 하나의 속성이 가질 수 있는 값의 집합차수(degree)
: 속성의 개수카디널리티(Cardnality)
: 튜플의 개수인스턴스
= 외연: 정의된 스키마에 따라 테이블에 실제 저장된 데이터 값스키마
= 내포: 릴레이션이 어떻게 구성되는지, 어떤 정보를 저장하는 지에 대한 기본적인 구조,
로 안된다.같은 도메인 값
을 가진다.제약조건(constraints)
과 관계 연산을 위한 관계대수(relational algebra)
를 정의함.primary key(userid) unique + not null
);
고객번호
와 주민번호
를 포함한 모든 속성의 집합이 슈퍼키가 됨복합키(composite key)
라고 함--1) BOOK 테이블 bookid = 11 나머지 알아서 값을 입력하세요.
INSERT INTO BOOK VALUES(11, '역도의 기술', '굿스포츠', 80000);
--2) CUSTOMER 테이블 custid = 6 이름 기성용 나머지 알아서
INSERT INTO CUSTOMER VALUES(6, '기성용', '대한민국 서울' , '010-2034-4322');
-- 3) ORDERS 테이블에서 orderid=11 기성용 선수가 bookid=11 번인 책을 주문한 내용을 oprders 테이블
--적용
INSERT INTO ORDERS VALUES(11, 5, 11, 4000, '20/07/11');
commit;
-- 4) 고객 기성용이 주문한 내역 삭제하세요.
DELETE FROM ORDERS WHERE orderid = 11;
-- 5) BOOK테이블에서 bookid = 11 삭제
DELETE FROM BOOK WHERE bookid= 11;
-- 6) customer 테이블 custid = 6 삭제
DELETE FROM CUSTOMER WHERE CUSTID= 6;
commit;
-- 질의 3-15 고객이 주문한 도서의 총 판매액을 구하시오
-- 테이블 : orders 집계함수 : SUM(saleprice)
SELECT SUM(saleprice) AS 총판매액
FROM ORDERS;
-- 질의 3-16 2번 김연아 고객이 주문한 도서의 총 판매액을 구하시오.
SELECT SUM(saleprice) AS "김연아 고객의 총 판매액"
FROM ORDERS
WHERE custid=2;
-- 질의 3-17 고객이 주문한 도서의 총 판매액, 평균값, 최저가, 최고가를 구하시오.
-- 평균값 - AVG(), 최저가 - MIN(), 최고가 - MAX()
SELECT
SUM(saleprice) AS 총판매액,
AVG(saleprice) AS 평균값,
MIN(saleprice) AS 최저가,
MAX(saleprice) AS 최고가
FROM ORDERS;
-- 질의 3-18 마당서점의 도서 판매 건수를 구하시오.
-- 총 개수 - COUNT(속성)
SELECT COUNT(*) "총 판매 건수"
FROM ORDERS;
GROUP BY를 하게 되면 SELECT
에는 GROUP BY에서 지정한 속성과 집계함수만 올 수 있음
-- 질의 3-19 고객별로 주문한 도서의 총 수량과 총 판매액을 구하시오.
SELECT CUSTID,
COUNT(*) AS "주문한 도서의 총 수량",
SUM(saleprice) AS "총 판매액"
FROM ORDERS
GROUP BY custid;
-- 질의 3-20 가격이 8,000원 이상인 도서를 구매한 고객에 대하여 고객별 주문 도서의
-- 총 수량을 구하시오. 단, 두 권 이상 구매한 고객만 구한다.
-- GROUP BY를 하게 되면 SELECT에는 GROUP BY에서 한 속성과 집계함수만 올 수 있음
SELECT CUSTID,
COUNT(*) AS "주문한 도서의 총 수량"
FROM ORDERS
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >= 2;
조인(JOIN)
-- 질의 3-21 고객과 고객의 주문에 관한 데이터를 모두 보이시오.
SELECT *
FROM CUSTOMER, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID;
-- 질의 3-22 고객과 고객의 주문에 관한 데이터를 고객번호 순으로 정렬하여 보이시오.
SELECT *
FROM CUSTOMER, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID
ORDER BY customer.custid ASC;
-- 질의 3-23 고객의 이름과 고객이 주문한 도서의 판매가격을 검색하시오.
SELECT CUSTOMER.NAME "고객이름", ORDERS.SALEPRICE "고객이 주문한 도서"
FROM CUSTOMER, ORDERS
WHERE customer.custid = orders.orderid;
-- 질의 3-24 고객별로 주문한 모든 도서의 총 판매액을 구하고, 고객별로 정렬하시오.
SELECT CUSTOMER.NAME "이름", SUM(SALEPRICE)"총 판매액"
FROM CUSTOMER, ORDERS
WHERE customer.custid = orders.orderid
GROUP BY customer.name
ORDER BY customer.name;
-- 질의 3-25 고객의 이름과 고객이 주문한 도서의 이름을 구하시오.
SELECT CUSTOMER.NAME "이름", BOOK.BOOKNAME "도서이름"
FROM CUSTOMER, BOOK, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID AND ORDERS.BOOKID=BOOK.BOOKID
ORDER BY CUSTOMER.NAME;
-- 질의 3-26 가격이 20,000원인 도서를 주문한 고객의 이름과 도서의 이름을 구하시오.
SELECT CUSTOMER.NAME "이름", BOOK.BOOKNAME "도서이름"
FROM CUSTOMER, BOOK, ORDERS
WHERE CUSTOMER.CUSTID = ORDERS.CUSTID AND ORDERS.BOOKID=BOOK.BOOKID
AND book.price = 20000
order by customer.name;
-- INNER 조인
SELECT CUSTOMER.NAME "이름", BOOKID "도서이름"
FROM CUSTOMER inner join orders
ON CUSTOMER.CUSTID = ORDERS.CUSTID
order by customer.name;
-- 쫒아가기, 조인 없이 하자면-----------------------------
SELECT CUSTID, NAME
FROM CUSTOMER
WHERE NAME = '추신수';
SELECT CUSTID, BOOKID
FROM ORDERS
WHERE CUSTID = 4;
SELECT BOKKID, BOOKNAME
FROM BOOK
WHERE CUSTID = 7;
SELECT BOKKID, BOOKNAME, PRICE
FROM BOOK
WHERE CUSTID = 8;
--------------------------------------
---- 질의 3-27 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의
판매가격을 구하시오.
-- LEFT 조인은 NAME(왼쪽)은 완전 SALEPRICE(오른쪽)은 불완전
-- 1. 전용 표현
SELECT c.name, o.saleprice
FROM CUSTOMER c LEFT OUTER JOIN ORDERS o -- 별칭
ON c.custid = o.custid; -- 외부 조인
-- 2. 오라클 전용
SELECT NAME, saleprice
FROM CUSTOMER c, ORDERS o
WHERE c.custid = o.custid(+);
-- 오른쪽 조인
SELECT NAME, saleprice
FROM CUSTOMER c, ORDERS o
WHERE c.custid(+) = o.custid;
부속질의
SELECT 문의 WHERE절에 또 다른 테이블의 결과를 이용해서 SELECT문을 괄호로 묶어서 질의어의 결과를 제공 => 부속질의, SUBQUERY
서브 쿼리는 SQL문이다. SQL문의 결과는 테이블, 테이블 결과는 4 가지 중 한 개에 속함
단일행 - 단일열 * 단일열(1X1)
다중행 - 단일열 (NX1)
단일행 - 다중행 (1XN)
다중행 - 다중행 (NXN)
-- 질의 3-29 도서를 구매한 적이 있는 고객의 이름을 검색하시오. => 2. 다중행 - 단일열 (NX1)
-- 1.
SELECT DISTINCT CUSTID
FROM ORDERS;
-- 2.
SELECT NAME
FROM CUSTOMER
WHERE CUSTID IN(1, 2, 3, 4);
-- 3.
SELECT NAME
FROM CUSTOMER
WHERE CUSTID
IN(
SELECT DISTINCT CUSTID
FROM ORDERS);
-- 질의 3-30 대한미디어에서 출판한 도서를 구매한 고객의 이름을 보이시오.
SELECT BOOKID
FROM BOOK
WHERE PUBLISHER = '대한미디어';
SELECT CUSTID
FROM ORDERS
WHERE BOOKID IN(3,4);
SELECT NAME
FROM customer
WHERE CUSTID = 1;
SELECT NAME
FROM customer
WHERE CUSTID IN (
SELECT CUSTID
FROM ORDERS
WHERE BOOKID IN(SELECT BOOKID
FROM BOOK
WHERE PUBLISHER = '대한미디어'));
상위 부속질의의 투플을 이용하여 하위 부속 질의를 계산함.
상위 부속질의와 하위 부속질의가 독립적이지 않고 서로 관련을 맺고 있음.
-- 질의 3-31 출판사별로 출판사의 평균 도서 가격보다 비싼 도서이름를 구하시오.
SELECT b.publisher, AVG(b.price)
FROM book b
GROUP BY b.publisher;
SELECT b1.BOOKNAME, b1.price
FROM book b1
WHERE b1.price > (
SELECT AVG(b2.price)
FROM BOOK b2 -- 튜플 변수 : 테이블 이름이 길거나 한 개의 테이블을 구분하기 위해 별칭을 붙여 사용
WHERE b2.publisher = b1.publisher
-- BOOK b2 = new BOOK(); b2에는 BOOKID, BOOKNAME, PUBLISHER, PRICE 등이 있음
);
조인
으로 부속질의어가 할 수 있는 모든 작업이 가능-- 1. ROUND(숫자, [반올림 위치 0 : 소스첫째자리, 정수로 갈 수록 -1씩 작아진다. 소수 아래 +1])
SELECT ROUND(1234.5678) AS ROUND,
ROUND(1234.5678, 0) AS ROUND_0,
ROUND(1234.5678, 1) AS ROUND_1,
ROUND(1234.5678, 2) AS ROUND_2,
ROUND(1234.5678, -1) AS ROUND_MINUS1,
ROUND(1234.5678, -2) AS ROUND_MINUS2
FROM DUAL;
-- 2. TRUNC(숫자, [버림위치])
SELECT TRUNC(1234.5678) AS TRUNC,
TRUNC(1234.5678, 0) AS TRUNC_0,
TRUNC(1234.5678, 1) AS TRUNC_1,
TRUNC(1234.5678, 2) AS TRUNC_2,
TRUNC(1234.5678, -1) AS TRUNC_MINUS1,
TRUNC(1234.5678, -2) AS TRUNC_MINUS2
FROM DUAL;
-- 3. CEIL(숫자) : 지정된 숫자와 가까운 정수찾기 FLOOR(숫자)
SELECT CEIL(3.14),
FLOOR(3.14),
CEIL(-3.14),
FLOOR(-3.14)
FROM DUAL;
-- 5. MOD() : 나머지 값 반환
SELECT MOD(15, 6),
MOD(10, 2),
MOD(11, 2)
FROM DUAL
이거 보니까 정보처리기사 공부랑 병행이 되는 것 같아 좋다. 뭔가 학교 다닐 때 둥둥 떠다니던 지식이 합쳐지는 기분?이다.