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

CRUD는 Create, Read, Update, Delete의 약자로, 데이터베이스에서의 기본 작업 4가지를 말한다.

각 동작에 대한 간단한 설명은 다음과 같다.

 

Create: 데이터를 생성하거나 새로운 테이블을 데이터베이스에 추가한다. 새로운 정보를 저장할 때 사용한다.

Read: 데이터를 읽거나 검색하여 데이터베이스 정보를 조회한다. 저장된 데이터를 읽고 가져올 때 사용한다.

Update: 데이터베이스나 테이블 정보를 수정한다. 데이터의 일부 혹은 전체를 수정할 때 사용한다.

Delete: 데이터를 삭제하여 정보를 제거한다. 더 이상 필요하지 않거나 잘못된 데이터를 삭제할 때 사용한다. 

 

실습하는 cats 테이블의 정보는 위와 같다.

 

Create

-- 기본 구문
INSERT INTO want_table_name(want_columns) VALUES (value);

테이블에 값을 넣을 때 사용하는 기본 구문이다.

want_table_name에는 값을 넣을 테이블을, want_columns에는 값을 넣을 열을 고른다.

그리고 value에는 열에 대응하는 값을 넣으면 된다.

 

-- 예시
INSERT INTO cats(name, age) VALUES ('dog', 1);


-- 같은 표현
INSERT INTO cats(name, age)
VALUES ('dog', 1);

INSERT 구문 예시이다.

cats 테이블에 name과 age에 각각 dog와 1이라는 값을 추가힌다.

이때 breed에는 값을 추가하지 않았다. NOT NULL로 선언하지 않았기 때문에 가능하다.

 

다른 구문에서도 동일하지만 SQL은 영어 대소문자를 구분하지 않는다.

또한 줄바꿈이 있어도 세미콜론(;)이 나오지 않는 한 전부 하나의 명령으로 이해한다.

따라서 위의 두 가지 방식 모두 같은 동작을 수행한다.

 

-- 예시
INSERT INTO cats() VALUES ();

cats의 column은 cat_id, name, breed, age가 있다.

cat_id는 NOT NULL이지만, AUTO_INCREMENT로 값이 지정되어 들어간다.

name, breed, age는 모두 NULL을 허용한 열이기에 위와 같은 코드도 동작이 가능하다.

 

-- 예시
INSERT INTO cats(name, breed, age) VALUES ("Bark", "shepard", 2);
INSERT INTO cats(name, breed, age) VALUES ("shea", "pome", 3);
INSERT INTO cats(name, breed, age) VALUES ("shah", "shah", 1);


-- 같은 표현
INSERT INTO cats(name, breed, age)
VALUES ("Bark", "shepard", 2),
       ("shea", "pome", 3),
       ("shah", "shah", 1);

위의 3마리의 각기 다른 고양이 정보를 테이블에 넣는다고 해보자.

번거롭게 같은 INSERT INTO 구문을 반복해서 작성해도 되지만, VALUE에 쉼표(,)로 구분하여 적어도 상관없다.

즉, 위의 두 방식은 같은 코드로 동작한다.

 

-- 실전 예시
INSERT INTO cats(name, breed, age) 
VALUES ('Ringo', 'Tabby', 4),
       ('Cindy', 'Maine Coon', 10),
       ('Dumbledore', 'Maine Coon', 11),
       ('Egg', 'Persian', 4),
       ('Misty', 'Tabby', 13),
       ('George Michael', 'Ragdoll', 9),
       ('Jackson', 'Sphynx', 7);

CRUD 중 RUD에서 사용할 실습 예제 코드다.

PRIMARY KEY에 해당하는 cat_id는 기본으로 1부터 시작하여 7까지 들어가게 된다.

 

Read

-- 기본 구문
SELECT want_columns FROM want_table_name;

 

 

특정 테이블에서 특정 열을 확인하는 기본 구문이다.

 

-- 예시
SELECT * FROM cats;

SQL에서 *은 all이라는 의미로 모든 경우의 수를 전부 선택한다.

즉, cats 테이블에서 모든 열을 선택하여 보여준다.

 

-- 기본 구문
SELECT want_columns FROM want_table_name WHERE conditions;

데이터베이스를 확인할 때 언제나 모든 행과 열을 확인하지 않는다.

SELECT 키워드를 사용하여 검색하려는 열을 특정하고, WHERE 키워드를 사용하여 검색하려는 행을 특정한다.

 

