DB 6주차

이다연·2023년 4월 19일

DB

목록 보기
6/7

1. SQL 검색하는 SELECT

-1. SQL과 Algebra에서의 SELECT

  • DB에서 정보를 검색할 때 쓰는 문장 = SELECT문
  • relational algebrad의 select와 다름
    -> SQL 에서는 중복(multi-set/동일 튜플의 중복 o)허용하지만 relational algebra에서는 set(동일 튜플의 중복 x)

-2. SELECT 문의 구조

  • SQL에서는 CREATE UNIQUE INDEX command를 사용하여 set이 될 수 있도록 제약할 수 있다
    • data file, schema file, index file 들 물리적으로 따로 존재
    • 이때 index file은 따로따로 존재하는 file의 특정 필드를 읽어서 따로 파일을 구성하는 것임
      - unique하게 index를 만드려면 key가 필요함 -> unique는 중복이 없으니까 set이 될 수 있음
      = set 이 된다는 의미는 중복되는 것을 묶는다(unique속성을 통해 중복되는 것을 묶는 제약을 가한다)
  • SELECTION명령어에 DISTINCT option을 써서 set이 되게 할 수도 있음
  • SQL SELECT의 basic form = SELECT-FROM-WHERE block

    attribute list -> 질의 결과로 내고자 하는 attribute들의 리스트
    table list -> 질의에 사용될 table명시
    condition -> tuple들이 만족해야 하는 조건을 명시, and or not 등 Boolean expression으로 표기됨
    -> where절에서 tuple의 조건이 맞는지 보고 조건 충족하면 해당 튜플이 답이 됨

2. SQL queries

  • basic SQL query = relation algebra의 SELECT, PROJECT< JOIN operation

-1.기본 query(11차시 필기 참조)

-2. 조인 query

  • 두 개의 relation join 할 때는 조인 속성 값이 같은 튜플들끼리 = primary key와 그 pk참조한 foerign key 인 속성들끼리만 join되어야 함
  • https://data-make.tistory.com/24 > 조인 종류들 참조

3. Aliases, DISTINCT옵션, WHERE-clause 생략

-1. Aliases(별칭)

  • SQL에서 두 개 이상의 애트리뷰트가 이름이 같을 지라도 그것이 서로 다른 relation에 있는 애트리뷰트라면 서로 상관하지 않고 사용할 수 있음
  • 원하는 별칭으로 정해주면 됨
  • relation이름(테이블 이름). 속성
  • 사용 예시) EMPLOYEE.LNAME or DEPARTMENT.DNAME
  • 참조 https://wikidocs.net/131380
  • 셀프조인 할 때 별칭을 지어주면 좋음 ( 11차시 15페이지 참조)

-2. WHERE 절 생략

  • WHERE절 생략 = 조건이 없음
  • WHERE TRUE와 같은 의미

-3. * 사용

  • SQL에서 *은 선택한 튜플의 모든 애트리뷰트 값을 검색/선택함을 의미

-4. DISTINCT사용

  • 중복된 튜플들을 제거하기 위해 DISTINCT키워드 사용
  • 예시
    SELECT DISTINCT SALARY
    FROM EMPLOYEE
    -> EMPLOYEE 테이블의 SALARY 값 검색할 때 중복되는거 제외하고 리턴

4. 집합 간 연산자 + 질의 중첩

