2022-01-26-Database2

yyj·2022년 2월 2일
0

.

목록 보기
7/21

View

  • View에 대해 알아보자
  • SQL은 일단 대소문자 구분을 하지 않는다.
  • CREATE VIEW / creat view 이렇게 써도 상관 없다!
  • 일반적으로 keyword(이미 정해진 글자)는 대문자로 표기하는게 관용적
  • 식별자(변수이름,함수이름,..내가 이름이 지어주는거.. 테이블이름..)등은 관용적을 소문자 사용

view : Database안에 존재하는 객체

  • 가상의 Table
  • 사용하는 사용자 측면에서는 table과 동일하게 사용
  • 실제 Data를 가지고 있지 않음 -> Table에 대한 SQL구문을 가지고있음!
  • 즉. view는 Table처럼 사용하는것, 실제 사용자 입장에서는 이게 Table인지 View인지 중요하지 않음

view는 왜 사용 하는가?

  • 일반적으로 테이블안에는 중요한 데이터가 들어갈 수 있음 (개인정보 등)
  • 데이터베이스 관리자(DBA)들이 내부적으로 view를 만들어 사람(개발자난 일반사용자)에게 제공
  • 복잡한 SQL구문을 view로 단순화 시킬 수 있음
  • 관리자나 프로젝트 매니저가 view를 제공
  • view 작성 방법
  • [ CREATE VIEW 뷰명 AS SELECT 명령 ]
CREATE VIEW shopdb.v_memberTBL AS
SELECT memberName,  memberAddr
FROM shopdb.membertbl;


"Database Modeling"

  • 현실세계의 data를 DBMS의 database내로 옮기기 위한 과정
    !

  • 이러한 데이터가 있다고 했을 때 사용하려면 보기도 쉽지않고 편하지도 않다

  • 테이블을 깔끔하게 정리하면 다음과 같이 정리가 된다.

  • 해당 테이블을 더 보기 쉽게 2개의 테이블로 구분해 보자

    • 테이블을 보기 쉽게 정리했음에도 중복의 문제가 있다!


    • 정리하면 다음과 같이 분리 된다.

"Key"

  • key에 대한 개념도 알아볼 것이다.
  • key는 column에 설정한다.
  • 여러종류의 key가 존재한다!
    • "Primary Key" -> 각각의 record(컬럼의 집합)를 유일하게 식별!
      1. Not Null 제약조건
      2. Unique 제약조건
    • Pk (primary key)는 반드시 Table에 존재해야 하는 건 아님!
    • Pk를 설정한 column은 Index가 설정된다!
이름나이전화번호이메일주소
홍길동30
아이유20
홍길동25
김연아
  • 이름을 pk로 잡았을 경우 중복되는 값이 들어가면 안된다!

  • 학생테이블
이름주소전화번호
홍길동
아이유
김연아
  • 구매테이블
이름품목단가수량
김연아운동화2003
아이유냉장고10001
김연아세탁기20002

✔ 구매테이블을 보면 하나의 Table의 column이 다른 Table의 Pk를 가리킨다(학생테이블의 이름 컬럼을 가져옴)
✔ 이러한 컬럼은 Foreign key (외래키) 라고 한다
✔ 외래키는 다음과 같은특징을 가진다.
1. Not Null
2. Foreign key안의 값은 반드시 Pk안에 존재해야 함

  • 즉 위의 테이블로 예를 들면 학생테이블에 없는 이름을 구매테이블에서 참조하면 안됨!
  1. Uniqe제약 조건은 가지고 있지 않음!
  • Pk : Fk는 1: N관계를 가진다.


SQL (Structeurd Query Language)

  • 구조적 질의 언어
  • 관계형 데이터베이스에서 사용하는 프로그래밍 언어 "표준"

SQL은 다음과 같이 구성된다

1. DML (Data Mainpulation Language) : 데이터 조작어 (INSERT, UPDATE...)

2. DDL (Data Definition Language) : 데이터 정의어 (CREATE...)