-- 예시
SELECT breed FROM cats WHERE age = 4;


-- 또 다른 예시
SELECT name, age FROM cats WHERE breed='Tabby' OR breed='Persian';

첫 번째 예시는 cats 테이블에서 age가 4인 고양이들 중 breed만 출력하는 구문이다.

두 번째 예시는 cats 테이블에서 breed가 Tabby거나 Persian인 고양이들 중 name과 age를 출력하는 구문이다.

두 번째 예시처럼 WHERE 조건문에는 AND나 OR로 다중 조건으로 검색하는 것이 가능하다.

 

-- 다양한 실전 예시
SELECT cat_id FROM cats;
SELECT name, breed FROM cats;
SELECT name, age FROM cats WHERE breed='Tabby';
SELECT cat_id, age FROM cats WHERE cat_id=age;
SELECT * FROM cats WHERE cat_id=age;

여러 실전 예제를 참고해보자.

 

-- 기본 구문
SELECT want_columns AS want_new_name FROM want_table;

SELECT를 사용할 때 AS라는 특별한 키워드를 사용할 수 있다.

AS 앞에 선택한 열이, AS 뒤에 새롭게 적어준 이름으로 바뀐 채 출력이 된다.

이때 기존 테이블 자체가 바뀌는 것이 아니라, 출력할 때만 바뀌어서 나온다.

 

-- 예시
SELECT cat_id AS id, name FROM cats;

cats 테이블에서 cat_id와 name을 출력하려고 한다.

하지만 cat_id라는 이름이 길어 id로 출력하고자 할 때, 위처럼 작성하면 된다.

 

Update

-- 기본 구문
UPDATE want_table SET change_condition

기존에 존재하는 테이블의 값을 수정하는 기본 구문이다.

어떤 테이블에서 어떻게 값을 수정할 것인지 명시해야 한다. 즉 두 가지 값은 필수이다.

 

단, 수정하기 전 SELECT로 확인하는 작업을 권장한다.

SQL에서 값을 수정할 때 '정말로 수정하시겠습니까?'라는 친절한 문구는 나오지 않는다.

수정 구문을 실행하는 즉시 값이 바뀌게 된다.

내가 원하는 값을 수정하는 게 맞나 SELECT로 확인하는 습관을 들여놓자.

 

-- 예시
UPDATE cats SET breed='Shorthair';


-- 또 다른 예시
UPDATE cats SET age=14;

첫 번째 예시는 cats 테이블에서 모든 breed를 Shorthair로 바꾸는 구문이다.

두 번째 예시는 cats 테이블에서 모든 age를 14로 바꾸는 구문이다.

*가 없음에도 '모든'으로 해석하는 이유는 특별한 조건이 없기 때문이다.

각 행에 접근하여 age를 14로 바꾸는데, 예외 조건이 없어 결국 모든 행을 바꾸게 된다.

 

-- 기본 구문
UPDATE want_table SET change_condition WHERE condition;

언제나 모든 행의 값을 바꾸는 걸 원하지 않는다.

따라서 SELECT처럼 WHERE 조건문이 필요하다.

 

-- 예시
UPDATE cats SET breed='Shorthair' WHERE breed='Tabby';


-- 또 다른 예시
UPDATE cats SET age=14 WHERE name='Misty';

첫 번째 예시는 cats 테이블에서 breed가 Tabby인 경우에만 Shorthair로 변경하는 구문이다.

두 번째 예시는 cats 테이블에서 name이 Misty인 경우에만 age를 14로 변경하는 구문이다.

 

-- 다양한 실전 예시
UPDATE cats SET name='Jack' WHERE name='Jackson';
UPDATE cats SET breed='British Shorthair' WHERE name='Ringo';
UPDATE cats SET age=12 WHERE breed='Maine Coon';

그밖에 다양한 예제들로 직접 익숙해지자.

마찬가지로 WHERE 조건문에 AND나 OR로 다중 조건을 거는 게 가능하다.

 

Delete

-- 기본 구문
DELETE FROM table_name;

테이블에서 값을 삭제하는 기본 구문이다.

어떤 테이블에서 삭제할 것인지 묻기에 테이블 값은 필수이다.

 

수정과 마찬가지로 삭제로, 삭제하기 전 SELECT로 값을 확인하는 것을 권장한다.

