테이블은 행과 열로 구성되며 행은 row 열은 column
아주 간단한 테이블 생성
CREATE TABLE test (num INT);
테이블 생성 시 참고할만한 포인트
- AUTO_INCREMENT 로 지정한 열은 반드시 기본키(PRIMARY KEY) 또는 유일한 값(UNIQUE)으로 지정
- FOREIGN KEY(userID) REFERENCES userTBL(userID) : userTBL 테이블의 userID열과 외래키 관계를 맺으라
INSERT INTO userTBL VALUES('YJS', '유재석', 1972, '서울', '010', '11111111', 178, '2008-8-8');
INSERT INTO userTBL VALUES('KHD', '강호동', 1970, '경북', '011', '22222222', 182, '2007-7-7');
INSERT INTO userTBL VALUES('KKJ', '김국진', 1965, '서울', '019', '33333333', 171, '2009-9-9');
INSERT INTO buyTBL VALUES(NULL, 'KHD', '운동화', NULL , 30, 2);
INSERT INTO buyTBL VALUES(NULL, 'KHD', '노트북', '전자', 1000, 1);
INSERT INTO buyTBL VALUES(NULL, 'KYM', '모니터', '전자', 200, 1);
위의 sql문은 에러 발생
ERROR : Cannot add or update a child row : a foreign key constraint fails...
-> 외래키로 연결된 구매 테이블의 userID값은 반드시 회원 테이블의 userID에 존재해야함
-> 회원테이블에 아직 'KYM'(김용만)이라는 회원을 입력하지 않았기 때문에 오류 발생
-> 회원가입을 하지 않으면 물건을 구매하지 못하도록 업부 프로세스를 설정한 것
제약조건
기본키 : 입력되는 값 중복될 수 없으며 NULL 값 올 수 없음
1) PRIMARY KEY 적어주기
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL PRIMARY KEY,
userName VARCHAR(10) NOT NULL,
birthYear INT NOT NULL
);
DESCRIBE userTBL;
2) 사용자가 제약조건 이름 지정하기
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL,
userName VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
CONSTRAINT PRIMARY KEY PK_userTBL_userID (userID)
);
3) 이미 만들어진 테이블 수정
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL,
userName VARCHAR(10) NOT NULL,
birthYear INT NOT NULL
);
ALTER TABLE userTBL
ADD CONSTRAINT PK_userTBL_userID
PRIMARY KEY (userID);
외래키 제약
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL PRIMARY KEY,
userName VARCHAR(10) NOT NULL,
birthYear INT NOT NULL
);
CREATE TABLE buyTBL
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY ,
userID CHAR(8) NOT NULL,
prodName CHAR(6) NOT NULL,
FOREIGN KEY(userID) REFERENCES userTBL(userID)
);
이렇게도 가능하다,,
CREATE TABLE buyTBL
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
userID CHAR(8) NOT NULL,
prodName CHAR(6) NOT NULL
);
ALTER TABLE buyTBL
ADD CONSTRAINT FK_userTBL_buyTBL
FOREIGN KEY (userID)
REFERENCES userTBL(userID);
ALTER TABLE buyTBL DROP FOREIGN KEY FK_userTBL_buyTBL; -- 외래 키 제거 ALTER TABLE buyTBL ADD CONSTRAINT FK_userTBL_buyTBL FOREIGN KEY (userID) REFERENCES userTBL (userID) ON UPDATE CASCADE;
외래키를 설정할때
ON DELETE CASCADE
,ON UPDATE CASCADE
옵션을 사용할 수 있음.
이는 기준 테이블의 데이터가 변경되었을 때 외래키 테이블에도 변경된 데이터가 자동으로 적용되도록 설정하는 옵션
UNIQUE 제약조건
DEFAULT 제약조건 : 값을 입력하지 않았을 때 자동으로 입력되는 기본 값을 정의하는 조건
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL PRIMARY KEY,
userName VARCHAR(10) NOT NULL,
birthYear int NOT NULL DEFAULT -1,
addr CHAR(2) NOT NULL DEFAULT '서울',
mobile1 CHAR(3) NULL,
mobile2 CHAR(8) NULL,
height smallint NULL DEFAULT 170,
mDate date NULL
);
REATE TABLE userTBL
( userID CHAR(8) NOT NULL PRIMARY KEY,
userName VARCHAR(10) NOT NULL,
birthYear int NOT NULL ,
addr CHAR(2) NOT NULL,
mobile1 CHAR(3) NULL,
mobile2 CHAR(8) NULL,
height smallint NULL,
mDate date NULL
);
ALTER TABLE userTBL
ALTER COLUMN birthYear SET DEFAULT -1;
ALTER TABLE userTBL
ALTER COLUMN addr SET DEFAULT '서울';
ALTER TABLE userTBL
ALTER COLUMN height SET DEFAULT 170;
테이블을 정의할 때 특정 열에 NULL 값이 입력되는 것을 허용하려면 NULL로 설정하고, 허용하지 않으려면 NOT NULL로 설정하는 조건
NULL값은 '아무것도 없다'는 의미로 0,빈문자,공백 과 다르니 주의
CREATE TABLE normalTBL( emp_no INT , first_name VARCHAR(14));
CREATE TABLE compressTBL( emp_no INT , first_name VARCHAR(14))
ROW_FORMAT=COMPRESSED ;
INSERT INTO normalTbl
SELECT emp_no, first_name FROM employees.employees;
INSERT INTO compressTBL
SELECT emp_no, first_name FROM employees.employees;
CREATE TEMPORARY TABLE [ IF NOT EXISTS ] 테이블이름 (열정의,,)
CREATE TEMPORARY TABLE IF NOT EXISTS tempTBL (id INT, userName CHAR(5));
DROP TABLE 테이블이름;
ALTER TABLE userTBL
ADD homepage VARCHAR(30) -- 열추가
DEFAULT 'http://www.hanbit.co.kr' -- 디폴트값
NULL; -- Null 허용함
ALTER TABLE userTBL
DROP COLUMN mobile1;
ALTER TABLE userTBL
CHANGE COLUMN userName uName VARCHAR(20) NULL ;
ALTER TABLE userTBL
DROP PRIMARY KEY;
위 구문 오류 발생. 아래 구문 실행 후 위 구문 실행
ALTER TABLE userTBL
DROP FOREIGN KEY 외래키 이름;
뷰
CREATE VIEW v_userTBL
AS
SELECT userID, userName, addr FROM userTBL;
SELECT * FROM v_userTBL; -- 뷰를 테이블이라고 생각해도 무방
1) 뷰는 보안에 도움이 됨
2) 뷰는 복잡한 쿼리를 단순화함
SELECT U.userID, U.userName, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처'
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID ;
🔽
CREATE VIEW v_userbuyTBL
AS
SELECT U.userID, U.userName, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처'
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID ;
SELECT * FROM v_userbuyTBL WHERE userName = '강호동';
1) 뷰 생성
CREATE VIEW v_userbuyTBL
AS
SELECT U.userID AS 'USER ID', U.userName AS 'USER NAME', B.prodName AS 'PRODUCT NAME',
U.addr, CONCAT(U.mobile1, U.mobile2) AS 'MOBILE PHONE'
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID;
SELECT `USER ID`, `USER NAME` FROM v_userbuyTBL; -- 주의! 백틱(키보드 1의 왼쪽 키)을 사용한다.
2) 뷰 수정,삭제
<뷰 수정>
ALTER VIEW v_userbuyTBL
AS
SELECT U.userID AS '사용자 아이디', U.userName AS '이름', B.prodName AS '제품 이름',
U.addr, CONCAT(U.mobile1, U.mobile2) AS '전화 번호'
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID ;
SELECT `이름`,`전화 번호` FROM v_userbuyTBL; -- 주의! 백틱을 사용한다.
<뷰 삭제>
DROP VIEW v_userbuyTBL;
3) 뷰 정보 확인
REATE OR REPLACE VIEW v_userTBL
AS
SELECT userID, userName, addr FROM userTBL;
4) 뷰 데이터 수정
UPDATE v_userTBL SET addr = '부산' WHERE userID='LKK' ;
5) 그룹함수 포함하는 뷰 데이터 수정
CREATE OR REPLACE VIEW v_sum
AS
SELECT userID AS 'userID', SUM(price*amount) AS 'total'
FROM buyTBL GROUP BY userID;
SELECT * FROM v_sum;
SELECT * FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'cookDB' AND TABLE_NAME = 'v_sum';
6) 지정한 범위로 뷰 생성하고 데이터 입력
7) 복합 뷰 생성하고 데이터 입력
CREATE OR REPLACE VIEW v_userbuyTBL
AS
SELECT U.userID, U.userName, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS mobile
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID ;
INSERT INTO v_userbuyTBL VALUES('PKL','박경리','운동화','경기','00000000000','2020-2-2');
8) 뷰가 참조하는 테치블 삭제
DROP TABLE IF EXISTS buyTBL, userTBL;
SELECT * FROM v_userbuyTBL;