[SQL첫걸음]181117


데이터베이스 객체
  • 테이블, 뷰, 인텍스 등 데이터베이스 내에 정의하는 모든 것을 일컫는 말
  • 이름을 붙일 때 생기는 제약사항
    • 기존 이름이나 예약서와 중복하지 않는다.
    • 숫자로 시작할 수 없다.
    • 언더스코어(_) 이외의 기호를 사용할 수 없다.
    • 한글을 사용할 때는 더블쿼트(")로 둘러싼다.
      • cf. MySQL에서는 백쿼트(`)
    • 시스템이 허용하는 길이를 초과하지 않는다.
  • 데이터베이스 객체는 스키마라는 그릇안에서 만들어진다.
    • 스키마
      • 데이터베이스의 구조와 제약조건에 대한 전반적인 명세를 기술 한 것 (설계도 개념)
      • 데이터베이스를 구성하는 개체, 속성, 관계 및 데이터 조작 시 값들이 갖는 전반적인 조건을 정의한 것
      • 외부스키마, 개념스키마, 내부스키마로 나뉘어짐

테이블 작성.삭제.변경
  • DML(Data Manipulation Language)는 데이터를 조작하는 명령
    • SELECT, INSERT, DELETE, UPDATE 등
  • DDL(Data Definition Language)는 데이터 정의하는 명령
    • 스키마 내의 객체를 관리할 때 사용
    • CREATE, DROP, ALTER 등
  • CREATE
    • 테이블, 뷰 등 우언하는 객체를 생성할 때 이용하는 명령
    • CREATE TABLE 테이블명 (
        열 정의1,
        열 정의2,
        ...
      )
    • 열 정의란?
      • 열의 이름, 자료형, 기본값, NULL허용 여부등의 정보
      • 열이름 자료형 [DEFAULT 기본값] [NULL|NOT NULL]
  • DROP
    • 테이블 삭제할 때 이용. 실수하지 않도록 주의
    • DROP TABLE 테이블명
    • cf. DELETE 명령에 WHERE 조건을 지정하지 않으면 테이블 전체의 행을 삭제한다. 테이블 정의는 유지된다. (DROP은 테이블 자체를 없애버림)
      • 그러나 행이 많으면 DELETE는 느림. 이때 TRUNCATE 명령을 이용할 수 있다. TRUNCATE는 모든 행의 데이터를 날린다. (조건 지정 불가)
  • ALTER
    • 테이블을 작성한 뒤에 변경이 필요한 경우 사용
      • ex. 열 추가, 삭제, 변경 / 제약 추가, 삭제 등
    • 기존에 저장 된 데이터는 그대로 남긴 채 구성만 변경 된다.
    • 열 추가
      • ALTER TABLE 테이블명 ADD 열 정의
      • 기존 데이터행이 존재하는 경우 모두 NULL or 기본값이 들어간다.
      • 추가되는 열에 NOT NULL제약이 있는 경우 기본값을 지정해야한다.
    • 열 속성 변경
      • ALTER TABLE 테이블명 MODIFY 열 정의
      • 열 이름은 변경 할 수 없다. 자료형, 기본값, NULL 제약 등 변경가능
      • 열 정의에서 이름은 바꾸고 싶은 열의 이름을 쓴 뒤 변경되는 제약 적기
      • 기본의 데이터행도 변경하는 속성에 따라 변경 된다. 단 이때 기존 데이터와 충돌되면 처리되지 않는다.
    • 열 이름 변경
      • ALTER TABLE 테이블명 CHANGE [기존 열 이름] [신규 열 정의]
      • 열 이름뿐아니라 속성도 변경 할 수 있다.
    • 열 삭제
      • ALTER TABLE 테이블명 DROP 열명

제약
  • 제약을 설정함으로써 저장될 데이터를 원하는데로 제한할 수 있다.
  • CREATE TALBE로 테이블을 작성할 때 제약을 같의 정의, ALTER TABLE로 지정, 변경 가능
  • NULL, NOT NULL, UNIQUE, PRIMARY KEY 등
  • 제약은 스페이스로 연속해서 적는다. (쉼표로 나누지 않는다.)
    • ex.
      no INTERGER NOT NULL PRIMARY KEY (o)
      no INTERGER NOT NULL, PRIMARY KEY (x)
  • 한개의 제약으로 복수열에 제약을 거는 걸 '테이블 제약'이라고 한다.
    • ex. CREATE TABLE sample632 (
        no INTEGER NOT NULL,
        sub_no INTEGER NOT NULL,
        name VARCHAR(30),
        PRIMARY KEY (no, sub_no)
      );
  • CONSTRAINT을 이용해 제약에 이름을 붙일 수 있다. 이름이 있으면 나중에 제약관리가 쉬워지니 가능하면 붙이자.
    • ex. CREATE TABLE sample632 (
        no INTEGER NOT NULL,
        sub_no INTEGER NOT NULL,
        name VARCHAR(30),
        CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
      );
  • 제약추가는 ALTER을 이용한다. 열 제약 추가(열 하나만)와 테이블 제약 추가는 명령이 조금 다르다.
    • 열 제약 추가는 MODIFY을 이용해서
      • ALTER TABLE sample631 MODIFY c VARCHAR(30) NOT NULL;
    • 테이블 제약 추가는 ADD을 이용해서
      • ALTER TABLE sample631 ADD CONSTRAINT pkey_sample631 PRIMARY KEY(a);
  • 제약삭제는 열을 재정의 하거나 DROP 제약명 명령을 이용해 할 수 있다.
    • ex.
      ALTER TABLE sample631 MODIFY c VARCHAR(30);
      >> 원래 NOT NULL이 있었다. 이를 NOT NULL 없이 재정의
      ALTER TABLE sample631 DROP CONSTRAINT pkey_sample631;
      >> DROP과 제약명을 이용해 제약 삭제
기본키
  • 기본키는 테이블의 행 한 개를 특정할 수 있는 검색키이다. 기본키로 설정 된 열은 중복되는 데이터를 가질 수 없다.
  • 기본키로 지정 된 열은 NULL값을 가질 수 없다.
  • 기본키를 구성하는 열은 복수라도 상관없다. 복수의 열을 기본키로 지정한 경우 키를 구성하는 모든 열을 사용해서 중복값을 체크한다.
    • ex.
      a, b열을 기본키로 지정했으면
      a : 1, b : 1 / a : 1, b : 2 / a : 1, b : 3 과 같은 식의 데이터도 저장이 된다.
      a열만 보면 1이라는 데이터가 중복되지만 b까지 보면 중복되지 않기 때문  

인덱스 (어려운 개념, 추후 공부)
  • 인덱스는 테이블에 붙여진 색인이라 할 수 있다. 검색속도 향상에 목적이 있다.
  • 인덱스를 지정하면 SELECT의 성능은 향상되나 INSERT, UPDATE, DELETE의 성능은 떨어진다.
  • '이진 탐색'이라는 검색 알고리즘에 인덱스가 필요하다.
  • 인덱스 생성: CREATE INDEX 인덱스명 ON 테이블명 (열명1, 열명2, ...)
  • 인덱스 삭제: DROP INDEX 인덱스명


  • 뷰도 데이터베이스 객체 중 하나이다.
  • '가상 테이블'로 이해하면 좋다. 실제하는 테이블이 아닌 필요에 의해 지정하는 테이블이다. 하지만 쿼리에서는 테이블이랑 비슷하게 사용할 수 있다.
  • CREATE VIEW 뷰명 AS SELECT 명령
    • ex. CREATE VIEW sample_view_67 AS SELECT * FROM sample54;
      SELECT * FROM sample_view_67;
  • 뷰의 열명은 SELECT 구의 열명과 다르게 지정할 수 있다. (생략하면 동일)
    • CREATE VIEW 뷰명 (열명1, 열명2, ...) AS SELECT 명령
    • ex. CREATE VIEW sample_view_672(n, v, v2) AS
        SELECT no, a, a*2 FROM sample54;
      >> no, a, a*2의 열명이 뷰에선 n, v, v2로 지정 됐다.
  • CPU소모가 커진다는 단점이 있다.

집합 연산

  • UNION
    • 합집합을 구할 수 있다.
      • SELECT 명령의 결과를 집합으로 간주하면 이해하기 쉽다.
        ex. SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;
      • UNION 전후 순서가 달라져도 결과값은 동일하다. 단 순서가 다르다.
      • ORDER BY할 때 마지막 SELECT명령에 지정해야 하고 열은 별명을 붙여 ORDER BY구의 지정하는 열과 일치 시켜야 한다.
        ex.
        SELECT * FROM sample71_a
        UNION
        SELECT * FROM sample71_b ORDER BY b; (x)

        SELECT a AS c FROM sample71_a
        UNION
        SELECT b AS c FROM sample71_b ORDER BY c; (o)
      • UNION ALL을 이용하면 중복되는 값도 같이 출력한다.
    • 교집합과 차집합은 MYSQL에서 지원하지 않는다.

    테이블 결합


    • 교차결합
      • FROM구에 테이블을 두 개 지정하면 곱집합으로 계산된다.
      • SELECT * FROM sample72_x, sample72_y;
    • 내부결합
      • INNER JOIN을 이용해 내부결합을 할 수 있다.
      • SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건
      • 외부키를 이용해 데이터를 참조할 때 많이 이용한다.
    • 외부결합
      • LEFT  JOIN, RIGHT JOIN을 이용해 외부결합 할 수 있다.
      • 한 쪽 테이블에만 존재하는 행을 결합할 때 이용한다.
        • ex. '상품 테이블'과 '재고 테이블'이 상품코드로 결합됨.
          새로운 제품이 들어와 '상품'은 있지만 '재고'는 없는 상태.
          이때 INNER JOIN을 사용하면 새로운 상품은 제외된다.
        • 외부결합을 이용하면 새로운 상품의 행도 나온다. 재고는 NULL로 표시







    댓글

    이 블로그의 인기 게시물

    [엑셀 말고 스프레드시트] 03. 구글 스프레드시트 시작하기

    [엑셀 말고 스프레드시트] 01. 구글 스프레드시트란?

    [SQL첫걸음]181108