몇 보 양보해서 수정은 다시 바꿀 수 있어서 괜찮다고 하더라도, 삭제는 아니다.

실수로 조건을 걸지 않고 모든 행을 삭제해버린다면? 백업이 없다면? 복구가 안 된다면?

그야말로 되돌릴 수 없는 대참사다. SELECT를 습관화하자.

 

-- 예시
DELETE FROM cats;

cats 테이블에서 조건에 만족하는 행을 삭제한다.

하지만 WHERE 조건이 없다. 모든 행, 즉 테이블을 전체 값을 삭제하게 된다.

 

DROP TABLE cats;와 DELETE FROM cats;는 차이점이 있다.

전자는 '테이블 자체'를 삭제하고, 후자는 '테이블의 전체 값'을 삭제한다.

즉 후자는 테이블 규격(프레임) 자체는 남아있어, 다시 값을 추가하는 작업이 가능하다.

 

-- 기본 구문
DELETE FROM table_name WHERE conditions;

SELECT, UPDATE처럼 특정 조건을 걸어 테이블 값을 삭제한다.

 

-- 예시
DELETE FROM cats WHERE age=4;


-- 또 다른 예시
DELETE FROM cats WHERE cat_id = age;

첫 번째 예시는 cats 테이블에서 age가 4인 행을 삭제한다.

두 번째 예시는 cats 테이블에서 cat_id와 age가 같은 행을 삭제한다.

마찬가지로 WHERE 조건문에 AND나 OR로 다중 조건을 거는 게 가능하다.

'Language > SQL' 카테고리의 다른 글

SQL 부분 조회(필터링)  (0) 2023.09.15
SQL 문자열 함수  (0) 2023.09.14
SQL 기본 구문  (0) 2023.09.10
SQL 정의와 DBMS 종류  (0) 2023.09.04
DBMS(MySQL) 설치  (0) 2023.09.04

SQL 기본 구문

SQL에서 Database와 Table을 예제를 생성한 상태의 MySQL이다.

좌상단의 SCHEMAS를 보면 'codingtable'이라는 Database와 'cats'라는 Table이 있는 것을 볼 수 있다.

또한, 좌하단의 Schemas를 보면 'cats' Table이 어떤 columns이 있는지 확인할 수 있다.

현재는 'cat_id' 값이 기본키로 들어가있으며, name, breed, age가 column으로 있다.

 

MySQL이라는 DBMS를 사용하면 당연히 데이터베이스를 다룰 줄 알아야 한다.

위의 그림을 예시로 들면, 4개의 각기 다른 색에 해당하는 구역이 하나의 Database이다.

각 색상에 들어있는 다양한 크기의 사각형들이 Table이다.

이번 글에서 가장 기본이 되는 데이터베이스를 확인, 생성, 삭제하는 구문을 다루고,

데이터베이스 내부에 존재하는 테이블들을 확인, 생성, 삭제하는 구문을 다룬다.

 

Database 관련 구문

-- MySQL Server에 있는 DB 목록 확인
SHOW databases;

현재 MySQL에 있는 모든 데이터베이스 목록을 보여준다.

 

-- 새로운 DB 만들기
CREATE DATABASE new_db_name;

새로운 데이터베이스를 생성한다.

new_db_name에 자신이 새롭게 생성하고자 하는 데이터베이스 이름을 적으면 된다.

 

-- 존재하는 DB 삭제하기
DROP DATABASE del_db_name;

SQL에서 삭제할 때는 보통 DROP 키워드를 사용한다.

del_db_name에 삭제하고자 하는 데이터베이스 이름을 적으면 된다.

 

-- 사용할 DB 선택하기, DB 더블 클릭과 동일
USE use_db_name;

데이터베이스 내부에 테이블을 생성하기 위해서는 데이터베이스에 접근해야 한다.

use_db_name에 접근할 데이터베이스 이름을 적으면 된다.

이때 MySQL Workbench 좌측창에서 더블 클릭으로 접근해도 상관없다.

 

-- 현재 DB 확인하기
SELECT database();

현재 선택한 데이터베이스를 확인한다.

 

Table 관련 구문

-- 선택한 Database에 있는 Table 목록 확인하기
SHOW TABLES;

 데이터베이스 내부에 존재하는 테이블 목록을 보여준다.

 

-- table_name에 해당하는 Table 확인하기
SHOW COLUMNS FROM table_name;
DESCRIBE table_name;
DESC table_name;