3. DCL (Data Control Language) : 데이터 제어어 (GRANT)

  • 이중 데이터 조작어 DMLCRUD작업을 하는데 활용된다
    • Insert => C
    • Selete => R
    • Update => U
    • Delete => D
    • 그중 SELECT가 가장 많이 사용된다!


예제를 통해서 연습해보자!

-- 데이터베이스(Schema) 지정
use shopdb;   

-- PK를 지정하지 않고 userTBL을 만들어 보자!
CREATE TABLE shopdb.userTBL(
    userName    VARCHAR(6),
    userAddr    VARCHAR(12),
    userMobile  VARCHAR(11)
);
-- 값을 입력
INSERT INTO userTBL VALUES('아이유', '서울', '1234');
INSERT INTO userTBL VALUES('홍길동', '인천', '5678');
INSERT INTO userTBL VALUES('김연아', '부산', '7890');

SELECT * FROM userTBL;
  • 이런식으로 값을 넣고 조회를 해보면
userNameuserAddruserMobile
아이유서울1234
홍길동인천5678
김연아부산7890

✔ 값이 들어간 것을 확인 할 수있다

-- 테이블을 삭제하고 PK를 설정해 다시 테이블을 만들어보자
DROP TABLE userTBL;
  • PK를 넣어서 테이블을 생성하려면 다음과 같이 하면된다
CREATE TABLE shopdb.userTBL(
    userName    VARCHAR(6) PRIMARY KEY,
    userAddr    VARCHAR(12),
    userMobile  VARCHAR(11)
);
-- 자신이 설정하고 싶은 프라이머리키를 지정해서 설정해준다

INSERT INTO userTBL VALUES('아이유', '서울', '1234');
INSERT INTO userTBL VALUES('홍길동', '인천', '5678');
INSERT INTO userTBL VALUES('김연아', '부산', '7890');

SELECT * FROM userTBL;
  • 값을 다시 넣고 조회해보면
userNameuserAddruserMobile
김연아부산7890
아이유서울1234
홍길동인천5678

✔ 값이 이전과 똑같이 들어가 있지만 이름을 기준으로 오름차순 정렬되어 있다

  • 즉, Primary Key를 기준으로 오름차순 정렬되어 데이터가 저장됨
  • Primary Key를 설정하면 clustered Index가 자동으로 설정되고 데이터가 사전식으로 정렬되서 유지됨
  • 아까 했던 index를 생성하는 건 Secondary index라고 하고, 이 Secondary indexB-Tree를 따로 구성함!

  • userTBL을 만들었으니 구매자 테이블 (buyTBL)도 만들어 보자!
CREATE TABLE buyTBL(
	userName VARCHAR(6) NOT NULL,      -- foreign key
    productName VARCHAR(10) NOT NULL,
    productPrice INT NOT NULL,
    buyAmount INT NOT NULL,
    foreign key(userName) references userTBL(userName)
);

