- view 작성 방법
- [ CREATE VIEW 뷰명 AS SELECT 명령 ]
CREATE VIEW shopdb.v_memberTBL AS SELECT memberName, memberAddr FROM shopdb.membertbl;
현실세계의 data를 DBMS의 database내로 옮기기 위한 과정
!
이러한 데이터가 있다고 했을 때 사용하려면 보기도 쉽지않고 편하지도 않다
테이블을 깔끔하게 정리하면 다음과 같이 정리가 된다.
해당 테이블을 더 보기 쉽게 2개의 테이블로 구분해 보자
- 테이블을 보기 쉽게 정리했음에도 중복의 문제가 있다!
- 정리하면 다음과 같이 분리 된다.
이름 나이 전화번호 이메일 주소 홍길동 30 아이유 20 홍길동25 김연아
- 이름을 pk로 잡았을 경우 중복되는 값이 들어가면 안된다!
- 학생테이블
이름 주소 전화번호 홍길동 아이유 김연아
- 구매테이블
이름 품목 단가 수량 김연아 운동화 200 3 아이유 냉장고 1000 1 김연아 세탁기 2000 2 ✔ 구매테이블을 보면 하나의 Table의 column이 다른 Table의 Pk를 가리킨다(학생테이블의 이름 컬럼을 가져옴)
✔ 이러한 컬럼은 Foreign key (외래키) 라고 한다
✔ 외래키는 다음과 같은특징을 가진다.
1. Not Null
2. Foreign key안의 값은 반드시 Pk안에 존재해야 함
- 즉 위의 테이블로 예를 들면 학생테이블에 없는 이름을 구매테이블에서 참조하면 안됨!
- Uniqe제약 조건은 가지고 있지 않음!
- Pk : Fk는 1: N관계를 가진다.
3. DCL (Data Control Language) : 데이터 제어어 (GRANT)
-- 데이터베이스(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;
- 이런식으로 값을 넣고 조회를 해보면
userName userAddr userMobile 아이유 서울 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;
- 값을 다시 넣고 조회해보면
userName userAddr userMobile 김연아 부산 7890 아이유 서울 1234 홍길동 인천 5678 ✔ 값이 이전과 똑같이 들어가 있지만 이름을 기준으로 오름차순 정렬되어 있다
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에 아이유가 존재하기 때문
- 현재 사용가능한 모든 Database (Schema) 를 출력해보자.
SHOW databases;
- 사용할 Database(Schema) 를 선택
USE employess;
- 현재 데이터베이스(Schema) 안에 테이블 조회
SHOW TABLES;
- 테이블 중 employees라는 table이 있다 이 table의 명세를 알고싶다
DESC employees;
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 );