MySQL만의 고유 명령어

ON DELETE CASCADE
CREATE 문, ALTER 문에 사용되며, 부모 테이블에서 DELETE 시 자식 테이블에서 부모의 키를 외래 키(FK)로 사용하는 경우, 부모 테이블에서 값이 삭제될 경우 자식 테이블에서 관련된 행을 자동으로 삭제하는 옵션을 제공한다.
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL );
CREATE TABLE orders ( id INT PRIMARY KEY, user_id INT, order_name VARCHAR(50), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );
AUTO_INCREMENT
CREATE 문, ALTER 문에 사용되며, 특정 열에 대해 고유한 값을 생성하기 위해, 자동으로 증가하는 숫자를 생성한다.(Oracle의 시퀀스 기능)
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL );
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
FULLTEXT INDEX
CREATE 문, ALTER 문에 사용되며, SELECT시 MATCH ~ AGAINST를 통해 단어를 검색한다.
MATCH~AGAINST는 다양한 방식으로 사용할 수 있다.
[기본 방식] SELECT * FROM 테이블1 WHERE MATCH(컬럼명1, 컬럼명2) AGAINST('포함단어1');
[OR 방식] SELECT * FROM 테이블1 WHERE MATCH(컬럼명1, 컬럼명2) AGAINST('포함단어1 포함단어2' IN BOOLEAN MODE);
[AND 방식] SELECT * FROM 테이블1 WHERE MATCH(컬럼명1, 컬럼명2) AGAINST('+포함단어 -미포함단어' IN BOOLEAN MODE);
REPLACE
일괄적으로 데이터를 치환해야할 경우에 사용된다.
[SELECT 문 사용예시] SELECT REPLACE(컬럼명1, '변경전단어', '변경후단어') AS 약칭1 FROM 테이블1 WHERE 컬럼명1 LIKE '%변경전단어%';
[UPDATE 문 사용예시] UPDATE 테이블명1 SET 컬럼명1 = REPLACE(컬럼명1, '변경전단어', '변경후단어');
INSERT 대신 REPLACE 문을 사용할 수 있으며, INSERT와 다른 점은, 중복되는 키값을 가지는 데이터를 삽입할 때, 기존데이터를 삭제하여 새로운 값을 삽입합니다.
[REPLACE 문 사용예시] REPLACE INTO 테이블명 VALUES ('키값1', '새로운데이터1');
IGNORE
INSERT문에 사용되며, 중복되는 키값을 가지는 데이터를 삽입하려고 하면 무시하며, 중복키 에러를 발생하지 않고 넘어간다.
INSERT IGNORE INTO 테이블명1 VALUES ('키값1', '데이터1');
INSERT IGNORE INTO 테이블명1 VALUES ('키값1', '데이터2');
에러를 발생하지 않고, 추가 삽입을 허용하지 않아 앞에 삽입된 데이터를 그대로 유지
BETWEEN ~ AND ~
SELECT 문의 WHERE 절 내용에 추가되며, 시작범위와 종료범위 안의 내용을 검색할 때 사용한다.
SELECT * FROM 테이블명1 WHERE datetime컬럼명1 BETWEEN '2022-09-01 00:00:00' AND '2022-09-26 23:59:59'
REGEXP ~
SELECT 문의 WHERE 절 내용에 추가되며, 정규식으로 검색할 때 사용한다.
SELECT * FROM 테이블명1 WHERE 컬럼명1 REGEXP '정규식'
[정규식 기호] .(문자하나) *(앞의문자
LIMIT
SELECT 문에 사용되며, LIMIT 키워드를 사용하여 결과의 행 수를 제한할 수 있다.
[줄 제한(1~10번쨰 출력)] SELECT * FROM 테이블명1 LIMIT 10
[줄 제한(21~30번째 출력) 방법1] SELECT * FROM 테이블명1 LIMIT 20,10
[줄 제한(21~30번째 출력) 방법2] SELECT * FROM 테이블명1 LIMIT 10 OFFSET 20
CASE ~ [WHEN ~ THEN ~] ELSE ~ END
조건에 따라 다른 결과값을 선택할 수 있다.
CASE WHEN 조건1 THEN 결과값1 WHEN 조건2 THEN 결과값2 ... WHEN 조건N THEN 결과값N ELSE 결과값나머지 END

MySQL만의 고유 함수

LAST_INSERT_ID()
바로 이전에 AUTO_INCREMENT 열에 삽입된 값을 반환
UUID()
UUID 생성
RAND()
0~1사이의 난수 반환
IF(조건,데이터1,데이터2)
조건이 true면 데이터1, false면 데이터2를 반환
IFNULL(데이터1,데이터2)
데이터1이 NULL이 아니면 데이터1, NULL이면 데이터2를 반환
FIND_IN_SET('찾는데이터명', 테이블데이터)
지정된 값이 문자열 목록 내에서 존재하는지 확인, 있다면 해당데이터 반환, 포함되어 있지 않다면 0이 반환
[예시] SELECT FIND_IN_SET('Banana', (SELECT GROUP_CONCAT(name) FROM fruits)) AS position;
COALESCE(데이터1, 데이터2, ...)
순서대로 진행되며 매개변수 중에 NULL이 아닌 첫 데이터를 반환
CONCAT(데이터1, 데이터2, ...)
최소 2개이상의 데이터를 결합한다.
GROUP_CONCAT(컬럼명1 SEPARATOR '연결텍스트')
SELECT 문에 GROUP BY 절이 사용된 경우에 사용한다. 그룹으로 결합된 내용에 대해 데이터를 결합한다.
[결합예시] SELECT 컬럼명1, GROUP_CONCAT(컬럼명2 SEPARATOR ', ') AS 가칭1 FROM 테이블명1 GROUP BY 컬럼명1;
DATE_FORMAT(데이터, '표시형식')
[NOW()의 YYYY-MM-DD형식] DATE_FORMAT(NOW(), '%Y-%m-%d') AS date
SUBSTRING(데이터1, 시작순서, 반환갯수)
LOCATE('검색할문자', 데이터1, 시작순서)
SUBSTRING('010-1234-5678', 1, LOCATE(',', address) - 1) AS first
SUBSTRING('010-1234-5678', LOCATE('-', tel)+1, LOCATE('-', tel, LOCATE('-', tel)+1) - LOCATE('-', tel) - 1) AS second
SUBSTRING('010-1234-5678', LOCATE('-', tel, LOCATE('-', tel) + 1) + 1) AS third
SUBSTRING_INDEX(원본문자, 구분자, 반환할문자열갯수)가 존재하며, 반환갯수가 +인경우 왼쪽/-인경우 오른쪽을 반환한다.
SUBSTRING_INDEX(phone_number, '-', 1)
SELECT SUBSTRING_INDEX('abc-def-ghi-jkl', '-', 2); -- 결과: 'abc-def'
SELECT SUBSTRING_INDEX('abc-def-ghi-jkl', '-', -2); -- 결과: 'ghi-jkl'
CONVERT(데이터, 변환될 데이터유형명)
데이터 유형 변환, SQL표준인 CAST(데이터 AS 변환될 데이터유형명)와 비슷함
INET_ATON('IP주소'), INET_NTOA(숫자)
IPv4 주소<->10진수 변환
SELECT INET_ATON('192.168.0.1'); -- 결과: 3232235521
SELECT INET_NTOA(3232235521); -- 결과: '192.168.0.1'
NOW(), SYSDATE()
현재 [년-월-일 시:분:초] 를 반환
CURDATE(), CURRENT_DATE()
현재 [년-월-일]을 반환
CURTIME(), CURRENT_TIME()
현재 [시:분:초]을 반환
DATEDIFF()
두 날짜 간의 차이를 일단위로 계산하여 반환