View

- 실체가 없는 데이터베이스 개체 중에 하나 ( 바로가기 아이콘과 비슷)

- SELECT 문으로 만들어져 있다.

- 접근하는 순간 SELECT 문이 실행되고 그 결과가 출력된다.

- 뷰를 형성 / 접근 / 삭제 하는 방식

-- 형성 방식
CREATE VIEW 뷰_이름
AS
	SELECT 문;
    
-- 접근 방식
SELECT 열_이름 FROM 뷰_이름
	[WHERE 조건];
    
-- 삭제
DROP VIEW 뷰_이름;

- 뷰를 사용하는 이유

  • 보안에 도움이 된다
    • 선택된 열_이름 만을 제공하므로 다른 개인 정보를 보여주지 않는다.
    • 사용자마다 테이블에 접근하는 권한에 차별을 둘 수 있다.
  • 복잡한 SQL을 단순하게 만들 수 있다.

- 추가 용어

  • 뷰를 조회 할때 열 이름에 공백이 있으면 백틱을 이용해서 입력 :  `member id`
  • WITH CHECK OPTION  : 뷰에 설정된 조건만 입력되도록 지정하는 SQL
  • SHOW CREATE VIEW 뷰_이름 : 뷰_이름 의 소스 코드를 보여주는 SQL

 

