인덱스(Index)
- 데이터베이스 테이블에 색인을 추가해 검색 성능의 속도를 높여주는 기능
SHOW INDEX FROM employees;
SELECT * FROM employees WHERE first_name = 'Saniya';
ALTER TABLE employees ADD INDEX idx_employees_first_name (first_name);
DROP INDEX idx_employees_first_name ON employees;
뷰(VIEW)
- 가상테이블로, 보안과 함꼐 사용자의 편의성을 높이기 위해서 사용
- 장점 : 복잡한 SQL를 편하게 조회 할 수 있다
단점 : INDEX를 사용할 수 없어 조회 속도 느림
SELECT
emp.emp_no
, emp.birth_date
, emp.first_name
, emp.last_name
, emp.gender
, emp.hire_date
, sal.salary
, tit.title
FROM employees emp
JOIN salaries sal
ON emp.emp_no = sal.emp_no
AND sal.to_date >= NOW()
JOIN titles tit
ON tit.emp_no = tit.emp_no
AND tit.to_date >= NOW()
;
CREATE VIEW view_emp_info
AS
SELECT
emp.emp_no
, emp.birth_date
, emp.first_name
, emp.last_name
, emp.gender
, emp.hire_date
, sal.salary
, tit.title
FROM employees emp
JOIN salaries sal
ON emp.emp_no = sal.emp_no
AND sal.to_date >= NOW()
JOIN titles tit
ON tit.emp_no = tit.emp_no
AND tit.to_date >= NOW()
;
SELECT * FROM view_emp_info;
스토어드 프로시저(Stored Procedure)
- 일련의 쿼리를 모아 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
DELIMITER $$
CREATE PROCEDURE test()
BEGIN
SELECT * FROM employees WHERE emp_no <= 10005;
END $$
DELIMITER ;
CALL test();
DROP PROCEDURE test;
스토어드 함수(Stored Function)
- 개발자가 필요에 따라 직접 만들어서 사용하는 함수
DELIMITER $$
CREATE FUNCTION my_sum(num1 INT, num2 INT)
RETURNS INT
BEGIN
RETURN num1 + num2;
END $$
DELIMITER ;
SELECT my_sum(100,2);
SHOW FUNCTION STATUS;
DROP FUNCTION my_sum;
트리거(Trigger)
- 어떤 테이블에서 특정한 이벤트(update, insert, delete)가 발생했을 때, 실행시키고자 하는 추가 쿼리 작업들을 자동으로 수행되도록 설정해 두는 것
DELIMITER $$
CREATE TRIGGER trigger_employees_emp_info
BEFORE DELETE
ON employees
FOR EACH ROW
BEGIN
DELETE FROM titles WHERE emp_no = OLD.emp_no;
END $$
DELIMITER ;
DELETE FROM employees WHERE emp_no = 10002;
SHOW TRIGGERS;
DROP TRIGGER trigger_employees_emp_info;
계정 및 권한 관리
- DB를 설치하면 기본적으로 root 계정이 생성되고, 모든 권한이 부여되어 있어 사용이 펼하지만 보안상 root계정의 사용은 바람직하지 못함
SELECT * FROM mysql.USER;
CREATE user 'user1'@'localhost' IDENTIFIED BY 'user1';
GRANT ALL ON employees.* TO 'user1'@'localhost';
REVOKE INSERT, UPDATE, DELETE ON employees.* FROM 'user1'@'localhost';
DROP user 'user1'@'localhost';
커서(Cursor)
- 특정 SQL 문장을 처리한 결과를 저장하고 그 영역을 가리키는 일종의 포인터
DELIMITER $$
CREATE PROCEDURE test()
BEGIN
DECLARE sum_sal INT DEFAULT 0;
DECLARE row_sal INT DEFAULT 0;
DECLARE cur_sal INT DEFAULT 0;
DECLARE end_row BOOLEAN DEFAULT FALSE;
DECLARE cur_sal CURSOR FOR
SELECT salary FROM salaries WHERE emp_no = 10001;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_row = TRUE;
OPEN cur_sal;
cursor_loop: LOOP
FETCH cur_sal INTO row_sal;
IF end_row THEN
LEAVE cursor_loop;
END IF;
SET sum_sal = sum_sal + row_sal;
END LOOP cursor_loop;
SELECT sum_sal;
END $$
DELIMITER ;
CALL test();