컴퓨터공학/데이터베이스

[데이터베이스] SQL - Structured Query Language2

NIMHO 2022. 11. 11. 00:29
728x90

복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.

지난 글에 이어서 작성해 보도록 하겠습니다.

2022.11.10 - [컴퓨터공학/데이터베이스] - [데이터베이스] SQL - Structured Query Language

 

[데이터베이스] SQL - Structured Query Language

복습하기 위해 학부 수업 내용을 필기한 내용입니다. 이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다. 그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다. ▶SQL 개

dhalsdl12.tistory.com

 

SQL 데이터 조작어 검색

중첩 질의문(nested query)을 사용한 검색

어떤 값들을 검색한 후에 이를 다시 비교 조건에서 사용하는 질의는 중첩 질의문을 사용하면 편리하게 표현할 수 있다.

SELECT의 WHERE 절 안에 "SELECT - FROM - WHERE" 형태를 취한다.

부속 질의문(sub-query)이라고도 하고, 중첩 질의문은 소괄호 안에 표기한다.

  • 한 개의 단일 값이 반환되는 경우
  • 한 개의 애트리뷰트로 이루어진 테이블이 반환되는 경우
  • 여러 애트리뷰트들로 이루어진 테이블이 반환되는 경우

 

한 개의 단일 값이 반환되는 경우

    학생 김철수와 같은 학과에 속하는 학생의 성명을 검색하라.

SELECT 성명 FROM 학생
	WHERE 학과 = (SELECT 학과 FROM 학생 WHERE 성명 = '김철수');

반환되는 결과는 '컴퓨터' 단일 값이다.

이 값과 같은 학생의 성명은 김철수, 이영자, 박용철이 최종 검색된다.

 

한 개의 애트리뷰트로 이루어진 테이블이 반환되는 경우

이런 경우 외부 질의문의 WHERE 절에는 IN, ANY, ALL, EXISTS와 같은 연산자가 사용된다.

    과목 코드 'CO123'을 수강한 학생의 성명을 검색하라.

SELECT 성명 FROM 학생
	WHERE 학번 IN (SELECT 학번 FROM 수강 WHERE 과목코드 = 'CO123');

반환되는 결과는 20181234, 20182587, 20183654이다.

한 애트리뷰트가 중첩 질의문 결과 값들의 집합에 속하는가를 테스트한다.

 

ALL, ANY, SOME과 같은 키워드를 WHERE 조건식에 사용될 수 있다.

    수강 테이블에서 ~의 점수보다 좋은 점수를 받은 학생의 학과, 과목 코드를 검색하라.

SELECT 학번, 과목코드 FROM 수강
	WHERE 점수 > ALL
		(SELECT 점수 FROM 수강 WHERE 학번 = 20181234);

ALL은 왼쪽의 애트리뷰트 값이 오른쪽 값을 모두 만족해야 되는 AND의 의미이다.

ANY는 하나 이상 만족해도 되는 OR의 의미이다.

 

여러 애트리뷰트들로 이루어진 테이블이 반환되는 경우

이런 경우 EXISTS 연산자를 사용해 중첩 질의문의 결과가 빈 테이블인지 검사한다.

정첩 질의문의 결과에 적어도 하나의 레코드가 들어 있으면 참이 되고 그렇지 않으면 거짓이 된다.

    과목 'CO13'에 수강한 학생의 성명을 검색하라.

SELECT 성명 FROM 학생
	WHERE EXISTS (SELECT * FROM 수강 WHERE 수강.학번 = 학생.학번 AND 과목코드 = 'CO123');

학생 테이블에서 성명을 검색하는데, 어떤 학생이냐 하면 과목 CO13을 수강하여 그 튜플이 존재하는 그런 학생이다.

 

UNION이 관련된 검색

두 SELECT 문의 결과 테이블이 합병 가능해야 한다.

    '컴퓨터'학과 학생이거나 'EE123'에 수강한 학생의 학번을 검색하라.

SELECT 학번 FROM 학생 WHERE 학과 = '컴퓨터'
UNION
SELECT 학번 FROM 수강 WHERE 과목코드 = 'EE123';

합집합과 같으므로 결과에서 중복되는 튜플들은 자동으로 제거된다.

728x90