제약조건(constraint)은 데이터의 무결성을 지키기 위해 제한하는 조건.

  • 대표적인 제약조건
    • PRIMARY KEY 제약조건 - "중복되지 않는 값이여야 하고,  NULL 값을 허용하지 않는다." 
      • 기본 키에 이름 지정: CONSTRAINT PRIMARY KEY PK_mem_id (mem_id)
      • DESCRIBE 문을 이용하면 지정한 이름(PK_mem_id) 나옴. 지정안하면 PRI
    • FOREIGN KEY 제약조건 - "두 테이블 사이의 관계를 연결해주고, 그 결과 데이터의 무결성을 보장해주는 역할. 외래키가 설정된 열은 꼭 다른 테이블의 '기본 키'와 연결한다. 
      • (예) 회원 테이블 member (기준 키 있음, 기준 테이블) - 구매 테이블 buy ( 기준 키 와 외래 키 있음, 참조 테이블)
      • 참조 테이블이 참조 하는 기준 테이블의 열은 반드시 PRIMARY KEY 나  UNIQUE로 설정되어야 한다.
      • 설정 → FOREIGN KEY(mem_id) REFERENCES member(mem_id)
        • 열 이름이 기준 테이블과 같지 않아도 된다. () 안에 연결 시킬 열 이름을 넣으면 된다.
      • 기본 키- 외래 키 관계가 설정되면 기준 테이블의 해당 열은 변경되거나 삭제되지 않는다.
        • ON UPDATE CASCADE : 기준 테이블에 있는 연결된 PK열이 변경되면 자동으로 참조 테이블의 FK열도 변경
        • ON DELETE CASCADE : 기준 테이블의 데이터가 삭제되면 참조 테이블의 데이터도 삭제
    • UNIQUE 제약조건 - 중복되지 않는 유일한 값, NULL 값 허용
      • 설정   email CHAR(30) NULL UNIQUE
    • CHECK 제약조건 - 입력되는 데이터는 점검하는 기능
      • 신장을 물어보는 열에 마이너스 값이 입력되지 않도록하기
      • 설정
        • height  TINYINT UNSIGNED NULL CHECK( height >= 100)
        • phone1  CHAR(3) NULL CHECK(phone1 IN('02', '031', '032', '054', '055', '061))
    • DEFAULT 정의 - 입력하지 않았을 때 자동으로 입력되는 값 설정
      • 설정
        • height  TINYINT UNSIGNED NULL DEFAULT 160
        • phone1  CHAR(3) NULL DEFAULT '02'
    • NULL 값 허용 - 아무 것도 없다는 의미, 공백이나 0과는 다름
      • NOT NULL 값 허용 안함

 

'DataBase > MySQL' 카테고리의 다른 글

[ MySQL 최적화 ] Index  (1) 2024.12.26
MySQL- 가상의 테이블 View  (0) 2023.08.26
MySQL - SQL 프로그래밍 (IF, CASE, WHILE, 동적 SQL)  (0) 2023.08.26
MySQL - 테이블 묶는 조인(JOIN)  (0) 2023.08.12
MySQL - 데이터 형 변환  (0) 2023.08.04

<스토어드 프로시저 (stored procedure)>

DELIMITER $$

CREATE PROCEDURE 스토어드_프로시저_이름()
BEGIN
	'SQL 프로그래밍 코딩'
END -- 책에는 END $$ 이지만 나의 MySQL 8.0.0 버전에서 에러 발생

DELIMTER ;

CALL 스토어드_프로시저_이름(); -- 호출

 

IF 문

DROP PROCEDURE IF EXISTS ifProc1;

DELIMITER $$

CREATE PROCEDURE ifProc1()
BEGIN
	IF 100 = 100 THEN
    	SELECT '100은 100과 같습니다.'; -- 문자 출력
    END IF;
END

DELIMITER ;

CALL ifProc1();

▶ IF ~ ELSE

DROP PROCEDURE IF EXISTS ifProc2;
DELIMITER $$

CREATE PROCEDURE ifProc2()
BEGIN
	DECLARE myNum INT;
    SET myNum = 200;
	IF myNum = 100 THEN
    	SELECT '100입니다.';
    ELSE
    	SELECT '100이 아닙니다.';
    END IF;
END 

DELIMITER ;

CALL ifProc2();

▶ IF 문 활용

DROP PROCEDURE IF EXISTS ifProc3;

DELIMITER $$

CREATE PROCEDURE ifProc3()
BEGIN
	-- 	변수 3개
	DECLARE debutDate DATE;
    DECLARE curDate DATE;
    DECLARE days INT; 
    
    SELECT debut_date INTO debutDate 
		FROM market_db.member
		WHERE mem_id = 'APN';
        
	SET curDate = CURRENT_DATE(); -- 현재 날짜 저장
    SET days = DATEDIFF(curDate, debutDate); -- 일 단위 날짜 차이
    
	IF (days/365) >= 5 THEN -- 5년 지났다면
    	SELECT CONCATE('데뷔한 지', days, '일이나 지났습니다. APN 축하합니다!');
    ELSE
    	SELECT '데뷔한 지' + days + '일빡에 안되었네요. APN 화이팅~';
    END IF;
END

DELIMITER ;

CALL ifProc3();

 

< 날짜 관련 함수>

  • CURRNET_DATE() : 오늘 날짜를 알려주는 함수
  • CURRENT_TIMESTAMP() : 오늘 날짜 와 시간을 알려주는 함수
  • DATEDIFF(날짜1, 날짜2) : 날짜2 부터 날짜1 까지 몇 일 인지 알려주는 함수

 

CASE 문

DROP PROCEDUER IF EXISTS caseProc;

DELIMITER $$

CREATE PROCEDURE caseProc()
BEGIN
	DECLARE point INT ;
	DECLARE credit CHAR(1);
    SET point = 88 ;
    
    CASE
    	WHEN point >= 90 THEN
        	SET credict = 'A';
        WHEN point >= 80 THEN
        	SET credict = 'B';
        WHEN point >= 70 THEN
        	SET credict = 'C';
        WHEN point >= 60 THEN
        	SET credict = 'D';
        ELSE
        	SET credit = 'F';
    END CASE;
    SELECT CONCAT ('취득점수 => ', point), CONCAT('학점 => ', credit);
END

DELIMITER ;

CALL caseProce();

▶ case 문 활용

    
SELECT m.mem_id, m.mem_name, SUM(b.price * b.amount) '총구매액' 
	CASE
    	WHEN (SUM(b.price * b.amount) >= 1500) THEN '최우수고객'
        WHEN (SUM(b.price * b.amount) >= 1000) THEN '우수고객'
        WHEN (SUM(b.price * b.amount) >= 1) THEN '일반고객'
        ELSE '유령고객'
    END '회원등급'
        
    FROM buy b
        RIGHT OUTER JOIN members m
        ON b.mem_id = m.mem_id
    GROUP BY m.mem_id
    ORDER BY SUM(price* amount) DESC ;

 

WHILE 문

DROP PROCEDURE IF EXISTS whileProc;

DELIMITER $$

CREATE PROCEDURE whileProc()
BEGIN
	DECLARE i INT;
    DECLARE hap INT;
    SET i = 1;
    SET hap = 0;

    WHILE (i <= 100) DO
        SET hap = hap + i;
        SET i = i + 1;
    END WHILE;
    
    SELECT '1 부터 100까지의 합 => ' , hap;
END

DELIMITER ;

CALL whileProc();

▶ while 문 활용

DROP PROCEDURE IF EXISTS whileProc2;

DELIMITER $$

CREATE PROCEDURE whileProc2()
BEGIN
	DECLARE i INT;
    DECLARE hap INT;
    SET i = 1;
    SET hap = 0;
    
    myWhile: -- WHILE 문을 myWhile이라는 레이블로 지정
    WHILE (i <= 100) DO
    	IF (i%4 = 0) THEN
        	SET i = i + 1;
            ITERATE myWhile; -- 지정한 레이블(label)인 myWhile로 가서 계속 진행
        END IF;
        SET hap = hap + i;
        IF (hap > 1000) THEN
            LEAVE myWhile; -- 지정한 레이이블 myWhile을 빠져나간다. WHILE 종료
        END IF;
        SET i = i + 1;
    END WHILE;
    
    SELECT '1 부터 100 까지의 합(4의 배수 제외), 1000 넘으면 종료 => ' , hap;
END

DELIMITER ;

CALL whileProc2();

 

동적 SQL

-- 출입용 테이블 생성, id 는 자동으로 증가
DROP TABLE IF EXISTS gate_table;

CREATE TABLE gate_table (id INT AUTO_INCREMENT PRIMARY KEY, entry_time DATETIME);

SET @curDate = CURRENT_TIMESTAMP();

PREPARE myQuery FROM 'INSERT INTO gate_table VALUES(NULL, ?)'; -- 실행할 SQL문 준비
EXECUTE myQUery USING @curDate -- @curDate에 있는 값을 ?에 전달(입력)
DEALLOCATE PREPARE myQuery; -- ? 에 입렵된 값 지우고 같은 sql 문으로 준비

SELECT * FROM gate_table;

 

'DataBase > MySQL' 카테고리의 다른 글

MySQL- 가상의 테이블 View  (0) 2023.08.26
MySQL- 테이블 제약조건  (0) 2023.08.26
MySQL - 테이블 묶는 조인(JOIN)  (0) 2023.08.12
MySQL - 데이터 형 변환  (0) 2023.08.04
MySQL - 변수사용  (0) 2023.08.04

내부 조인의 기본 ( INNER JOIN)

SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    ON < 조인될 조건>
[WHERE <검색조건>]
[ORDER BY <기준>]

예시

USE market_db;
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
ORDER BY m.mem_id;

 

외부조인 (OUTER JOIN)

SELECT [컬럼 이름]
FROM [테이블 A 이름]
LEFT JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름] 
UNION --두 쿼리의 결과를 중복을 제외하고 합쳐서 보여주는 집합연산자
SELECT [컬럼 이름]
FROM [테이블 A 이름]
RIGHT JOIN [테이블 B 이름] ON[테이블A이름].[컬럼A이름]=[테이블B이름].[컬럼B이름];
SELECT <열 목록>
FROM <첫 번째 테이블 (LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    ON < 조인될 조건>
[WHERE <검색조건>]
[ORDER BY <기준>]
  • LEFT OUTER JOIN ( LEFT JOIN) : 왼쪽 테이블을 기준으로 외부 조인 (왼쪽 테이블의 내용은 모두 출력되어야 한다)
  • FULL OUTER JOIN : 왼쪽이든 오른쪽이든 한쪽에 들어 있는 내용이면 출력

예시

SELECT b.mem_id , m.mem_name, b.prod_name, m.addr
	FROM `member` m 
		LEFT OUTER JOIN buy b 
		ON m.mem_id = b.mem_id 
	WHERE b.prod_name IS NULL 
	ORDER BY m.mem_id ;

 

기타 조인

상호조인 (CROSS JOIN):  한쪽 테이블과 다른 쪽 테이블의 모든 행을 조인 시키는 기능

SELECT *
FROM buy
CROSS JOIN memeber;

자체조인 (SELF JOIN):  자신의 테이블에서 컬럼끼리 조인

SELECT < 열 목록>
FROM <테이블> 별칭1
INNER JOIN <테이블> 별칭2
ON <조인될 조건>
[WHERE 검색 조건]

예시

SELECT A.emp "직원", B.emp "직속상관", B.phone "직속상관연락처"
	FROM emp_talbe A
    	INNER JOIN emp_table B
        ON A.manager = B.emp
    WHERE A.emp = '경리부장';
emp manager phone
대표 NULL 1111
... ... ...

직원 직속상관 직속상관 연락처
경리부장 관리이사 2222

'DataBase > MySQL' 카테고리의 다른 글

MySQL- 테이블 제약조건  (0) 2023.08.26
MySQL - SQL 프로그래밍 (IF, CASE, WHILE, 동적 SQL)  (0) 2023.08.26
MySQL - 데이터 형 변환  (0) 2023.08.04
MySQL - 변수사용  (0) 2023.08.04
MySQL- 데이터 형식  (0) 2023.08.04

+ Recent posts