[MySQL] MySQL 정리 2
MySQL 내장함수
- 사람들의 편의를 위해 다양한 기능의 내장 함수를 미리 정의하여 제공
- 대표적인 내장함수 종류
- 문자열 함수
- 수학 함수
- 날짜와 시간 함수
LENGTH()
-
전달받은 문자열의 길이를 반환
SELECT LENGTH('abcdefg'); >>> 7
CONCAT()
-
전달받은 문자열을 모두 결합하여 하나의 문자열로 반환
-
전달받은 문자열 중 하나라도
NULL
이 존재하면NULL
을 반환SELECT CONCAT('My', 'SQL Op', 'en Source'), CONCAT('MySQL', NULL, 'OpenSource'); >>> 'MySQL Open Source', NULL
LOCATE()
-
문자열 내에서 찾는 문자열이 처음으로 나타나는 위치를 찾아서 해당 위치를 반환
-
찾는 문자열이 문자열 내에 존재하지 않으면 0을 반환
-
MySQL에서는 문자열의 시작 인덱스를 1부터 계산
SELECT LOCATE('abc', 'abababababcabacbac'); >>> 9
LEFT(), RIGHT()
-
LEFT()
: 문자열의 왼쪽부터 지정한 개수만큼의 문자를 반환 -
RIGHT()
: 문자열의 오른쪽부터 지정한 개수만큼의 문자를 반환SELECT LEFT('MySQL is an open source relational database management system', 5), RIGHT('MySQL is an open source relational database management system', 6); >>> 'MySQL', 'system'
LOWER(), UPPER()
-
LOWER()
: 문자열의 문자를 모두 소문자로 변경 -
UPPER()
: 문자열의 문자를 모두 대문자로 변경SELECT LOWER('MySQL is an open source relational database management system'), UPPER('MySQL is an open source relational database management system'); >>> 'mysql is an open source relational database management system', 'MYSQL IS AN OPEN SOURCE RELATIONAL DATABASE MANAGEMENT SYSTEM'
REPLACE()
-
문자열에서 특정 문자열을 대체 문자열로 교체
SELECT REPLACE('MSSQL', 'MS', 'My'); >>> MySQL
TRIM()
-
문자열의 앞이나 뒤, 또는 양쪽 모두에 있는 특정 문자를 제거
-
TRIM()
: 함수에서 사용할 수 있는 지정자BOTH()
: 전달받은 문자열의 양 끝에 존재하는 특정 문자를 제거 (기본 설정)LEADING()
: 전달받은 문자열 앞에 존재하는 특정 문자를 제거TRAILING()
: 전달받은 문자열 뒤에 존재하는 특정 문자를 제거
-
만약 지정자를 명시하지 않으면, 자동으로 BOTH로 설정
-
제거할 문자를 명시하지 않으면, 자동으로 공백을 제거
SELECT TRIM(' ##MySQL## '), TRIM(LEADING '#' FROM '##MySQL##'), TRIM(TRAILING '#' FROM '##MySQL##') >>> '##MySQL##', 'MySQL##', '##MySQL'
FORMAT()
-
숫자 타입의 데이터를 세 자리마다 쉼표를 사용하는 형식으로 변환
-
반환되는 데이터의 형식은 문자열 타입
-
두 번째 인수는 반올림할 소수 부분의 자릿수
SELECT FORMAT(123123123123.123123123, 6); >>> 123,123,123.123123
FLOOR(), CEIL(), ROUNT()
-
FLOOR()
: 내림 -
CEIL()
: 올림 -
ROUND()
: 반올림SELECT FLOOR(10.95), CEIL(10.95), ROUND(10.95); >>> '10', '11', '11'
SORT(), POW(), EXP(), LOG()
-
SORT()
: 양의 제곱근 -
POW()
: 첫 번째 인수로는 밑수, 두 번째 인수로는 지수를 전달하여 거듭제곱 계산 -
EXP()
: 인수로 지수를 전달받아, e의 거듭제곱을 계산 -
LOG()
: 자연로그 값을 계산SELECT SQRT(4), POW(2, 3), EXP(3), LOG(3); >>> '2', '8', '20.085536923187668', '1.0986122886681098'
SIN(), COS(), TAN()
-
SIN()
: 사인값 반환 -
COS()
: 코사인값 반환 -
TAN()
: 탄젠트값 반환SELECT SIN(PI()/2), COS(PI()), TAN(PI()/4); >>> '1', '-1', '0.9999999999999999'
ABS(), RAND()
-
ABS()
: 절대값을 반환 -
RAND()
: 0.0보다 크거나 같고 1.0보다 작은 하나의 실수를 무작위로 생성SELECT ABS(-2), RAND(), ROUND(RAND()*100, 0); >>> '2', '0.4142058337239603', '35'
NOW(), CURDATE(), CURTIME()
-
NOW()
: 현재 날짜와 시간을 반환, 반환되는 값은 ‘YYYY-MM-DD HH:MM:SS’ 또는 YYYYMMDDHHMMSS 형태로 반환 -
CURDATE()
: 현재 날짜를 반환, 반환되는 값은 ‘YYYY-MM-DD’ 또는 YYYYMMDD 형태로 반환 -
CURTIME()
: 현재 시간을 반환, 반환되는 값은 ‘HH:MM:SS’ 또는 HHMMSS 형태로 반환SELECT NOW(), CURDATE(), CURTIME(); >>> '2022-05-23 22:28:34', '2022-05-23', '22:28:34'
DATE(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
-
전달받은 값에 해당하는 날짜, 월, 일, 시, 분, 초에 해당하는 값을 반환
SELECT NOW(), DATE(NOW()), MONTH(NOW()), DAY(NOW()), HOUR(NOW()), MINUTE(NOW()), SECOND(NOW()); >>> '2022-05-23 22:31:58', '2022-05-23', '5', '23', '22', '31', '58'
MONTHNAME(), DAYNAME()
-
MONTHNAME()
: 월에 해당하는 이름을 반환 -
DAYNAME()
: 요일에 해당하는 이름을 반환SELECT NOW(), MONTHNAME(NOW()), DAYNAME(NOW()); >>> '2022-05-23 22:34:03', 'May', 'Monday'
DAYOFWEEK(), DAYOFMONTH(), DAYOFYEAR()
-
DAYOFWEEK()
: 일자가 해당 주에서 몇번째 날인지를 반환 (일요일 = 1, 토요일 = 7) -
DAYOFMONTH()
: 일자가 해당 월에서 몇 번째 날인지 반환 (0 ~ 31) -
DAYOFYEAR()
: 일자가 해당 연도에서 몇번째 날인지를 반환 (1 ~ 366)SELECT NOW(), DAYOFWEEK(NOW()), DAYOFMONTH(NOW()), DAYOFYEAR(NOW()); >>> '2022-05-23 22:37:03', '2', '23', '143'
DATE_FORMAT()
-
전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 반환
-
MySQL Date and Time Function : https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
SELECT DATE_FORMAT(NOW(), '%D %y %a %d %m %n %j'); >>> '23rd 22 Mon 23 05 n 143'
CREATE TABLE [new_table_name] AS SELECT [table_name]
-
TABLE 복제
CREATE TABLE city2 AS SELECT * FROM city;
CREATE DATABASE [new_table_name]
-
새로운 데이터베이스를 생성 →
USE
문으로 새 데이터베이스를 사용CREATE DATABASE seoyun; USE seoyun;
-
[seoyun] → [Tables] 우클릭 → [Create Table]
CREATE TABLE test ( id INT NOT NULL PRIMARY KEY, col1 INT NOT NULL, col2 FLOAT NOT NULL, col3 VARCHAR(45) NULL ); SELECT * FROM test;
ALTER TABLE()
-
ADD()
: 테이블에 칼럼 추가 -
MODIFY()
: 테이블의 칼럼 타입 변경 -
DROP()
: 테이블에 칼럼 제거ALTER TABLE test ADD col4 INT NULL; ALTER TABLE test MODIFY col4 VARCHAR(20) NULL; ALTER TABLE test DROP col4;
INDEX
- 테이블에서 원하는 데이터를 빠르게 찾기 위해 사용
- 일반적으로 데이터를 검색할 때 순서대로 테이블 전체를 검색하므로 데이터가 많으면 많을수록 탐색하는 시간이 늘어남
- 검색과 질의를 할 때 테이블 전체를 읽지 않기 때문에 빠름
- 설정된 컬럼 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 함
- 인덱스가 있는 테이블은 처리 속도가 느려질 수 있으므로 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋음
CREATE INDEX
: 인덱스 생성CREATE UNIQUE INDEX
: 중복을 허용하지 않는 인덱스FULLTEXT INDEX
: 매우 빠르게 테이블의 모든 텍스트 컬럼을 검색SHOW INDEX
: 인덱스 정보 보기
CREATE INDEX
CREATE INDEX Col1Idx ON test(col1);
CREATE UNIQUE INDEX Col2Idx ON test(col2);
ALTER TABLE test ADD FULLTEXT Col3Idx(col3);
SHOW INDEX FROM test;
- Test라는 테이블을 생성할 때
ID
칼럼은PRIMARY KEY
로 설정해 두었으므로PRIMARY
라는 인덱스를 부여받음
INDEX 삭제
-
ALTER
문을 사용하여 테이블에 추가된 인덱스 삭제ALTER TABLE test DROP INDEX Col3Idx;
-
DROP
문은 내부적으로ALTER
문으로 자동 변환되어 명시된 이름의 인덱스를 삭제DROP INDEX Col2Idx ON test;
VIEW
-
VIEW는 데이터베이스에 존재하는 일종의 가상 테이블
-
실제 테이블처럼 행과 열을 가지고 있지만, 실제로 데이터를 저장하진 않음
-
MySQL에서 뷰는 다른 테이블이나 다른 VIEW에 저장되어 있는 데이터를 보여주는 역할만 수해
-
VIEW를 사용하면 여러 테이블이나 VIEW를 하나의 테이블처럼 볼 수 있음
-
VIEW의 장점
- 특정 사용자에게 테이블 전체가 아닌 필요한 컬럼만 보여줄 수 있음
- 복잡한 쿼리를 단순화해서 사용
- 쿼리 재사용 가능
-
VIEW의 단점
- 한 번 정의된 뷰는 변경할 수 없음
- 삽입, 삭제, 갱신 작업에 많은 제한 사항을 가짐
- 자신만의 인덱스를 가질 수 없음
-
CREATE VIEW
: 뷰 생성 -
ALTER VIEW
: 뷰 수정 -
DROP VIEW
: 뷰 삭제CREATE VIEW testView AS SELECT Col1, Col2 FROM test; ALTER VIEW testView AS SELECT Col1, Col2, Col3 FROM test; DROP VIEW testView;
INSERT
-
데이터를 직접 테이블에 삽입할 때 사용
-
테이블 이름 다음에 나오는 열 생략 가능
-
생략할 경우에
VALUE
다음에 나오는 값들의 순서 및 개수가 테이블이 정의도니 열 순서 및 개수와 동일해야 함 -
INSERT INTO VALUE
: 직접 table에 값을 넣을 수 있음INSERT INTO test VALUE(1, 123, 1.1, "test");
SELECT * FROM test;
→ 직접RESULT GRID
에서 값을 입력 → [Apply] 로도 값을 삽입할 수 있음
-
INSERT INTO SELECT
: 테이블 안에 다른 테이블의 내용을 복사# Test2는 Test와 같은 테이블이 됨 INSERT INTO test2 SELECT * FROM test;
-
UPDATE
: 기존에 입력되어 있는 값을 변경 (WHERE
절 생략 가능하나 테이블의 전체행의 내용 변경)UPDATE test SET col1 = 1, col2 = 1.0, col3 = 'test' where id = 1;
-
DELETE
: 행 단위로 데이터를 삭제하는 구문(데이터는 지워지지만 테이블 용량은 줄어들지 않음) → 원하는 데이터만 지울 수 있고 삭제 후 잘못 삭제한 것을 되돌릴 수 있음DELETE FROM test WHERE id = 1;
-
TRUNCATE
: 용량이 줄어 들고, 인덱스 등도 모두 삭제 → 한번에 다 지워야 하고 삭제후 되돌릴 수 없음TRUNCATE TABLE test;
-
DROP TABLE
: 테이블 전체, 공간, 객체를 삭제 → 삭제후 되돌릴 수 없음DROP TABLE test; DROP DATABASE seoyun;
댓글남기기