[HUFS/Database] SQL (2)

박경민·2023년 4월 27일
0

[CS/Database]

목록 보기
9/16

Modification of the Database

  • 튜플 단위의 작업
  1. Deletion
  2. Insertion
  3. Update

Deletion

delete from r
where P
P: 조건문 r: relation >> 특정 조건을 만족하는 튜플을 찾아 삭제

만약 모든 튜플을 삭제하고 싶다면?: delete from r 을 사용하자.

  • Brooklyn 시에 위치한 각 지점에서 개설된 모든 계좌 정보를 삭제하시오

계좌 정보를 삭제해야 하므로 최종적으론 account 에서 삭제해야 하므로 delete from account 이다. where 절에는 brnach_city 이 브루클린인 branch_name 을 찾아야 한다.

만약 삭제가 아니라 검색하라 였으면 from 에 account, branch 를 넣고 곱하면 될 것인데, 지금은 삭제 연산이므로 where 뒤에서 찾아줘야 함. delete 는 from 절에 테이블을 무조건 하나만 쓰자는 것이 결론

(Truncate commmand)

  • truncate r: r 안의 모든 튜플 삭제(delete from r 과 같음)
  • 그러나 Truncate 는 DDL 이다. (테이블을 초기화하는 것이라고 이해하자.)
  • delete 는 순차삭제, Truncate 은 일괄삭제이다.

Insertion

  • 형식을 지정해서 순서대로 넣어줄 수 있다
  • null 값을 넣어줄 수 있다

Update

이자 지급의 비율 조정을 생각하면 된다.(bal) 특정 어트리뷰트의 값을 일괄적으로 업데이트 하는 것!

set 다음에는 어떤 att 를 어떻게 업데이트할 지 쓴다.

  • 모든 계좌에 5% 이자를 지급?
    update account
    set balance = balance * 1.05

set 부분의 = 는 할당이다. SQL 에서 = 등장하는 경우는 이 말고도 where 에서의 = 도 있는데, 여기서 = 는 비교이다. where 절까지 추가한 문제를 보자.

  • 잔액이 10000이상인 계좌에 이자를 6%, 다른 계좌에는 5% 지급하자.
    update account
    set balance = balance * 1.06
    where balance >= 10000

updata account
set balance = balance * 1.05
where balance < 10000

순서가 중요하다. 예컨대 아래가 먼저 오면 1.05 적용 후 만이 넘어가서 또다시 1.06 을 곱할 수 있는데, 이런 일은 없어야

Null Values

  • 아직 값이 존재하지 않는 경우.
  • 특정 값이 널인지 확인하려고 is null
  • 널이 아닌: is not null

Null and Aggregates

  • Null 값을 Agg 에 반영할 것인가?

select sum(amount)
from loan
: 널 값 무시. (모든 amount 가 null이면 null 을 반환한다.)

  • count 는 무시하지 않고, 다른 agg 연산은 모두 무시한다.
  • count 가 무시하지 않다는 것은 null 값 또한 카운트에 포함한다는 것.

Nested Sub-queries

메인 쿼리 중 select 로 포함되는 쿼리.

  • Set membership: in, not in (데이터가 집합에 포함되는지)
  • Set comparison: data 와 집합의 data 비교. some, all.

Set membership

  • 예금 계좌와 대출 계좌 모두 가진 고객 이름

아래가 Set membership 을 통해 해결한 것.예금 고객 이름을 가져와서 대출 고객의 이름과 교집합을 출력.

  • 대출 계좌만 가진 고객 이름(대출 계좌 고객 - 예금 계좌)

not in 썼음에 주의.

Set Comparison

  • some : 하나라도 만족하면 True
  • all : 모든 원소가 만족하면 True

연산의 결과는 트루, 펄스

  • True
  • False
  • True
  • True

  • False

  • True

  • False

  • True

  • Brooklyn 시에 위치한 어떤 지점보다 많은 자산을 가지고 있는 모든 지점의 이름을 찾으시오.

이렇게 풀 수도 있지만 some 을 쓰면 더 간단하게 푼다.

select branch_name
from branch
where assets > some
(select assets
from branch
where branch_city = 'Brooklyn')

  • 브루클린 시의 모든 지점보다 많은 자산이라면?
    some 을 all 로 바꿔주자.

Views

  • 가상의 relation 이다. (select from where 은 가상이면서 저장이 안되는 것, View 는 가상이면서 저장이 되는 것.)

  • 실제 relation 처럼 쿼리를 처리할 수 있음(서치, 삽입 삭제 업데이트 모두 가능)

  • View 는 부분집합인데 어떻게 추가한다는 말인가? 기존 테이블이 A,B,C att 이고 뷰가 A,B이어서 추가할 경우 C는 널값으로 들어감.

  • 만약 View 가 두 개 이상의 테이블로 구성된 경우 추가시 널 값이 범람할 수 있다, 따라서

  • 원래 relation 의 not null 속성이 있을 경우 또는 두 테이블로부터 구성된 뷰는 불가능하다. (추가와 삭제, 갱신이 안되고 서치만 가능)

  • View 생성 방법: create view v as < query >
    < query > 는 select from where 이다. 간단히 말해 select from where 의 값을 저장하고 싶을 때 view 를 쓴다.

  • View 의 삭제 방법: drop view V

연산의 결과를 all_customer 에 저장한다. 이 테이블을 사용한 문제를 풀어보자.

  • Perryridge 지점에서 계좌를 개설한 모든 고객의 이름을 출력하시오.
    select customer_name
    from all_customer
    where branch_name = 'Perryridge'

Practice with MySQL

문제 10. delete cascade / refrential integrity

profile
Mathematics, Algorithm, and IDEA for AI research🦖

0개의 댓글