-1. SET연산자들(일반 집합 연산자)

  • SQL은 어떤 집합 연산자를 직접 사용할 수 있다
  • 종류
    • UNIQUE: 합집합, 릴레이션들에 속하는 모든 튜플로 결과 릴레이션 구성
    • MINUS: 차집합, R - S 의 경우 릴레이션 R에는 존재하지만 릴레이션S에는 존재하지 않는 튜플들로 결과 릴레이션 구성
    • INTERSECT: 교집합, 공통으로 속하는 튜플들로 결과 릴레이션 구성
  • 이러한 set operation들의 결과 -> sets of tuples, 중복된 튜플들은 제거됨
  • set operation은 합병 가능한 관계에서만 적용됨
    -> 두 relation은 동일한 attribute(동일 type)를 가져야 하고 그 attribute는 동일한 순서를 가져야 함
  • 예시: UNION질의(합집합 질의)
    Q4: (SELECT PNAME
    FROM PROJECT, DEPARTMENTS, EMPLOYEE
    WHERE DNUM = DNUMBER
    AND MGRSSN = SSN
    AND LNAME = 'Smith')
    UNION
    Q5: (SELECT PNAME
    FROM PROJECT, WORKS_ON, EMPLOYEE
    WHERE PNUMBER = PNO
    AND ESSN = SSN
    AND LNAME = 'Smith')
    -> Q4에서 PROJECT, DEPARTMENTS, EMPLOYEE 테이블에서 PROJECT(DNUM), DEPARTMENTS(DNUMBER) 조인, DEPARTMENTS(MRGSSN), EMPLOYEE(SSN) 조인,
    EMPLOYEE에서 LNAME이 Smith인 사람을 찾은 결과와
    Q5에서 PROJECT, WORKS_ON, EMPLOYEE 테이블에서
    PROJECT(PNUMBER), WORKS_ON(PNO) 조인,
    WORKS_ON(ESSN), EMPLOYEE(SSN) 조인,
    EMPLOYEE에서 LNAME이 Smith인 사람을 찾은 결과랑의 합집합을
    SELECT라는 테이블에 저장
    = table들의 join을 통해 정보를 연결해서 한 줄로 볼 수 있게 하자 + 합집합

-2. 조인

  • 왼쪽 집합과 오른쪽 집합 간의 조건 있는 결합
  • 이때 조건은 각종 연산자(<,>,=등)
  • 조인의 결과는 Cartesian Product(곱집합)의 부분집합(subset)이다.

-3. 중첩 질의

  • SQL문 안에 또 다른 SQL문을 포함하고 있는 구조

  • WHERE 절 안에 명시 가능

  • inner query = nested query
    -> 이 그림에서 inner query는 DEPARTMENT테이블에서 DNAME의 값이 'Research'인 값을 찾아서 DNUMBER value가 Outer query의 DNO value에 있는지 확인한다

  • Scope Rule의 적용
    : 선언이 없는 참조의 경우 가장 가까운 nested query에 있는 relation을 선택한다
    ex) 내부에 선언된 query가 밖에 선언된 query의 relation을 참조하는 경우 상화 연관 되었다 = correlate되었다 라고 말한다

  • CORRELATED NESTED QUERIES

5.집합 내 존재 유무 확인 질의

-1. EXISTS

  • 결과가 존재하는지를 묻는 함수
  • 답은 T/F
  • WHERE EXIST() -> ()안의 조건이 맞다면 T + 결과 출력, 포인터가 따라다니면서 instance를 보면서 연산
  • NON EXISTS -> F일 경우 결과 출력
  • EXPLICIT SETS
    : Nested query를 쓰지 않고 WHERE 절 내에 괄호로 둘러 쌓인 명확한 value들의 집합을 사용할 수 있다

-2. NULLs

  • IS NULL / IS NOT NULL
  • value가 NULL value인지 체크하는 함수

-3. Explict Sets

6. Aggregate Functions, Grouping

-1. 집계함수

  • COUNT : 애트리뷰트 값의 개수
    SUM : attribute value의 합(숫자 데이터 에서만 사용 가능)
    MAX : attribute value의 최댓값
    MIN : 애트리뷰트 값의 최솟값
    AVG : 애트리뷰트 값의 평균(숫자 데이터 에서만 사용 가능)
  • 계산한 결과를 검색하기 위해 사용
  • SELECT문과 함께 사용
  • 이 함수들은 엄밀하게 보면 관계 모델에 속하지 않는다

-2. 그룹핑

  • 그룹핑

0개의 댓글