특정 테이블의 정보를 확인한다.

특정 테이블의 Field, Type, Null, Key, Default, Extra 값들을 보여준다.

table_name에 보고 싶은 테이블 이름을 적으면 된다.

 

-- del_table_name에 해당하는 Table 삭제하기
DROP TABLE del_table_name

테이블을 삭제할 때 사용한다. del_table_name에 삭제할 테이블 이름을 적으면 된다.

 

CREATE TABLE new_table_name
(
    Field	Type	*optional value*
);

테이블을 생성하는 방법이다.

위에서 언급한 것처럼 테이블에는 Field, Type, Null, Key, Default, Extra 값이 존재한다.

그에 따라 테이블을 생성할 때는 값을 명시해줘야 한다.

 

CREATE TABLE cats
(
    name	VARCHAR(100),
    breed	VARCHAR(50),
    age	INT
);

가장 간단한 형태로 테이블을 생성한 예시이다.

cats라는 이름으로 테이블을 생성하고 name, breed, age의 Field를 생성했다.

name과 breed는 최대 문자열 100자를 받을 수 있는 타입(VARCHAR(100))으로,

age는 정수값을 받아들일 수 있는 타입으로 선언했다.

 

CREATE TABLE people
(
    first_name	VARCHAR(20)	NOT NULL	DEFAULT 'noname',
    last_name	VARCHAR(20)	NOT NULL	DEFAULT 'noname',
    age		INT			NOT NULL	DEFAULT 99
);

또 다른 예시로 people이라는 이름의 테이블을 생성했다.

테이블의 NULL 속성은 해당 열(column)이 NULL을 허용하는지 안 하는지를 나타낸다.

이때 Field를 NOT NULL로 선언한다면 NULL 값을 허용하지 않는다.

 

테이블을 생성하고, 그에 해당하는 값을 추후에 입력해야 한다.

이때 해당 값에 아무 것도 입력하지 않았을 때, NULL 값으로 들어가게 된다.

NULL이 아니라 특정 값을 넣고 싶다면 DEFAULT로 기본 값을 설정할 수 있다.

 

NOT NULL과 DEFAULT를 같이 선언한다면 어떻게 될까?

DEFAULT 값을 선언했으니 NOT NULL이 의미가 없는 것은 아닐까?

DEFAULT는 아무 것도 입력하지 않았을 때, 특정 값을 넣어준다는 제약이다.

입력값으로 직접 NULL을 넣어주면 DEFAULT가 동작하지 않는다.

이를 NOT NULL로 방지할 수 있다.

 

CREATE TABLE unique_cats
(
    cat_id	INT	PRIMARY KEY,
    name	VARCHAR(100)	NOT NULL,
    age	INT			NOT NULL
);


CREATE TABLE unique_cats
(
    cat_id	INT,
    name	VARCHAR(100)	NOT NULL,
    age	INT			NOT NULL,
    PRIMARY KEY (cat_id)
);

기본키(Primary key)를 사용한 테이블 생성 예제다.

name과 age가 같은 두 마리의 고양이를 입력했다고 해보자. 이를 어떻게 구분할 수 있을까?

이때 필요한 것이 기본키다. 기본키라는 것은 행(row)을 구별하기 위한 고유한 값이다.

기본키는 PRIMARY KEY 키워드로 해당 Field를 기키로써 선언할 수 있다.

기본키로 선언하는 방법에는 위의 2가지가 있다.

 

CREATE TABLE increase_cats
(
    cat_id	INT	AUTO_INCREMENT	PRIMARY KEY,
    name	VARCHAR(100)	NOT NULL,
    age	INT			NOT NULL
);

기본키를 하나하나 직접 입력하기에는 번거롭다. 그를 위한 AUTO_INCREMENT 옵션이 있다.

AUTO_INCREMENT는 기본키를 1부터 시작하여 자동으로 1씩 올려서 저장해준다.

주의할 점은 PRIMARY KEY에는 언더스코어가 들어가지 않고, AUTO_INCREMENT에는 언더스코어가 들어간다.

 

DROP TABLE cats;
DROP TABLE people;
DROP TABLE unique_cats;
DROP TABLE increase_cates;

위처럼 생성한 테이블들을 DROP으로 삭제할 수 있다.

'Language > SQL' 카테고리의 다른 글

