가장 대중적인 DB 90년대부터 개발됨
유료/무료버전 모두 존재
비영리 무료 커뮤니티버전(Full설치권장) https://dev.mysql.com/downloads/
<aside> 💡
사용법 with WorkBench

설정을 꺼주는게 작업할때 편함 바로위 MySQL Session 설정에서 쿼리타임 설정가능
.dump파일이 포함된 .sql스크립트 실행하기
QueryTab
Schemas
ER
벡업/복원
User
영상업로드(LONGTEXT, LONGBLOB)
my.ini
Geometry (MySQL에서 지원하는 공간데이터타입) + 관련함수
| 함수명 | 설명 | 비교 |
|---|---|---|
| ST_GeomFromText() | 문자열을 Geometry 형식으로 변환한다. | Point, LineString, Polygon 등 |
| ST_AsText() | Geometry 형식을 문자열 형식으로 변환한다. | Point, LineString, Polygon 등 |
| ST_Length() | LineString의 길이를 구한다. | |
| ST_Area() | Polygon의 면적을 구한다. | |
| ST_Intersects() | 두 도형의 교차 여부를 확인한다. | 0: 교차 안 함, 1: 교차함 |
| ST_Buffer() | 도형에서부터 주어진 거리만큼 떨어진 좌표 집합을 구한다. | |
| ST_Contains() | 한 도형 안에 다른 도형이 들어 있는지 확인한다. | 0: 포함 안 함, 1: 포함함 |
| ST_Distance() | 두 도형 사이의 거리를 구한다. | |
| ST_Union() | 두 도형을 합한 결과 좌표 집합을 구한다. | |
| ST_Intersection() | 두 도형이 교차하는 좌표 집합을 구한다. |
CREATE TABLE StreamTbl (
MapNumber CHAR(10), -- 지도일련번호
StreamName CHAR(20), -- 하천이름
Stream GEOMETRY -- 공간 데이터(하천 개체)
);
INSERT INTO StreamTbl VALUES ('330000001', '한류천',
ST_GeomFromText('LINESTRING (-10 30, -50 70, 50 70)')
);
인덱스

SELECT … WHERE name = “임재범” <보조인덱스>Page10 → Page100 → Page200 → “임재범, LJB” → <클러스터인덱스>Page20 → “KBS, 1001” → “LJB, 임재범, 서울”
검색에서 조금 손해를 보면서, 클러스터형인덱스 위에 보조인덱스를 한번 더 감싸는 이유 :
번지수를 키값으로 사용하는 클러스터인덱스를 인터페이스인덱스로 직접 사용하게되면,
INSERT등으로 번지수가 바뀌는 상황에서 업데이트 부하발생 및 비업데이트로 인한 위험한 오류발생가능성 → 한번 감싸서 번지수를 숨김
STORED PROCEDURE (저장프로시져)
사용 → CALL Procedure;
커서 :

STORED FUNCTION (사용자정의함수)
사용 → SELECT Function();
IN, OUT파람, return이 존재
본문내부에서 SELECT문 사용불가
권한부여필요
SET GLOBAL log_bin_trust_function_creators = 1;
TRIGGER
중첩트리거

PARTITION

