4장 관계 대수와 SQL5

Song Chae Won·2023년 4월 7일
0

DATABASE_STUDY

목록 보기
8/19
post-thumbnail

Select문

조인

  • 두 개 이상의 릴레이션으로부터 연관된 투플들을 결합
  • 조인 조건은 두 릴레이션 사이에 속하는 애트리뷰트 값들을 비교 연산자로 연결 ( = )
  • 조인 조건을 생략했을 때와 틀리게 표현했을 때 카티션 곱이 생성
  • 애트리뷰트 이름 앞에 릴레이션 이름을 사용하는 것이 바람직하고, 두 릴레이션의 조인 애트리뷰트 이름이 동일하다면 반드시 애트리뷰트 이름 앞에 릴레이션 이름을 사용해야 함
SELECT EMPNAME, DEPTNAME
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO;
  • 최종 결과 릴레이션읜 EMPNAME과 DEPTNAME을 프로젝션한 것

자체 조인

  • 한 릴레이션에 속하는 투플을 동일한 릴레이션에 속하는 투플과 조인
  • 실제로 한 릴레이션이 접근되지만 FROM절에 두 릴레이션이 참조되는 것처럼 나타내기 위해서 그 릴레이션에 대한 별칭을 두 개 지정해야함
SELECT E.EMPNAME M.EMPNAME
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER = M.EMPNO;

EX) 조인과 ORDER BY(정렬)의 결합

  • 모든 사원에 대해서 소속 부서 이름, 사원의 이름, 직급, 급여를 검색하라. 부서 이름에 대해 오름차순, 부서이름이 같은 경우엔 SALARY에 대해 내림차순 정렬
SELECT DEPTNAME, EMPNAME, TITLE, SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO
ORDER BY DEPTNAME, SALARY DESC;

중첩질의

  • 외부 질의 WHERE절에 다시 SELECT ... FROM ... WHERE 형태로 포함된 SELECT문
  • 부질의(서브쿼리)라고도함
  • INSERT, DELETE, UPDATE문에도 사용될 수 있음

1) 한 개의 스칼라값이 반환되는 경우
EX) 박영권과 같은 직급을 갖는 모든 사원들의 이름과 직급을 검색

SELECT EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE =
	( SELECT TITLE
      FROM EMPLOYEE
      WHERE EMPNAME = '박영권');

2) 한 개의 애트리 뷰트로 이루어진 릴레이션이 반환

  • 중첩 질의 결과로 한 개의 애트리뷰트로 이루어진 다수의 투플들이 반환
  • 외부 질의 WHERE절에서
    IN : 한 애트리뷰트가 값들의 집합에 속하는가? 참, 거짓
    (EX) SELECT EMPNAME
    FROM EMPLOYEE
    WHERE DNO IN
    (SELECT DEPTNO
    FROM DEPARTMENT
    WHERE DEPTNAME = '영업' OR DEPTNAME = '개발');
    ☑️ IN을 사용한 질의를 중첩 질의를 사용하지 않고 조인질의로 나타냄
    (EX) SELECT EMPNAME
    FROM EMPLOYEE E, DEPARTMENT D
    WHERE E.DNO = D.DEPTNO
    AND (D.DEPTNO = '영업' OR D.DEPTNAME = '개발'); ANY: 한 애트리뷰트가 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가를 테스트 하는 경우 (하나라도 맞으면 참, 모두 틀리면 거짓), SOME과 동일
    (EX) SELECT EMPNAME, DNO
    FROM EMPLOYEE
    WHERE DNO = ANY
    (SELECT DEPTNO
    FROM DEPARTMENT
    WHERE DEPTNAME='영업' OR DEPTNAME='개발');
    ALL: 한 애트리뷰트가 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가를 테스트 하는 경우
    (EX) SELECT EMPNAME, DNO
    FROM EMPLOYEE
    WHERE DNO < ALL
    (SELECT DEPTNO
    FROM DEPARTMENT
    WHERE DEPTNAME='기획' OR DEPTNAME='개발');
    (EX) SELECT EMPNAME, DNO
    FROM EMPLOYEE
    WHERE DNO <> ALL
    (SELECT DEPTNO
    FROM DEPARTMENT
    WHERE DEPTNAME='기획' OR DEPTNAME='개발');

3) 여러 애트리뷰드들로 이루어진 릴레이션이 반환되는 경우
EXISTS: 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사, 빈 릴레이션이면 거짓이고 하나라도 값이 존재하면 참

(EX) SELECT EMPNAME
	 FROM EMPLOYEE E
     WHERE EXISTS
     	(SELECT *
        FROM DEPARTMENT D
        WHERE E.DNO = D.DEPTNO
        	AND (DEPTNAME = '영업' OR DEPTNAME = '개발'));
      

상관 중첩 질의

  • 중첩 질의의 WHERE절에 있는 프레디키트에서 외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 참조하는 질의
  • 중첩 질의의 수행 결과가 단일 값이든, 하나 이상의 애트리뷰트로 이루어진 릴레이션이든 외부 질의로 한 번만 결과를 반환하면 상관 중첩 질의가 아님
  • 상관 중첩 질의에서는 외부 질의를 만족하는 각 투플이 구해진 후에 중첩 질의가 수행되므로 상관 중첩 질의는 외부 질의를 만족하는 투플 수 만큼 여러 번 수행가능

INSERT문

  • 기존의 릴레이션에 투플을 삽입
  • 릴레이션에 한 번에 한 투플을 삽입하는 INSERT문
    INSERT
    INTO 릴레이션(애트리뷰트1, ... , 애트리뷰트n)
    VALUES (값1, ... , 값n);

EX)

INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME) VALUES(6, '인사');

EX) EMPLOYEE 릴레이션에서 급여가 3,000,000이상인 사원의 이름, 직급, 급여를 검색하여 HIGH_SALARY라는 릴레이션에 삽입하라. HIGH_SALARY 릴레이션은 이미 생성되어있다고 가정

INSERT INTO HIGH_SALARY (ENAME, TITLE, SAL)
SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;

DELETE문

  • 한 릴레이션으로부터 한 개 이상의 투플들을 삭제
  • DELECT문의 구문
    DELECT FROM 릴레이션 WHERE 조건;
    EX)
DELETE FROM DEPARTMENT
WHERE DEPTNO = 4;

UPDATE문

  • 한 릴레이션에 들어있는 투플들의 애트리뷰트 값을 수정
    UPDATE 릴레이션 SET 애트리뷰트 = 값 또는 식 WHERE 조건;
    EX)
    사원번호가 2106인 사원의 소속 부서를 3번 부서로 옮기고, 급여를 5% 올려라

UPDATE EMPLOYEE
SET DNO = 3, SALARY =SALARY * 1.05
WHERE EMPNO = 2106;

profile
@chhaewxn

0개의 댓글