INDEX
인덱스를 설정하면 쿼리 실행 속도가 빨라진다. > 생산성 향상
- 클러스터형 인덱스
영어 사전과 같은 형태로 데이터를 실제로 재정렬하여 저장
PRIMARY KEY 컬럼이 있을 경우, 자동 생성
- 보조 인덱스
데이터를 디스크에 재정렬하지 않고, 보조 인덱스를 설정하여 각 데이터의 위치만 빠르게 조회 인덱스는 키-필드만 갖고 있고, 나머지 세부 테이블 컬럼 정보는 가지고 있지 않음
- INDEX 확인방법
SHOW INDEX FROM 테이블명; 을 실행했을 때 key_name = PRIMARY KEY라면 클러스터형 인덱스
- 테이블 변경
FOREIGN KEY도 INDEX가 생긴다! (보조 인덱스)
테이블에 특정 컬럼에 duplicate 값이 나오지 않도록 제약조건을 추가하기
-- ALTER TABLE 테이블이름 ADD [CONSTRAINT 제약조건명] UNIQUE(컬럼명)
ALTER TABLE userTbl ADD [CONSTRAINT TESTDate] UNIQUE(mDate);
- INDEX 추가
- CREATE INDEX 인덱스명 ON 테이블명 ( column 1, column 2, ... );
- ALTER TABLE 테이블명 ADD INDEX 인덱스명 ( column 1, column 2, ... );
CREATE INDEX groupName ON userTbl(name);
SHOW INDEX FROM userTbl;
CREATE INDEX prodName ON buyTbl(prodName);
SHOW INDEX FROM buyTbl;
UNIQUE가 설정된 column에 대해서만 UNIQUE INDEX를 설정할 수 있다. (그 외에는 그냥 INDEX)
*동일한 column에 여러 INDEX를 설정할 필요는 사실상 없지만, 가능은 하다.
- INDEX 삭제
2개 이상의 INDEX를 한번에 삭제하는 쿼리는 데이터 관리에 위험하기도 하고 없음. → 하나씩 삭제하기를 추천!
ALTER TABLE 테이블명 DROP INDEX 인덱스이름;
VIEW
실제 테이블을 기반으로 가상테이블 만들기
데이터의 특정 부분에만 접근하도록 하여 원본을 보존하고 원하는 데이터를 확인하는 방법
- 생성
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- 수정
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- 삭제
DROP VIEW view_name;
WITH
WITH cte_name AS (
-- SQL 쿼리
)
-- CTE를 사용하는 메인 쿼리
✔️VIEW 와 WITH의 차이점
WITH는 임시테이블 : WITH를 포함한 전체쿼리가 실행될 때만 유효하다.
쿼리가 실행됨과 동시에 해당 데이터는 사라진다. (어디에도 저장되지 않음)
직접 함수 생성하기
MySQL에서 함수를 생성할 때 진한 회색 부분을 반드시 같이 실행해주어야 한다.
/*
MISSION
공격력과 방어력의 합이 120보다 크면 ‘very strong’, 90보다 크면 ‘strong’,
모두 해당 되지 않으면 ‘not strong’를 반환하는 함수 ‘isStrong’을 만들고 사용해주세요.
조건1: attack과 defense를 입력값으로 사용하세요.
조건2: 결과값 데이터 타입은 VARCHAR(20)로 해주세요.
*/
DROP FUNCTION IF EXISTS isStrong; -- 동일한 함수가 있다면 삭제
SET GLOBAL log_bin_trust_function_creators=1; -- 함수 생성위해 실행
DELIMITER // -- DELIMITER와 // 사이에 띄어쓰기 한칸 필수
CREATE FUNCTION isStrong(attack INT, defense INT) -- 함수이름 및 x값 정의
RETURNS VARCHAR(20) -- isStrong 함수 결과값 형식
BEGIN -- 함수 시작
DECLARE a INT; -- DECLARE로 빈 값 선언
DECLARE b INT;
DECLARE isStrong varchar(20);
SET a = attack; -- 선언한 빈 값 채워주기
SET b = defense;
SELECT CASE -- 'SELECT 쿼리 INTO 결과반환' 구조, 쿼리에 CASE 조건문 삽입
WHEN a+b >= 120 THEN 'very strong'
WHEN a+b >= 90 THEN 'strong'
ELSE 'not strong'
END INTO isStrong; -- 해당 쿼리 결과를 선언한 isStrong에 집어넣음
RETURN isStrong; -- isStrong 반환
END
//
DELIMITER ; -- DELIMITER와 ; 사이에 띄어쓰기 한칸 필수
#### 만든 함수 조회하기 ####
SELECT name, isSTrong(attack, defense) AS isStrong
FROM mypokemon;
'SQL' 카테고리의 다른 글
[프로그래머스] SQL 반복문, WITH RECURSIVE (0) | 2024.05.21 |
---|---|
[Leetcode] CROSS JOIN (0) | 2024.05.21 |
[중급 쿼리] JOIN, Subquery, UNION, INTERSECT, EXCEPT (0) | 2024.05.20 |
[기본 쿼리] 문자열, 날짜/시간, 숫자 함수 (0) | 2024.05.20 |
[기본 쿼리] 집계함수, Group by/Having, Order by, Like, IsNull, Rank 등 (0) | 2024.05.20 |