CREATE TABLE books
(
book_id INT AUTO_INCREMENT,
title VARCHAR(100),
author_fname VARCHAR(100),
author_lname VARCHAR(100),
released_year INT,
stock_quantity INT,
pages INT,
PRIMARY KEY(book_id)
);
INSERT INTO books (title, author_fname, author_lname, released_year, stock_quantity, pages)
VALUES
('The Namesake', 'Jhumpa', 'Lahiri', 2003, 32, 291),
('Norse Mythology', 'Neil', 'Gaiman',2016, 43, 304),
('American Gods', 'Neil', 'Gaiman', 2001, 12, 465),
('Interpreter of Maladies', 'Jhumpa', 'Lahiri', 1996, 97, 198),
('A Hologram for the King: A Novel', 'Dave', 'Eggers', 2012, 154, 352),
('The Circle', 'Dave', 'Eggers', 2013, 26, 504),
('The Amazing Adventures of Kavalier & Clay', 'Michael', 'Chabon', 2000, 68, 634),
('Just Kids', 'Patti', 'Smith', 2010, 55, 304),
('A Heartbreaking Work of Staggering Genius', 'Dave', 'Eggers', 2001, 104, 437),
('Coraline', 'Neil', 'Gaiman', 2003, 100, 208),
('What We Talk About When We Talk About Love: Stories', 'Raymond', 'Carver', 1981, 23, 176),
("Where I'm Calling From: Selected Stories", 'Raymond', 'Carver', 1989, 12, 526),
('White Noise', 'Don', 'DeLillo', 1985, 49, 320),
('Cannery Row', 'John', 'Steinbeck', 1945, 95, 181),
('Oblivion: Stories', 'David', 'Foster Wallace', 2004, 172, 329),
('Consider the Lobster', 'David', 'Foster Wallace', 2005, 92, 343);
밑에서 실행할 예제는 위의 테이블과 데이터를 사용한다.
위 코드는 Colt Steele의 SQL 데이터를 참고했음을 알린다.
밑에서는 자주 사용하거나 유용한 문자열 함수를 설명한다.
그외에 함수들은 링크를 참고하자. https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
또한, 밑에서 설명할 함수들의 기본 구문에는 "FROM table_name"을 사용했다.
기본적으로 테이블 내에서 특정 데이터를 활용한다는 점에 중점을 두었다.
하지만 굳이 테이블 내 데이터가 아니더라도, 일반 문자열 데이터로도 실행할 수 있다는 점을 유의하자.
SELECT CONCAT(word1, word2, and_so_on) FROM table_name;
연결하다(Concatenate)는 단어의 앞글자를 딴 함수다.
CONCAT은 함수 내부에 주어지는 모든 매개변수를 이어 하나의 String으로 반환한다.
-- Using CONCAT
SELECT CONCAT('pi', 'ckle');
SELECT CONCAT(author_fname, ' ', author_lname) AS author_name FROM books;
-- Using CONCAT_WS
SELECT CONCAT_WS('-', title, author_fname, author_lname) FROM books;
첫 번째 예시로 들면 pi와 ckle 문자열을 이어 pickle이라는 문자열을 반환한다.
두 번째 예시에서는 books 테이블의 fname(first name)과 lname(lase name)을 공백을 기준으로 이어준다.
특정 함수를 사용하여 SELECT로 확인하면 해당 Field name에 함수가 그대로 나온다.
때문에 AS(alias)로 author_name으로 바꾸어 보여주는 모습이다.
CONCAT과 유사한 CONCAT_WS 함수가 있다.
WS는 With Seperator의 줄임말로, 문자열을 이을 때 구분자를 사이에 두고 있는 함수다.
위의 예제로 보면 title, author_fname, author_lname을 하이픈(-)을 이용하여 합친다.
이때 마지막 글자 뒤에는 들어가지 않고, 글자 사이사이에만 들어간다.
SELECT SUBSTR(sample_string, start_num, *how_many) FROM table_name;
교체하다(Substitute)는 단어의 앞글자를 딴 함수다.
SUBSTR은 주어진 문자열을 자르는 함수다.
반드시 필요한 매개변수는 2개이고, 마지막 매개변수는 생략 가능하다.
두 번째 매개변수는 어디서부터 자를지 정하는 위치 정보이고, 마지막 매개변수는 어디까지 자를지 정하는 위치 정보다.
마지막 매개변수를 생략하면 문자열 끝까지 자른다.
조심할 점은 MySQL에서 '문자열 첫 번째 index 값은 1'이다.
-- Using SUBSTR
SELECT SUBSTRING('Hello World', 1, 4);
SELECT SUBSTRING('Hello World', 7);
SELECT SUBSTRING('Hello World', -3);
SELECT SUBSTRING(title, 1, 10) AS 'short title' FROM books;
SELECT SUBSTR(title, 1, 10) AS 'short title' FROM books;
첫 번째 예시는 Hello World를 첫 번째 문자부터 4개 자르는 함수다.
즉 H부터 4개, H, e, l, l을 잘라서 Hell을 반환한다.
세 번째 예시는 Hello World를 뒤에서부터 3번째 문자부터 끝까지 자르는 함수이다.
뒤에서 3번째인 r부터 끝까지, rld를 반환한다.
참고로 SUBSTRING()이라고 쓰든 SUBSTR()라고 쓰든 똑같은 함수다.
-- Using mixed
SELECT CONCAT
(
SUBSTRING(title, 1, 10),
'...'
) AS 'short title'
FROM books;
SELECT CONCAT
(
SUBSTR(author_fname, 1, 1),
'.',
SUBSTR(author_lname, 1, 1),
'.'
) AS 'author_initial'
FROM books;
CONCAT()과 SUBSTR()를 응용한 예제다.
첫 번째 예시는 title을 앞에서부터 10글자를 자른 다음에, 뒤에 "..."을 붙여서 반환한다.
이때 접근하는 테이블은 books이며, Field name은 short title로 재정의한다.
두 번째 예시는 fname과 lname을 뽑아내고, 뒤에 "."을 붙여서 반환한다.
마찬가지로 books 테이블에 접근하고 Field name은 author_initial로 재정의한다.
SELECT REPLACE(sample_string, origin_word, change_word) FROM table_name;
대체하다(Replace)는 뜻을 가진 함수다.
직관적으로 sample_string에서 origin_word에 해당하는 값을 change_word로 변경한다.
-- Using REPLACE
SELECT REPLACE('Hello World', 'Hell', '%$#@');
SELECT REPLACE('Hello World', 'l', '7');
SELECT REPLACE('Hello World', 'o', '0');
SELECT REPLACE('HellO World', 'o', '*');
SELECT REPLACE('cheese bread coffee milk', ' ', ' and ');
SELECT REPLACE(title, 'e ', '3') FROM books;
SELECT REPLACE(title, ' ', '-') FROM books;
첫 번째 예시에서 Hello World에서 Hell을 %$#@로 바꾸어 %$#@o World로 반환한다.
두 번째 예시에서는 l을 7로 바꾼다. 하지만 Hello World에는 l이 3개나 존재한다.
REPLACE 함수는 존재하는 모든 값을 바꾸어 He77o Wor7d가 된다.
SELECT REVERSE(sample_string) FROM table_name;
뒤집다(Reverse)는 뜻을 가진 함수다.
smaple_string을 뒤집는다. 정확하게 말하면 역순 정렬한다.
-- Using REVERSE
SELECT REVERSE('Hello World');
SELECT REVERSE('meow meow');
SELECT REVERSE(author_fname) FROM books;
첫 번째 예시는 Hello World라는 문자열을 뒤집어서 dlroW olleH로 반환한다.
-- CHAR_LENGTH(): real length
SELECT CHAR_LENGTH(sample_string) FROM table_name;
-- LEN(): not length, size of bytes
SELECT LEN(sample_string) FROM table_name;
문자열의 길이를 반환하는 CHAR_LENGT() 함수와 LEN() 함수다.
CHAR_LENGTH()는 문자열의 실제 길이를 반환한다. 즉 글자수를 세는 것과 동일하다.
LEN()은 문자열이 몇 Byte를 차지하는지 보여준다. 즉 메모리 공간을 세는 것과 동일하다.
영문자와 숫자에 있어서는 각 문자가 1 Byte이기 때문에 CHAR_LENGTH()와 LEN()의 결과과 같다.
하지만, 한글, 한자 같은 값은 ASCII code에 없기 때문에 그 이상의 Byte를 차지한다.
문자에 따라 결과가 달라지기 때문에, 정확하게 의도한 바에 맞춰 함수를 사용해야 한다.
-- Using CHAR_LENGTH
SELECT CHAR_LENGTH('Hello World');
SELECT CHAR_LENGTH(title) AS length, title FROM books;
SELECT author_lname, CHAR_LENGTH(author_lname) AS 'length' FROM books;
첫 번째 예시는 Hello World의 글자 수를 세어서 반환한다.
공백(space bar)을 포함하기 때문에 11을 반환한다.
SELECT UPPER(sample_string) FROM table_name;
SELECT UCASE(sample_string) FROM table_name;
SELECT LOWER(sample_string) FROM table_name;
SELECT LCASE(sample_string0 FROM table_name;
대문자(Upper)와 소문자(Lower)로 바꿔주는 함수다.
대문자를 보통 Upper case라고 불러 UPPER()와 UCASE()는 같은 동작을 한다.
마찬가지로 소문자로 바꾸는 함수로 LOWER()와 LCASE()가 같은 동작을 한다.
-- Using UPPER(UCASE) or LOWER(LCASE)
SELECT UPPER('Hello World');
SELECT LOWER('Hello World');
SELECT UPPER(title) FROM books;
SELECT CONCAT('MY FAVORITE BOOK IS ', UPPER(title)) FROM books;
SELECT CONCAT('MY FAVORITE BOOK IS ', LOWER(title)) FROM books;
첫 번째 예시는 Hello World를 대문자로 바꾸어, HELLO WORLD를 반환한다.
두 번째 예시는 Hello World를 소문자로 바꾸어, hello world를 반환한다.
SELECT INSERT(sample_string, start_index, how_many, insert_string);
삽입하다(Insert)는 뜻의 함수이다. INSERT() 함수는 4개의 매개변수를 갖는다.
첫 번째 매개변수는 어떤 문자열에 삽입할지, 원본 문자열을 적는 매개변수다.
두 번째 매개변수는 어떤 index 위치에 넣을지 결정하는 매개변수다.
세 번째 매개변수는 start_index부터 어느 길이의 문자열을 대체하여 넣을지 결정하는 매개변수다.
네 번째 매개변수는 삽입할 문자열을 적는 매개변수다.
-- Using INSERT
SELECT INSERT('Hello Bobby', 7, 0, 'There ');
SELECT INSERT('Hello Bobby', 7, 5, 'There');
첫 번째 예시는 Hello Bobby에서 7번째에서부터 0개만큼의 문자를 "There "로 삽입하는 함수다.
즉 7번째는 현재 B의 위치이므로 수행하고 나면, Hello There Bobby를 반환한다.
두 번째 예시는 Hello Bobby에서 7번째에서부터 5개만큼의 문자를 "There"로 삽입하는 함수다.
즉 7번째부터 5개의 문자열을 Bobby에 해당한다. 결과적으로 Hello There를 반환한다.
-- 기본 구문
SELECT REPEAT(sample_string, count);
-- 예시
SELECT REPEAT('ha', 4);
반복하다(Repeat)는 뜻의 함수다.
sample_string에 해당하는 문자열을 count만큼 반복하여 반환한다.
-- 기본 구문
SELECT LEFT(sample_string, how_many);
SELECT RIGHT(sample_strinig, how_many);
-- 예시
SELECT LEFT('omghahalol!', 3);
SELECT RIGHT('omghahalol!', 4);
왼쪽 혹은 오른쪽에서 how_many만큼의 문자열을 자르는 함수다.
첫 번째 예시는 문자열 왼쪽에서 3개만큼 잘라내어 omg를 반환한다.
두 번째 예시는 문자열 오른쪽에서 4개만큼 잘라내어 lol!를 반환한다.
특수 문자도 포함하는 것을 잊지 말자.
-- 기본 구문
SELECT TRIM(sample_string);
SELECT TRIM(OPTION 'some_string' FROM sample_string);
-- 예시
SELECT TRIM(' pickle ');
SELECT TRIM(LEADING '.' FROM '...pickle...');
SELECT TRIM(TRAILING '.' FROM '...pickle...');
SELECT TRIM(BOTH '.' FROM '...pickle...');
Trim은 정돈하다는 뜻으로 문자열을 기준으로 좌우 공백을 제거하는 함수다.
첫 번째 예시는 " pickel "이라는 문자열에서 좌우 공백을 지워 pickle을 반환한다.
Trim() 함수에서는 공백말고 option으로 다른 문자열도 제거할 수 있다.
LEADING(머리)을 사용하면 sample_string에서 왼쪽에 있는 some_string만을 제거한다.
TRAILING(꼬리)을 사용하면 sample_string에서 오른쪽에 있는 some_string만을 제거한다.
BOTH를 사용하면 sample_string에서 양옆에 있는 some_string을 모두 제거한다.
'Language > SQL' 카테고리의 다른 글
SQL 집계 함수 (0) | 2023.09.17 |
---|---|
SQL 부분 조회(필터링) (0) | 2023.09.15 |
CRUD (0) | 2023.09.11 |
SQL 기본 구문 (0) | 2023.09.10 |
SQL 정의와 DBMS 종류 (0) | 2023.09.04 |