SQL 삽입(INSERT)

    학번 20188991, 성명 오영주, 학과 컴퓨터, 전화번호 010-7652-7640인 학생을 삽입하라.

INSERT INTO 학생(학번, 성명, 학과, 전화번호)
	VALUES(20188991, '오영주', '컴퓨터', '010-7652-7640');
# 또는
INSERT INTO 학생
	VALUES(20188991, '오영주', '컴퓨터', '010-7652-7640');

 

한 번에 여러 개의 튜플들을 삽입

    '컴퓨터'학과 학생의 학번, 성명, 전화번호를 검색해 컴퓨터 테이블에 삽입하라.

INSERT INTO 컴퓨터(학번, 성명, 전화번호)
	SELECT 학번, 성명 전화번호 FROM 학생 WHERE 학과 = '컴퓨터';

 

SQL 삭제(DELETE)

☞ 단일 레코드 삭제

DELETE FROM 학생 WHERE 학번 = 20181234;

 

복수 레코드 삭제

DELETE FROM 학생;

 

중첩 질의문을 이용한 삭제

DELETE FROM 수강
	WHERE 과목코드 = 'CO123' AND 점수 >= 85 AND 수강.학번 IN
		(SELECT 학번 FROM 학생 WHERE 학과 = '컴퓨터');

 

SQL 갱신(UPDATE)

☞ 단일 레코드 변경

    유진호 학생의 학과를 '컴퓨터'로 변경하라.

UPDATE 학생 SET 학과 = '컴퓨터' WHERE 성명 = '유진호';

 

☞ 복수 레코드 변경

    CO123의 점수를 2점씩 증가시켜라.

UPDATE 수강 SET 점수 = 점수 + 2 WHERE 과목코드 = 'CO123';

 

☞ 중첩 질의문을 이용한 변경

    컴퓨터학과 학생의 점수를 2점씩 증가시켜라.

UPDATE 수강 SET 점수 = 점수 + 2
	WHERE 학번 IN (SELECT 학번 FROM 학생 WHERE 학과 = '컴퓨터');

SQL 뷰(view)

하나 또는 둘 이상의 기본 테이블로부터 유도되어 만들어지는 가상 테이블

☞ 뷰 생성

    학생 테이블의 컴퓨터학과 학생들로 구성된 학생 뷰를 생성하라.

CREATE VIEW 학생뷰(학번, 성명, 전화번호)
	AS SELECT 학번, 성명, 전화번호 FROM 학생 WHERE 학과 = '컴퓨터' WITH CHECK OPTION;

뷰 생성은 'CREATE VIE 뷰 이름 AS SELECT 문' 형태로 만들어진다.

WITH CHECK OPTION 절은 이 뷰에 대한 갱신이나 삽입 연산 시 뷰 정의 조건인 학과 = '컴퓨터'를 위반하면 실행이 거절된다는 것을 기술하는 것이다.

 

CREATE VIEW 학과별통계(학과, 학생수)
	AS SELECT 학과, COUNT(*) FROM 학생 GROUP BY 학과;

 

 두 개 이상의 테이블을 조인해서 뷰 정의

CREATE VIEW 우수학생(성명, 학과, 점수)
	AS SELECT 학생.성명, 학생.학과, 수강.점수
	FROM 학생, 수강 WHERE 학생.학번 = 수강.학번 AND 수강.점수 >= 90;

 

뷰 제거

일반 형식

DROP VIEW 뷰_이름 {RESTRICT | CASCADE};
  • RESTRICT
    • 이 뷰에 종속적인 뷰가 정의되지 않았을 때만 뷰를 삭제하도록 지시
  • CASCADE
    • 이 뷰뿐만 아니라 이 뷰에 종속적인 다른 모든 뷰나 제약조건이 함께 제거
  • 뷰의 장점
    • 관련된 데이터만 이용 가능
      • 중요하고 적합한 데이터만으로 구성 가능하다.
      • 민감한 데이터에 대한 접근 금지(보안)가 가능하다
    • 데이터 데이스 복잡성 해소
      • 복잡한 데이터베이스 구조를 숨길 수 있다.
      • 복잡한 질의를 단순화할 수 있다.
    • 권한 부여를 단순화
  • 뷰의 단점
    • 정의를 변경할 수 없다.
    • 삽입, 삭제, 갱신 연산에 제한이 많다.
728x90