SQL 부분 조회(필터링)  (0) 2023.09.15
SQL 문자열 함수  (0) 2023.09.14
CRUD  (0) 2023.09.11
SQL 정의와 DBMS 종류  (0) 2023.09.04
DBMS(MySQL) 설치  (0) 2023.09.04

SQL

SQL은 Structured Query Language의 약자로, DB에서 데이터를 추출하고 조작하는 데이터 처리 언어이다.

그렇기에 프로그래밍 언어는 당연히 아니고, DB에서 사용하는 하나의 관리 도구에 가깝다.

다양한 DB가 있지만, 일반적으로 SQL을 사용하는 DB는 RDB(관계형 데이터베이스)이다.

이때 RDB에서 '관계'를 뜻하는 Relational은 값들 사이의 관게를 나타내는 것이 아닌, 수학 용어에서 온 말이다.

 └ Relation : 두 개 이상의 집합으로부터 각 집합을 구성하는 원소들의 순서쌍에 대한 집합

 

세상에는 다양한 DB가 있고, 그에 따른 다양한 DBMS도 있다.

그리고 DBMS는 표준 SQL을 사용하는 DBMS가 있고, SQL만을 사용하는 게 아닌 NoSQL DBMS가 있다.

 

SQL - DB 종류와 DBMS

Relational Database

- ORACLE

- MySQL

- PostgreSQL

- Microsoft SQL Server

- Maria DB

- SQLite

- Google Cloud Spanner

- IBM DB2

 

NoSQL - DB 종류와 DBMS

Not only SQL로, SQL을 사용하지 않는 게 아니다.

데이터를 조직하는 방법은 해시 테이블, 그래프, 트리 등 다양한 방법과 각각 장단점이 명확하다.

그렇기 때문에 SQL 외에 다른 방법도 같이 사용을 한다는 의미에서 No(Not only)이다.

또한, RDBMS의 독점적인 지위를 차지하는 현재 상황에 반발한다는 이야기도 있다.

 

NoSQL을 사용하는 DB는 

Key-value Database

- Dynamo DB

- redis

 

Graph Database

- Sparsity

- neo4j

- Orient DB

- Arango DB

 

Document Database

- mongo DB

- Couch DB

- Cloud Firestore

 

Column family Database

- cassandra

- APACHE HBASE

- Google Cloud Bigtable

 

Search engine

- elastic

- Amazon Cloud Search

- Google Cloud Search

 

https://www.youtube.com/watch?v=ZVuHZ2Fjkl4&t=110s 

https://www.youtube.com/watch?v=Q_9cFgzZr8Q&t=161s 

d

'Language > SQL' 카테고리의 다른 글

SQL 부분 조회(필터링)  (0) 2023.09.15
SQL 문자열 함수  (0) 2023.09.14
CRUD  (0) 2023.09.11
SQL 기본 구문  (0) 2023.09.10
DBMS(MySQL) 설치  (0) 2023.09.04

 

SQL을 지원하는 여러 DBMS 중 47%로 2022 stackoverflow 통계 1위를 차지한 MySQL이다.

https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html에서 설치할 수 있다.

하단으로 내려가면 MySQL Installer Method 부분에서 다운로드 링크를 찾을 수 있다.

 

다운로드 링크로 들어가면 위와 같은 사진이 나온다.

원하는 버전과 OS에 따라서 설치를 하면 된다.

하단의 Download 파일이 2개인 이유는 web 버전이냐 아니냐의 차이다.

web-community 버전은 말그대로 web, internet을 통해서 다운을 받는 파일이다.

현재 온라인 상태가 아니라면 모든 패키지를 포함한 하단 파일을 받으면 된다.

 

윈도우가 제공하는 설치 파일 msi(Microsoft Silent Installer)를 실행하면 위와 같은 화면이 뜬다.

MySQL을 어떤 용도로 사용할 것인지 물어보는 메뉴이다.

 

Server only, Client only, Full, Custom(왼쪽부터 순서대로)

각각의 setup type에 따른 설명이다.

Server only는 데이터 관리용 서버 프로그램만 설치하는 것이고, client only는 사용자의 application만 설치한다.

Full은 server와 client의 모든 파일을 설치하고, custom은 full에서 원하는 것만 골라서 설치할 수 있다.

여기서는 필요한 파일만 골라서 설치하는 custom으로 진행한다.

 

데이터 관리용 서버 프로그램인 MySQL Server,