-- 데이터를 입력해보자!
-- 잘못 입력해보도록 할 것이다
-- INSERT INTO buyTBL VALUES('신사임당', 냉장고'1000,2) --오류가 발생한다! userTBL의 이름컬럼에 없는 값을 참조했기 때문!

-- 값을 다시 제데로 입력해보자!
INSERT INTO buyTBL VALUES('아이유','냉장고',1000,2);
INSERT INTO buyTBL VALUES('홍길동','Tv',2000,1);
INSERT INTO buyTBL VALUES('김연아','컴퓨터',3000,3);

-- 데이터가 정상적으로 저장되었는지 확인해봅시다!
SELECT * FROM buyTBL;    --정상적으로 출력됨!

-- userTBL의 특정 행을 삭제해보자
-- 행을 삭제할때는 DELETE를 사용
DELEtE FROM userTBL WHERE userName='아이유';    -- 오류 발생
											   -- buyTBL에 아이유가 존재하기 때문                                           

SQL을 알아보자!

1. SELECT

  • 현재 사용가능한 모든 Database (Schema) 를 출력해보자.
SHOW databases;   
  • 사용할 Database(Schema) 를 선택
USE employess;
  • 현재 데이터베이스(Schema) 안에 테이블 조회
SHOW TABLES;
  • 테이블 중 employees라는 table이 있다 이 table의 명세를 알고싶다
DESC employees;
  • 데이터 타입도 중요하다! 데이터 타입도 잠시 알아보고 가자!
    • INT : 정수형 (-21억 ~ +21억)
    • VARCHAR(variable character) : 가변문자열
    • VARCHAR(10) => 최대 10글자까지 저장할 수 있는 가변 문자열 타입
      -- 만약 5글자만 저장했다. 사용되는 공간이 자동으로 5글자로 줄어듦
      -- 저장되는 공간을 효율적으로 사용.
    • CHAR(10) => 최대 10글자까지 저장할 수 있는 고정 문자열 타입.
      -- 만약 5글자만 저장했어요. 그래도 공간 자체는 10글자 공간이 할당.
      -- 공간을 효율적으로 사용하지는 못함.
      -- VARCHAR보다 연산이 빠름
    • DATE => 날짜타입(연월일)
    • DATETIME => 날짜타입(연월일시분초)

  • Table에서 특정 데이터를 추출하기 위해 사용하는 DML은 SELECT
  • 형식은 다음과 같다.

SELECT 컬럼(들) FROM 스키마,테이블(view)

SELECT emp_no, first_name, hire_date FROM employees;
  • 가져오는 record의 개수를 제한하는 방법
SELECT emp_no, first_name, hire_date FROM employees LIMIT 5;
  • 결과를 Result Grid(결과 레코드 집합, Result Set)
  • 결과 Record 집합 (Result Set)은 테이블 형태. 당연히 컬럼이 존재 => SELECT한 컬럼명이 사용
  • 결과 레코드 집합에 컬렴명을 변경할 수 있다! => alias를 이용하면 된다! (자주사용됨)
SELECT emp_no AS '사번', 
	   first_name AS '이름',      -- 출력시 컬럼명이 바껴서 나옴
       hire_date  AS '입사일'
FROM employees LIMIT 5;
  • 결과 레코드 집합 (Result Grid)의 컬렴명이 alias를 통해 이름이 바껴서 나온다.
  • 데이터가 너무 많아서 정상적으로 수행되었는지 확인이 힘들다!
  • 그래서 다른 테이블과 데이터를 이용해서 SELECT에 대한 내용을 좀 더 알아보자!
  • 일단 데이터 베이스가 존재하면 지워요!
DROP DATABASE IF EXISTS sqldb;  -- IF EXISTS 만약에 존재하면 지우라는 의미
  • 데이터베이스(Schema)를 생성!
CREATE DATABASE sqldb;
  • sqldb라는 데이터베이스(Schema)가 생성 되었으니 이걸 사용해 보자
USE sqldb;
  • 테이블을 생성
CREATE TABLE userTBL(
	userID     CHAR(8) primary key,     -- 사용자 ID
    userName   VARCHAR(10) NOT NULL,    -- 사용자 이름
    birthYear  INT NOT NULL,			-- 출생연도
    userAddr   CHAR(2) NOT NULL,		-- 지역(2글자 짜리 지역명)
    mobile1    CHAR(3),                 -- 휴대폰 앞자리(3자리)
    mobile2    CHAR(8),					-- 휴대폰 뒷자리(8글자)
    uesrHeight SMALLINT,				-- 키
    userDate   DATE 					-- 회원가입 일   
);

CREATE TABLE buyTBL(
	num            INT AUTO_INCREMENT PRIMARY KEY,   -- 순번(PK)
	userID         CHAR(8) NOT NULL,					-- 사용자 ID(FK)
    productName    CHAR(8) NOT NULL, 				-- 제품명
    productGroup   CHAR(2),
    prouductPrice
    buyAmount
);
profile
초보개발자

0개의 댓글