Don't Panic
in DB ☕ 11분 읽기

[DB] SQL 테이블

#DB
목차

테이블과 뷰

테이블 만들기

**테이블(Table)**은 행과 열로 구성된 2차원 표 형태의 구조다.

  • 행은 로우(row) 또는 **레코드(record)**라 부른다.
  • 열은 컬럼(column) 또는 **필드(field)**라 부른다.

엑셀 시트와 비슷하다고 생각하면 된다.

테이블의 행과 열 구조

테이블 생성과 관련된 주요 사항은 다음과 같다.

  • CREATE TABLE은 테이블을 생성하는 SQL로, 열 이름, 테이블 이름, 데이터 형식 등을 지정한다.
  • 열에 입력될 값이 1부터 자동 증가하도록 하려면 GUI에서는 AI를 체크하고, SQL에서는 AUTO_INCREMENT를 입력한다.
  • 열에 빈 값을 허용하지 않으려면 GUI에서는 NN을 체크하고, SQL에서는 NOT NULL을 입력한다.
  • 열을 기본 키로 지정하려면 GUI에서는 PK를 체크하고, SQL에서는 PRIMARY KEY를 입력한다.
  • 열을 외래 키로 지정하려면 FOREIGN KEY 예약어를 입력한다.
용어설명
GUIGraphical User Interface(그래픽 사용자 인터페이스)의 약자
로우(row)테이블의 행, 레코드(record)라고도 부름
컬럼(column)테이블의 열, 필드(field)라고도 부름
UNSIGNED정수형 뒤에 붙이면 0부터 양의 정수만 입력됨
백틱(`)키보드 1 바로 왼쪽에 있는 키로, 테이블 이름이나 열 이름을 묶을 때 사용
NULL열에 비어 있는 값을 허용할 때 설정함 (별도 지정하지 않으면 NULL)
기본 키-외래 키두 테이블이 일대다로 연결되는 관계
주석(remark)하이픈(-) 2개 이후에 한 칸 띄고 설명 작성

제약조건

테이블에는 기본 키, 외래 키와 같은 **제약조건(Constraint)**을 설정할 수 있다. 제약조건은 테이블을 구성하는 핵심 개념으로, 이를 잘 이해하고 활용하면 데이터의 오류를 줄여 완전무결한 데이터를 만들 수 있다.

기본 키와 외래 키가 대표적인 제약조건이다.

  • 기본 키는 학번, 아이디, 사번처럼 고유한 번호를 의미하는 열에 지정한다.
  • 외래 키는 기본 키와 연결되는 열에 지정한다.
  • 이메일, 휴대폰처럼 중복되지 않는 열에는 **고유 키(UNIQUE)**를 지정할 수 있다.
  • **체크(CHECK)**는 회원의 키가 200cm를 넘지 않는데 실수로 200을 넣는 것 등을 방지하는 조건이다.
  • **기본값(DEFAULT)**은 값을 일일이 넣지 않아도 자동으로 채워질 값을 설정한다. (예: 한국 서비스라면 국가 기본값을 대한민국으로)
  • NOT NULL은 값을 반드시 입력해야 하는 제약조건이다.

제약조건의 종류

제약조건의 기본 개념과 종류

제약조건은 데이터의 무결성을 지키기 위해 제한하는 조건이다. 데이터의 무결성이란 데이터에 결함이 없음을 의미한다.

만약 네이버 아이디나 이메일이 중복된다면 큰 문제가 생긴다. 이러한 결함이 없는 상태를 데이터의 무결성이라고 한다.

MySQL에서 제공하는 제약조건에는 다음이 있다.

  • PRIMARY KEY 제약조건
  • FOREIGN KEY 제약조건
  • UNIQUE KEY 제약조건
  • CHECK 제약조건
  • DEFAULT 정의
  • NULL 값 허용

기본 키 제약조건

데이터를 구분할 수 있는 식별자가 **기본 키(Primary Key)**다.

기본 키의 값은 중복될 수 없으며, NULL 값이 입력될 수 없다. 보통 아이디가 기본 키가 된다.

또한 테이블은 기본 키를 1개만 가질 수 있다. 아이디, 이메일, 주민번호 등 무엇을 기본 키로 설정해도 되지만, 가장 특성이 뚜렷하고 유일성을 가진 열을 기본 키로 삼는 것이 좋다.

USE naver_db;
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL,
  PRIMARY KEY (mem_id)	-- PRIMARY KEY 뒤에 열 이름 넣어주면 그게 기본키가 된다.
);

기본 키 설정 결과

ALTER TABLE로 기본 키 제약조건 설정하기

제약조건을 설정하는 또 다른 방법은 이미 만들어진 테이블을 수정하는 ALTER TABLE 구문을 사용하는 것이다.


DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL
);
ALTER TABLE member  -- ALTER TABLE 로 기본키를 설정했다.
     ADD CONSTRAINT
     PRIMARY KEY (mem_id);
덤) 기본 키에 이름 지정하기

기본 키는 별도의 이름이 없으며, DESCRIBE 명령으로 확인하면 그냥 PRI로만 나온다. 필요하다면 기본 키의 이름을 직접 지어줄 수 있다. 예를 들어 PK_member_mem_id와 같은 이름을 붙이면, 이름만으로 PK가 member 테이블의 mem_id 열에 지정되었다는 것을 알 수 있다.

DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL,
  CONSTRAINT PRIMARY KEY PK_member_mem_id (mem_id)	-- 기본키(mem_id)를 PK_member_mem_id로 바꿈
);

외래 키 제약조건

외래 키(Foreign Key) 제약조건은 두 테이블 사이의 관계를 연결해주며, 그 결과 데이터 무결성을 보장한다.

외래 키가 설정된 열은 반드시 다른 테이블의 기본 키와 연결된다.

회원 테이블과 구매 테이블을 예로 들면,

  • 기본 키가 있는 회원 테이블을 기준 테이블이라 부른다.
  • 외래 키가 있는 구매 테이블을 참조 테이블이라 부른다.

기준 테이블과 참조 테이블의 관계

구매 테이블의 아이디(FK)는 반드시 회원 테이블의 아이디(PK)로 존재한다. “네이버 쇼핑” 데이터베이스에 제품 구매 기록이 있는 사람은 반드시 네이버 회원이라는 의미다.

그래서 구매 기록은 있으나 구매한 사람이 누구인지 모르는 치명적인 일은 절대 발생하지 않는다. 구매 테이블의 데이터는 모두 누가 구매했는지 확실히 알 수 있는, 무결한(오류가 없는) 데이터가 된다.

또한 참조 테이블이 참조하는 기준 테이블의 열은 반드시 기본 키고유 키로 설정되어 있어야 한다.

CREATE TABLE로 외래 키 제약조건 설정하기

외래 키를 생성하는 방법은 CREATE TABLE 끝에 FOREIGN KEY 키워드를 설정하는 것이다.


DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL
);
CREATE TABLE buy
(  num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   mem_id      CHAR(8) NOT NULL,
   prod_name     CHAR(6) NOT NULL,
   FOREIGN KEY(mem_id) REFERENCES member(mem_id)
);

외래 키의 형식은 **FOREIGN KEY(열_이름) REFERENCES 기준_테이블(열_이름)**이다.

위 예에서 구매 테이블(buy)의 열(mem_id)이 참조(REFERENCES)하는 기준 테이블(member)의 열(mem_id)은 기본 키로 설정되어 있다.

만약 기준 테이블의 열이 Primary Key 또는 Unique가 아니라면 외래 키 관계는 설정되지 않는다.

기준 테이블의 열 이름과 참조 테이블의 열 이름

네이버 쇼핑 예에서는 기준 테이블의 열 이름(mem_id)과 참조 테이블의 열 이름(mem_id)이 동일하다. 하지만 반드시 같아야 하는 것은 아니다. 즉, 참조 테이블(buy)의 아이디 열 이름이 user_id처럼 기준 테이블(member)의 mem_id와 달라도 상관없다.

DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL
);
CREATE TABLE buy
(  num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   user_id      CHAR(8) NOT NULL,
   prod_name     CHAR(6) NOT NULL,
   FOREIGN KEY(user_id) REFERENCES member(mem_id) -- 외래키를 설정하는 형식은 FOREIGN KEY(열_이름) REFERENCES 기준_테이블(열_이름); 이다.
);

ALTER TABLE로 외래 키 제약조건 설정하기

외래 키를 설정하는 다른 방법은 ALTER TABLE 구문을 이용하는 것이다.

DROP TABLE IF EXISTS buy;
CREATE TABLE buy
(  num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   mem_id      CHAR(8) NOT NULL,
   prod_name     CHAR(6) NOT NULL
);
ALTER TABLE buy -- buy를 수정한다
    ADD CONSTRAINT  -- 제약 조건을 추가한다
    FOREIGN KEY(mem_id)  -- 외래키 제약조건을 buy 테이블의 mem_id에 설정한다.
    REFERENCES member(mem_id);  -- 참조할 기준 테이블은 member테이블의 mem_id열이다.

기준 테이블의 열이 변경될 경우

예를 들어 회원 테이블의 BLK가 물품을 2건 구매한 상태에서 회원 아이디를 PINK로 바꾸면 두 테이블의 정보가 일치하지 않게 된다.

기준 테이블 열 변경 시 불일치 문제

DROP TABLE IF EXISTS buy;
CREATE TABLE buy
(  num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   mem_id      CHAR(8) NOT NULL,
   prod_name     CHAR(6) NOT NULL
);
ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id);

INSERT INTO member VALUES('BLK', '블랙핑크', 163);
INSERT INTO buy VALUES(NULL, 'BLK', '지갑');
INSERT INTO buy VALUES(NULL, 'BLK', '맥북');

SELECT M.mem_id, M.mem_name, B.prod_name
   FROM buy B
      INNER JOIN member M
      ON B.mem_id = M.mem_id;

내부 조인 결과

여기서 BLK 아이디를 PINK로 바꾸면 에러가 난다.

UPDATE member SET mem_id = 'PINK' WHERE mem_id='BLK';


DELETE FROM member WHERE  mem_id='BLK';

변경/삭제 시 발생하는 외래 키 오류

삭제 또한 같은 오류로 삭제되지 않는다. 즉, 기본 키-외래 키 관계가 설정되면 기준 테이블의 열은 변경되거나 삭제되지 않는다.

그런데 기준 테이블의 열 이름이 변경될 때 참조 테이블의 열 이름도 자동으로 변경되면 더 효율적일 것이다. 즉, 회원 테이블의 BLK가 PINK로 변경되면 자동으로 구매 테이블의 BLK도 PINK로 변경되는 것이다.

ON UPDATE CASCADE 동작 개념

이런 기능을 지원하는 것이 ON UPDATE CASCADEON DELETE CASCADE다.

  • ON UPDATE CASCADE: 기준 테이블의 데이터가 변경되면 참조 테이블의 데이터도 함께 변경된다.
  • ON DELETE CASCADE: 기준 테이블의 데이터가 삭제되면 참조 테이블의 데이터도 함께 삭제된다.

DROP TABLE IF EXISTS buy;
CREATE TABLE buy
(  num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   mem_id      CHAR(8) NOT NULL,
   prod_name     CHAR(6) NOT NULL
);
ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id)
    ON UPDATE CASCADE -- 이 부분들이 중요
    ON DELETE CASCADE;

명령어 실행 후 내부 조인으로 확인하면 물품 정보와 사용자 정보를 확인할 수 있고, 기준 테이블과 참조 테이블의 아이디가 모두 변경된 것을 알 수 있다.


SELECT M.mem_id, M.mem_name, B.prod_name
   FROM buy B
      INNER JOIN member M
      ON B.mem_id = M.mem_id;

ON UPDATE CASCADE 적용 후 결과

삭제하면 참조 테이블의 데이터까지 함께 사라진다.

DELETE FROM member WHERE  mem_id='PINK';

ON DELETE CASCADE 적용 후 결과


기타 제약조건

기본 키, 외래 키 제약조건 이외에도 실무에서 데이터베이스를 사용하다 보면 필요한 여러 제약조건이 있다.

고유 키 제약조건

고유 키(Unique) 제약조건중복되지 않는 유일한 값을 입력해야 하는 조건이다.

기본 키 제약조건과 비슷하지만 다음과 같은 차이점이 있다.

  • 고유 키는 NULL 값을 허용한다. NULL 값은 여러 개가 입력되어도 상관없다.
  • 기본 키는 테이블에 1개만 생성할 수 있지만, 고유 키는 여러 개를 설정할 수 있다.

만약 회원 테이블에 E-mail 주소가 있다면 중복되지 않으므로 고유 키로 설정할 수 있다.


DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL,
  email       CHAR(30)  NULL UNIQUE	-- 고유키
);

고유 키로 설정할 열을 NOT NULL로 지정하면, 고유 키도 기본 키와 동일하게 중복도 안 되고 비어 있어도 안 된다.

INSERT INTO member VALUES('BLK', '블랙핑크', 163, 'pink@gmail.com');
INSERT INTO member VALUES('TWC', '트와이스', 167, NULL);
INSERT INTO member VALUES('APN', '에이핑크', 164, 'pink@gmail.com');

위 쿼리를 실행하면 세 번째 행에서 이메일이 중복되어 실행되지 않는다.


체크 제약조건

체크(CHECK) 제약조건은 입력되는 데이터를 점검하는 기능을 한다. 예를 들어 평균 키에 마이너스 값이 입력되지 않게 하거나, 국번에 이상한 번호가 들어가지 않게 할 수 있다.

평균 키를 반드시 100 이상으로 두려면 **CHECK(조건)**을 추가하면 된다.

DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL CHECK (height >= 100),
  phone1      CHAR(3)  NULL
);

기본값 정의

기본값(Default) 정의는 값을 입력하지 않았을 때 자동으로 입력될 값을 미리 지정해 놓는 방법이다. 예를 들어 키를 입력하지 않으면 기본적으로 160이 입력되도록 할 수 있다.

DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id  CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    VARCHAR(10) NOT NULL,
  height      TINYINT UNSIGNED NULL CHECK (height >= 100),
  phone1      CHAR(3)  NULL
);

ALTER TABLE로 열에 DEFAULT를 지정할 때는 ALTER COLUMN 문을 사용한다. 예를 들어 연락처의 국번을 입력하지 않으면 자동으로 02가 입력되도록 할 수 있다.

ALTER TABLE member
    ALTER COLUMN phone1 SET DEFAULT '02';

기본값이 설정된 열에는 default를 써서 기본값을 입력하고, 원하는 값을 입력하려면 해당 값을 직접 써주면 된다.

ALTER TABLE member
    ALTER COLUMN phone1 SET DEFAULT '02';

INSERT INTO member VALUES('RED', '레드벨벳', 161, '054');
INSERT INTO member VALUES('SPC', '우주소녀', default, default);
SELECT * FROM member;

기본값 정의 적용 결과

널 값 허용

널(NULL) 값을 허용하려면 생략하거나 NULL을 사용하고, 허용하지 않으려면 NOT NULL을 사용한다. 다만 PRIMARY KEY가 설정된 열에는 NULL 값이 있을 수 없으므로, 생략하면 자동으로 NOT NULL로 인식된다.

NULL은 “아무것도 없다”라는 의미다. 공백(”)이나 0과는 다르다.


정리

  • 기본 키는 행 데이터 중에서 데이터를 구분할 수 있는 식별자 역할을 한다.
  • 외래 키는 두 테이블 관계를 연결해 준다. 외래 키가 설정된 열은 반드시 다른 테이블의 기본 키와 연결된다.
  • 고유 키는 중복되지 않는 유일한 값이다. 기본 키와의 차이점은 NULL 값을 허용한다는 것이다.
  • 체크는 입력되는 데이터를 점검하는 기능이다.
  • 기본값은 값을 입력하지 않았을 때 자동으로 입력될 값을 미리 지정한다.
  • 널 값을 허용하려면 생략하거나 NULL을 사용하고, 허용하지 않으려면 NOT NULL을 사용한다.
용어설명
제약조건데이터의 무결성을 지키기 위한 제한된 조건
ALTER TABLE이미 만들어진 테이블을 수정하는 SQL문
ADD CONSTRAINT제약조건을 추가하는 SQL문
기준 테이블기본 키-외래 키 관계가 맺어진 테이블 중 기본 키가 설정된 테이블
참조 테이블기본 키-외래 키 관계가 맺어진 테이블 중 외래 키가 설정된 테이블
ON UPDATE CASCADE기준 테이블의 기본 키를 변경하면 참조 테이블의 외래 키도 변경되는 기능
ON DELETE CASCADE기준 테이블의 기본 키를 삭제하면 참조 테이블의 외래 키도 삭제되는 기능

가상의 테이블 : 뷰

**뷰(View)**는 한마디로 “가상의 테이블”이다. 일반 사용자 입장에서는 테이블과 동일하게 보이기 때문이다. 그렇다면 테이블이 있는데 왜 뷰를 사용할까? 뷰를 사용하면 사용자에게 테이블의 필요한 내용만 보이도록 할 수 있다.

뷰는 데이터베이스 개체 중 하나다. 모든 데이터베이스 개체는 테이블과 관련이 있지만, 그중에서도 뷰는 테이블과 아주 밀접하게 관련되어 있다.

뷰는 한번 생성해두면 테이블이라고 생각하고 사용해도 될 정도로, 사용자 입장에서는 테이블과 거의 동일한 개체로 취급된다.

다만 뷰는 테이블처럼 데이터를 직접 가지고 있지는 않다. 뷰의 실체는 SELECT 문이기 때문에, 뷰에 접근하는 순간 SELECT가 실행되고 그 결과가 화면에 출력되는 방식이다. 말하자면 바로가기 아이콘과 비슷하다.

뷰는 단순 뷰복합 뷰로 나뉜다.

  • 단순 뷰: 하나의 테이블과 연관된 뷰
  • 복합 뷰: 2개 이상의 테이블과 연관된 뷰

단순 뷰와 복합 뷰

뷰를 실행하면 테이블과 완전히 동일하게 나온다. 뷰의 실체가 SELECT 문이기 때문이다.

이 실행 결과가 v_member라면, 앞으로 v_member를 그냥 테이블이라고 생각하고 접근하면 된다. 참고로 뷰인 것을 알기 위해 이름 앞에 v_를 붙이는 것이 일반적이다.

뷰를 만드는 형식은 다음과 같다.

CREATE VIEW 뷰_이름
AS
SELECT 문;

뷰를 만든 후 뷰에 접근하는 방식은 테이블과 동일하게 SELECT 문을 사용한다. 전체에 접근할 수 있고, 필요하면 조건식도 테이블과 동일하게 사용할 수 있다.

SELECT 열_이름 FROM 뷰_이름
[WHERE 조건];

회원 테이블의 아이디, 이름, 주소에 접근하는 뷰를 만든다면 다음과 같다.


USE market_db;
CREATE VIEW v_member
AS
    SELECT mem_id, mem_name, addr FROM member;

이렇게 만든 뷰를 새로운 테이블처럼 생각하고 접근한다.

뷰 생성 결과 (1)

뷰 조회 결과 (2)

뷰 안에 조건식을 넣어서 실행할 수도 있다.

뷰의 작동

뷰의 작동 원리

그림에서 사용자는 뷰를 테이블이라고 생각하고 접근한다. 그러면 MySQL이 뷰 안에 있는 SELECT를 실행해서 그 결과를 사용자에게 보내준다. 사용자 입장에서는 뷰에서 모두 처리한 것으로 이해한다.

뷰는 수정이 가능할까? 뷰는 기본적으로 읽기 전용으로 쓰지만, 뷰를 통해 원본 테이블의 데이터를 수정할 수도 있다. 다만 무조건 되는 것은 아니고 몇 가지 조건을 만족해야 한다.

뷰를 쓰는 이유

1. 보안에 도움이 된다

앞의 v_member에는 사용자의 아이디, 이름, 주소만 있을 뿐 개인정보인 연락처, 키, 데뷔 일자 등의 정보는 없다.

회원 정보 중 아이디만 필요한 직원에게 개인정보가 모두 노출되도록 권한을 주면 보안 문제가 생기고, 그렇다고 권한을 안 주면 그 직원이 일을 할 수 없다.

이때 아이디, 이름, 주소만 보이는 뷰를 생성해서 권한을 제한하고 뷰에만 접근하도록 하면 이런 문제를 쉽게 해결할 수 있다.

이런 방식으로 데이터베이스도 사용자마다 테이블 접근 권한에 차등을 둬서 처리하며, 사용자별 권한은 데이터베이스 보안의 중요한 주제 중 하나다.

2. 복잡한 SQL 문을 단순하게 만들 수 있다


SELECT B.mem_id, M.mem_name, B.prod_name, M.addr,
        CONCAT(M.phone1, M.phone2) '연락처'
   FROM buy B
     INNER JOIN member M
     ON B.mem_id = M.mem_id;

이 쿼리는 내용이 길고 복잡하다. 만약 이 쿼리를 자주 써야 한다면 사용자들은 매번 이 복잡한 쿼리를 입력해야 한다. 이 쿼리를 뷰로 생성한 뒤 사용자들이 해당 뷰에만 접근하도록 하면, 복잡한 SQL을 입력할 필요가 없어진다.


CREATE VIEW v_memberbuy
AS
    SELECT B.mem_id, M.mem_name, B.prod_name, M.addr,
            CONCAT(M.phone1, M.phone2) '연락처'
       FROM buy B
         INNER JOIN member M
         ON B.mem_id = M.mem_id;

복합 뷰 생성 결과


뷰의 실제 작동

실무에서 뷰는 좀 더 복잡하게 사용한다.

뷰의 생성, 수정, 삭제

뷰를 생성하면서 뷰에서 사용될 열 이름을 테이블과 다르게 지정할 수 있다. 기존에 배운 별칭을 사용하면 되는데, 중간에 띄어쓰기도 사용할 수 있다. 별칭은 열 이름 뒤에 작은따옴표 또는 큰따옴표로 묶고, 형식상 AS를 붙여준다. AS를 붙이면 코드가 명확해 보이는 장점이 있다.

단, 뷰를 조회할 때 열 이름에 공백이 있으면 백틱으로 묶어줘야 한다.

CREATE VIEW v_viewtest1
AS
    SELECT B.mem_id 'Member ID', M.mem_name AS 'Member Name',
            B.prod_name "Product Name",
            CONCAT(M.phone1, M.phone2) AS "Office Phone"
       FROM buy B
         INNER JOIN member M
         ON B.mem_id = M.mem_id;

수정할 때는 ALTER VIEW를 사용한다.


ALTER VIEW v_viewtest1
AS
    SELECT B.mem_id '회원 아이디', M.mem_name AS '회원 이름',
            B.prod_name "제품 이름",
            CONCAT(M.phone1, M.phone2) AS "연락처"
       FROM buy B
         INNER JOIN member M
         ON B.mem_id = M.mem_id;

삭제할 때는 DROP VIEW를 사용한다.

데이터베이스 개체의 생성/수정/삭제

데이터베이스 개체는 서로 완전히 다른 기능을 하지만, 생성/수정/삭제 문법은 거의 동일하다.

  • 생성: 모든 데이터베이스 개체(테이블, 뷰, 인덱스, 스토어드 프로시저, 스토어드 함수, 트리거 등)를 생성할 때는 CREATE 개체_종류를 사용한다. 예로 뷰를 생성할 때는 CREATE VIEW를 사용한다.
  • 수정: 이미 생성된 개체를 수정할 때는 ALTER 개체_종류를 사용한다. 예로 테이블을 수정할 때는 ALTER TABLE을 사용한다.
  • 삭제: 기존 개체를 삭제할 때는 DROP 개체_종류를 사용한다. 예로 스토어드 프로시저를 삭제할 때는 DROP PROCEDURE를 사용한다.

뷰의 정보 확인

USE market_db;
CREATE OR REPLACE VIEW v_viewtest2	-- 기존에 뷰가 있어도 덮어쓰는 효과
AS
    SELECT mem_id, mem_name, addr FROM member;
  • DESCRIBE 문으로 기존 뷰의 정보를 확인할 수 있다.
  • SHOW CREATE VIEW 문으로 뷰의 소스 코드를 확인할 수 있다.

정리

  • 모든 데이터베이스 개체는 테이블과 관련이 있지만, 특히 뷰는 테이블에 직접 접근하므로 밀접하게 연관된다.
  • 뷰를 한마디로 정의하면 “가상의 테이블”이다. 뷰의 실체는 SELECT 문으로 구성된다.
  • 하나의 테이블과 관련되면 단순 뷰, 2개 이상의 테이블과 관련되면 복합 뷰라고 부른다. 복합 뷰로는 테이블의 데이터를 수정할 수 없다.
  • 뷰는 특정 사용자가 테이블에 직접 접근하지 못하도록 하고 필요한 부분에만 접근하도록 함으로써 보안에 도움이 된다.
용어설명
CREATE VIEW뷰를 생성하는 SQL
별칭뷰에서 사용될 열의 이름을 별칭으로 테이블과 다르게 지정할 수 있음
백틱뷰를 조회할 때 열 이름에 공백이 있으면 묶어주는 기호
ALTER VIEW뷰를 수정하는 SQL
DROP VIEW뷰를 삭제하는 SQL
CREATE OR REPLACE VIEW기존에 뷰가 있으면 덮어쓰고 없으면 새로 생성하는 SQL
DESCRIBE뷰 또는 테이블의 정보를 조회하는 SQL
SHOW CREATE VIEW뷰의 소스 코드를 보여주는 SQL
WITH CHECK OPTION뷰에 설정된 조건만 입력되도록 지정하는 SQL
CHECK TABLE뷰 또는 테이블의 상태를 확인하는 SQL