Explan SQL SELECT / UPDATE / INSERT / DELETE 등의 쿼리가 어떻게 수행되는지 내부를 보여주는 SQL 명령이다. MySQL이 해당 쿼리를 어떻게 실행할 지 실행 계획을 보여준다. 이를 바탕으로 느리게 동작하는 쿼리의 최적화가 가능해진다. 느린 쿼리의 경우 문제가 되는 테이블에 인덱스를 만드는 것이 일반적이다. EXPLAIN SELECT 문; Index 인덱스는 테이블에서 특정 찾기 작업을 빠르게 수행하기 위해 별도로 만드는 데이터 구조를 말한다. 컬럼별로 만들어진다. Primary Key나 Foreign Key로 지정된 컬럼은 기본적으로 Index를 갖게 된다. 특정 컬럼을 바탕으로 검색을 자주 한다면, 인덱스 생성이 큰 도움이 될 수 있다. 인덱스는 B+ 트리구조로 만들..
View 자주 사용하는 SQL 쿼리(SELECT)를 가상의 테이블처럼 만들고, 쉽게 사용할 수 있게 하는 것이다. SELECT 결과가 테이블로 저장되는 것이 아니라 View가 사용될 때마다 해당 SELECT 쿼리가 실행된다. MySQL 서버단에 저장된다. CREATE OR REPLACE VIEW 뷰이름 AS SELECT .. SELECT .. FROM session s JOIN channel c ON c.id = s.channel_id; -- 위의 쿼리를 뷰로 만든 SQL문 CREATE OR REPLACE VIEW session_detials AS SELECT .. FROM sessino s JOIN channel c ON c.id = s.channel_id;
트랜잭션 테이블의 내용을 변경하는 SQL들이 연달아 실행되며 이것들이 마치 하나의 SQL처럼 모두 성공하거나, 하나라도 실패하면 모두 실패하는 등의 동작이 필요하면 트랜잭션을 사용해야 한다. 원자성을 만족하는 것을 말한다. DDL이나 DML중 INSERT/UPDATE/DELETE에 의미가 있다. SELECT는 조회만 하기 때문에 트랜잭션을 사용할 이유가 없다. BEGIN과 END, BEGIN과 COMMIT 사이에 해당 SQL들을 사용한다. ROLLBACK을 통해 트랜잭션 실행중 에러가 발생하면 트랜잭션 시작 전 상태로 되돌린다. 예시 계좌 이체 : A가 B에게 송금한다. 계좌 이체는 출금만 성공하고 입금이 실패하면 안 된다. 두 개의 트랜잭션이 하나처럼 동작을 해야 한다. -> Atomic하다. 조회만 ..
JOIN SQL 조인은 두 개 이상의 테이블들을 공통필드를 이용하여 통합한다. 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용한다. JOIN의 결과로 양쪽의 필드를 모두 가진 새로운 테이블이 만들어진다. 조인 방식에 따른 차이점 어떤 레코드들이 선택되는가 어떤 필드들이 채워지는가 JOIN 종류 INNER JOIN 양쪽 테이블에서 매치가 되는 레코드들만 리턴한다. 양쪽 테이블의 필드가 모두 채워진 상태로 리턴된다. SELECT * FROM 테이블1 JOIN 테이블2 ON 테이블1.컬럼1 = 테이블2.컬럼2 LEFT OUTER JOIN 왼쪽 테이블의 모든 레코드들을 리턴한다. 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴된다. 매칭이 되지 않는 값들은 NUL..
MySQL에서 지원하는 타입 더보기 Numeric Type INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT - 정수형 DECIMAL, NUMERIC - 실수형(돈 관련) FLOAT, DOUBLE, BIT - 실수형 Date and Time Type DATE, DATETIME, TIMESTAMP, TIME, YEAR String Type CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, SET JSON Type 다양한 JSON 조작 함수를 제공한다. Spatial Type 위도와 경도를 중심으로한 위치 관련 타입 INSERT INSERT INTO 테이블이름(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);..
SELECT 테이블들에서 레코드들을 읽어오는데 사용한다. SELECT 필드이름1, 필드이름2, ... FROM 테이블이름 WHERE 선택조건 -- 조건 검색 GROUP BY 필드이름1, 필드이름2, ... -- 그룹화 ORDER BY 필드이름 [ASC|DESC] -- 정렬 LIMIT N; -- 앞에서 N개 로우만 출력 *을 통해 모든 필드를 지칭할 수 있다. (SELECT * FROM ....) 옵션 DISTINCT - 중복되는 값들을 지울 수 있다. 그룹함수 - GROUP BY를 사용하면 그룹함수를 쓸 수 있다(COUNT, SUM 등) CASE WHEN 필드 값의 변환을 위해 사용할 수 있다. SELECT channel_id, CASE WHEN channel_id in (1,5,6) THEN 'Soci..
세션 정보 컬럼명 타입 설명 예시 id int 세션 ID 101 user_id int 사용자 ID 201 created timestamp 세션 생성 시간 2021-08-11 23:40:02 channel varchar(64) 채널 (접점) 이름 Facebook 위 테이블을 스타스키마 형태로 바꿔본다. 세션 테이블 컬럼 타입 id (pk) int (auto-generated) user_id int created timestamp (auto-generated) channel_id (fk) int 채널 테이블 컬럼 타입 id (pk) int channel varchar(32) CREATE TABLE session ( id int not null auto_increment primary key, user_id ..
Primary Key 테이블에서 레코드의 유일성을 정의하는 필드이다. (ex. 학번, 주민등록번호) Composite Primary Key : 두 개 이상의 필드로 정의된 Primary Key이다. 유니크 제약조건을 가진다. (테이블에서 pk가 중복된 값을 가진 로우가 없다.) Foreign Key sql을 실행할 때 힌트로 작용하여 최적화를 더 잘 할 수 있다. 데이터 정합성 측면에서 FK를 지정하면, 연결된 테이블의 PK값에 있는 값임을 보장한다. Not Null 필드의 값이 항상 존재하는 경우 지정한다. not null이 지정되지 않으면 기본적으로 값은 null을 가질 수 있다. Default Value 필드에 값이 주어지지 않은 경우 기본값을 정의한다. timestamp 타입 : CURRENT_T..