하나의 IDE로 SQL 개발, 관리, DB 설계, 생성, 유지 보수를 위한 통합 환경인 MySQL Workbench,

명령 프롬프트 같은 창에서 실행할 수 있는 MySQL 환경인 MySQL Shell,

그리고 그밖에 MySQL Documentation과 Samples 파일들을 선택하였다.

 

Next로 진행하면 선택한 파일들이 맞는지 다시 확인시켜준다.

맞을 경우 Execute로 설치를 진행하고, 아니라면 Back으로 돌아가자.

 

네트워크 통신 상태를 결정하는 설정 창이다.

TCP/IP로 진행할지를 결정할 수 있다. 이때 TCP/IP로 진행한다면 포트 번호를 변경할 수 있다.

이때 설정들은 나중에 전부 다시 변경할 수 있다.

 

MySQL 서버와 Authentication(인증)하는 방법에 대한 설정 창이다.

Use Strong Password Encryption for Authentication은 강한 암호화로 인증을 수행한다.

암호 체계는 SHA-256으로 적혀있다. 최신 버전을 사용해 굳이 아래를 고를 필요가 없어 RECOMMENDED로 진행한다.

인증과 연동에 있어서 '보안 안전성'을 우선시하는지, '유동성'을 우선시하는지에 따라 선택하면 된다.

 

MySQL 화면을 어떻게 적을지 물어보는 설정 창이다.

Windows Service Name칸에 자신이 원하는 이름을 적으면 된다.

사용하고 싶은 계정이 따로 있다면, 하단에서 Custom User로 사용할 수 있다.

 

Server File Permissions는 서버 파일을 어느 측면에서 관리할지 설정하는 창이다.

위에서부터 차례대로 설명하자면 아래와 같다. 사용자를 생각하여 적절히 선택하자.

ㆍ 처음부터 끝까지 유저가 관리합니다. 승인받은 그룹만이 접근 권한을 갖고 있습니다.

ㆍ 유저가 관리합니다. 하지만 간단한 접근정도만 하겠습니다.

ㆍ 나중에 서버 설정에서 따로 추가하겠습니다. 지금은 아닙니다.

 

MySQL Server에 대한 설정을 끝으로 설치를 완료한 화면이다.

정상적으로 떴다면 Finish를 누르고, "Samples and Examples" 설정으로 넘어가자.

 

어떤 서버에서 사용할 것인지 서버를 고르고, User name와 password를 설정한다.

이때 작성한 이름과 비밀번호는 나중에 개인 DBMS에 접근할 때 꼭 필요하다.

나중에도 변경 가능하니 심각하게 고민할 필요는 없다.

 

이름과 비밀번호까지 전부 설정하고 연동하면 설치는 끝이다.

 

원한다면 Shell Documentation이나 다른 Blog들도 참고해서 읽어보자.

아니라면 지금 바로 Start할 것인지 체크박스를 선택하고 FInsih하면 된다.

 

Start MySQL Shell after setup를 선택하면 뜨는 창이다.

Workbench말고 위 shell 창에서도 똑같이 SQL 실행이 가능하다.

하지만 한 번에 한 query만 작성 가능하다는 점, 길어지는 query는 다루기 힘들다는 점이 있다.

 

Start MySQL Workbench after setup를 선택하면 뜨는 창이다.

이때 설치를 하면서 한참 설정해주었던 값들이 MySQL Connections에 보인다.

설정한 Windows service name, Username, Port까지 전부 있다.

해당 회색 네모 박스를 우클릭해서 "Edit Connection..."에서 값을 변경할 수 있다.

 

좌클릭하면 해당 창이 하나 뜨는데, DBMS에 접속할 것인지 물어보는 창이다.

Password에서 아까 전에 설정한 패스워드를 입력하면 된다.

Save password in vault는 비밀번호를 기억하겠냐는 뜻이다.

체크한다면 나중에 접속할 때 번거롭게 비밀번호를 입력하지 않아도 접속할 수 있다.

하지만, 비밀번호 관리에 대한 책임은 각자에게 있다.

 

이제 MySQL을 사용할 준비가 끝났다.

'Language > SQL' 카테고리의 다른 글

SQL 부분 조회(필터링)  (0) 2023.09.15
SQL 문자열 함수  (0) 2023.09.14
CRUD  (0) 2023.09.11
SQL 기본 구문  (0) 2023.09.10
SQL 정의와 DBMS 종류  (0) 2023.09.04

+ Recent posts