CompressedTable
/* 특징
1. DML속도 느림
2. 용량차지적음 */
CREATE TABLE tableCompressed(
emp_no int,
emp_name varchar(14)
) ROW_FORMAT=COMPRESSED ;
TemporaryTable
/* 자동삭제시점
1. 사용자의 직접삭제(DROP TABLE)
2. workbench or mysql 종료
3. mysql서비스 재시작 */
CREATE TEMPORARY TABLE tableTemporary(
emp_no int,
emp_name varchar(14)
);
</aside>
| 카테고리 | 명령어 | 설명 | 사용DB | Oracle | SQL Server | MySQL | PostgreSQL |
|---|---|---|---|---|---|---|---|
| 조건제어 | IF(func, Tcase, Fcase) | 조건 func이 참이면 Tcase, 거짓이면 Fcase 반환 | MySQL 고유 | O | |||
| IFNULL(func1, func2) | func1이 NULL이면 func2 반환 | MySQL 고유 | O | ||||
| NULLIF(func1, func2) | func1과 func2가 같으면 NULL, 다르면 func1 반환 | 표준 SQL | O | O | O | O | |
| 문자처리 | ASCII('문자') | 문자열의 첫 문자의 ASCII 값을 반환 | MySQL 고유 | O | |||
| CHAR(num) | ASCII 값을 문자로 변환 | MySQL 고유 | O | ||||
| BIT_LENGTH(str) | 문자열의 비트 길이를 반환 | 표준 SQL | O | O | O | O | |
| CHAR_LENGTH(str) | 문자열의 문자 수를 반환 (문자 개수) | 표준 SQL | O | O | O | O | |
| LENGTH(str) | 문자열의 바이트 길이를 반환 | MySQL 고유 | O | ||||
| CONCAT_WS(구분자, str1, ...) | 문자열들을 구분자로 연결 | MySQL 고유 | O | ||||
| ELT(pos, str1, str2, ...) | 리스트에서 pos 위치의 문자열 반환 | MySQL 고유 | O | ||||
| EFT(str, length) | 문자열의 왼쪽에서 지정한 길이(length)만큼 반환 | MySQL 고유 | O | ||||
| FIELD(target, str1, ...) | 리스트에서 target의 위치 반환 (없으면 0 반환) | MySQL 고유 | O | ||||
| FIND_IN_SET(target, list) | 콤마로 구분된 문자열에서 target 위치 반환 (없으면 0 반환) | MySQL 고유 | O | ||||
| INSTR(str, target) | 문자열 str에서 target의 시작 위치 반환 | MySQL 고유 | O | ||||
| LOCATE(target, str) | target의 시작 위치 반환 (위와 동일하지만 순서가 반대) | MySQL 고유 | O | ||||
| FORMAT(num, p) | 숫자를 지정된 소수점 자리(p)와 함께 포맷팅 | MySQL 고유 | O | ||||
| RIGHT(str, length) | 문자열의 오른쪽에서 지정한 길이(length)만큼 반환 | MySQL 고유 | O | ||||
| LEFT(str, length) | 문자열의 왼쪽에서 지정한 길이(length)만큼 반환 | MySQL 고유 | O | ||||
| REPEAT(str, times) | 문자열을 지정한 횟수(times)만큼 반복 | MySQL 고유 | O | ||||
| REPLACE(str, strTarget, strNew) | 문자열에서 특정 부분(strTarget)을 새 문자열(strNew)로 교체 | 표준 SQL | O | O | O | O | |
| REVERSE(str) | 문자열을 반전 | MySQL 고유 | O | ||||
| SPACE(length) | 지정한 길이의 공백 문자열 생성 | MySQL 고유 | O | ||||
| SUBSTRING(str, pos, length) | 지정한 위치(pos)에서 시작하여 특정 길이(length)만큼 문자열 반환 | 표준 SQL | O | O | O | O | |
| SUBSTRING_INDEX(str, 구분자, times) | 구분자를 기준으로 문자열을 나누어 특정 위치(times)의 부분 문자열 반환 | MySQL 고유 | O |
JSON_OBJECT()
JSON_ARRAY()
SET @json={}
SELECT JSON_VALID(@json) AS JSON_VALID;
SELECT JSON_SEARCH(@json) AS JSON_SEARCH;
SELECT JSON_EXTRACT(@json) AS JSON_EXTRACT;
SELECT JSON_INSERT(@json) AS JSON_INSERT;
SELECT JSON_REPLACE(@json) AS JSON_REPLACE;
SELECT JSON_REMOVE(@json) AS JSON_REMOVE;
DECLARE 액션 HANDLE FOR 오류조건 처리할_문장;
// error코드대응1
1146 // noTable-errorCode (serverside: 1000~1906 & 3000~3186, clientside: 2000~2062)
42S02 // noTable-statusCode
DROP PROCEDURE IF EXISTS errorProc1;
DELIMITER $$
CREATE PROCEDURE errorProc1()
BEGIN
-- 예외처리추가:
DECLARE CONTINUE HANDLER FOR 1146 -- notable
SELECT '처리중 관련 테이블 비존재' AS '메세지';
-- 메인 실행부:
SELECT * FROM noTBL; -- noTBL이 존재하지않는 경우 상정
END
$$ DELIMITER ;
CALL errorProc1(); -- 사용
// error코드대응2
DROP PROCEDURE IF EXISTS errorProc2;
DELIMITER $$ -- mysql문법임, //와 문법호환
CREATE PROCEDURE errorProc2()
BEGIN
-- 예외처리추가:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 오류가 발생해도 FOR SQLEXCEPTION코드 실행명령
BEGIN
SHOW ERRORS;
SELECT '오류발생, 작업취소됨' AS '메세지';
ROLLBACK;
END;
-- 메인 실행부:
INSERT INTO userTBL VALUES('sglee', '이상구', 1988, '서울', NULL, NULL, 170, CURRENT_DATE());
END
$$ DELIMITER ;
CALL errorProc2(); -- 사용
// prepare
USE sqldb;
DROP TABLE IF EXISTS myTBL;
CREATE TABLE myTBL (
mId INT AUTO_INCREMENT PRIMARY KEY,
mDate DATETIME
);
SET @varCurDate = CURRENT_TIMESTAMP();
PREPARE funcQuery FROM 'INSERT INTO myTBL VALUES(NULL, ?)';
EXCUTE funcQuery USING @varCurDate;
DEALLOCATE PREPARE funcQuery;
SELECT * FROM myTBL;
/*테이블 또는 뷰의 스키마 정보를 출력*/
DESCRIBE v_usertbl;
/*특정 뷰를 생성하는 SQL 문장을 보여줍니다*/
SHOW CREATE VIEW v_usertbl;
/*물리파일컨트롤*/
CREATE TABLESPACE ts_a ADD DATAFILE 'ts_a.ibd';
CREATE TABLESPACE ts_b ADD DATAFILE 'ts_b.ibd';
CREATE TABLESPACE ts_c ADD DATAFILE 'ts_c.ibd';
USE sqldb;
CREATE TABLE table_a (id INT) TABLESPACE ts_a;
CREATE TABLE table_b (id INT);
ALTER TABLE table_b TABLESPACE ts_b;
CREATE TABLE table_c (SELECT * FROM employees.salaries);
ALTER TABLE table_c TABLESPACE ts_c;
DROP TABLE table_c ;
CREATE TABLE table_c (SELECT * FROM employees.salaries);
ALTER TABLE table_c TABLESPACE ts_c;