✔︎ SQL은 무엇인가?
Structured
: 표의 형식으로 정리. 정리정돈을 하는 것. 이것을 구조화 되었다고도 할 수 있다.
Query
: 데이터베이스에게 데이터 읽어줘. 수정해줘. 만들어줘. 등의 요청(질의)한다는 뜻.
Language
: 데이터베이스도 이해할 수 있고, 나도 이해할 수 있는 공통의 약속으로 요청하는 언어(SQL).
✔︎ 터미널로 SQL 시작하기
# change directory 해당 디렉토리로 이동
cd /usr/local/mysql/bin
# root라는 기본유저 root로 접속
# root는 관리자이기 때문에 중요한 시스템이라면 별도의 사용자를 만들어 사용하고, 중요한 일일 때만 root 사용 권장
./mysql -uroot -p
# ./mysql을 쓰고 싶어. 라고 알리기.
# -u : user
# root : root라는 user로 접속하겠다.
# -p : password를 입력할 거야. mysql root 비밀번호 입력하면 됨(처음 설치할 때 입력한 비번)
✔︎ SQL의 구조

✔︎ 테이블 : 데이터를 기록하는 곳
ex) 글들을 저장하는 테이블, 댓글을 저장하는 테이블, 회원정보를 저장하는 테이블 등등
✔︎ 데이터베이스(스키마) : 서로 연관된 테이블들을 그룹핑함. 일종의 파일의 디렉토리 같은 것
ex) 유저 관련 스키마 (글, 댓글, 회원정보 테이블을 모아놓은 일종의 폴더)
✔︎ 데이터베이스 서버(mySQL) : 데이터베이스(스키마)들이 많아졌을 때 저장하는 곳
데이터베이스 서버의 장점
: 자체적인 보안체계를 사용하기 때문에 데이터를 안전하게 보관 가능
: 권한 기능 -> 여러 유저에게 권한을 다르게 줄 수 있음. 어떤 유저는 읽기만 가능. 어떤 유저는 읽기, 쓰기, 다 가능.

Column : 데이터의 타입, 데이터의 구조
Row : 데이터 하나 하나, 데이터 자체
✔︎ 데이터베이스(스키마) 만들기
# CREATE DATABASE 만들고싶은이름
CREATE DATABASE test;
# 잘못 입력했을 때나 삭제하고 싶을 때
DROP DATABASE test;
✔︎ 데이터베이스 (스키마) 확인하기
SHOW DATABASES
# SHOW SCHEMAS도 가능
✔︎ 데이터베이스 (스키마) 사용하기
# 원하는 데이터베이스로 들어가기(선택, 사용하기)
use test;
✔︎ 스키마에서 테이블 생성하기 (INSERT)
(1)카테고리(column) 만들기
👍 검색팁
create table in mysql
create table in mysql cheat sheat (컨닝페이퍼라는 뜻)
mysql datatype number (topic 만들 때 넣는 데이터타입 검색 ex)id는 숫자타입, title은 문자타입 등등)
다음과 같은 표를 생성할 예정

✔︎ 테이블 카테고리 생성하기
# 어떤 스키마를 사용할지 선택
use test;
# 테이블 만들기 (글들을 topic이라는 표에 저장할 것이기 때문에 이름을 topic으로.)
CREATE TABLE topic(
id INT(11) NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
description TEXT NULL,
created DATETIME NOT NULL,
author VARCHAR(30) NULL, # 작성자 익명일 수 있으니
profile varchar(100) NULL, # 자기소개 안 할 수도 있으니
PRIMARY KEY(id) # 메인 키 설정, 중복 방지
);
* 여기서 한 줄 띄어쓰기(enter)는 가독성 측면에서만 띄어져있고, 실제로는 한 줄로 쭉 붙어있는 형태이다. 그리고 마무리 할 때 ; 입력
# 데이터타입 (INT, TEXT 등) : 자신이 수용하려고 하는 데이터의 최댓값에 가장 가까운 데이터타입을 선택! 너무 큰 걸 사용하면 저장공간을 많이 차지하기 때문에 컴퓨터 시스템이 느려질 수 있기 때문
# INT(11) : 11은, 숫자를 검색할 때 얼마까지만 노출시킬까 하는 것. 11로 많이 쓴다고 함
# NOT NULL : 값이 없는 것을 허용하지 않겠다. 필수로 쓰겠다.
# AUTO_INCREMENT : 자동으로 1씩 증가한다. id 값이 데이터 생성될 때마다 자동으로 1씩 증가되게 만들어서 중복되지 않게 만들겠다.
# VARCHAR(100) : variable + char (변수 + 문자). 255문자까지만 받는 데이터타입. 100글자만 필요하므로 VARCHAR사용. 만약 1000글자를 입력하면 딱 100글자에서 잘라서 많은 것은 지워버림(버려버림)
# TEXT : 65000개의 문자를 허용. 글은 제목보다는 좀 길테니까 TEXT로 해줌.
# NULL : 안 쓰는 것도 허용한다. 필수 아님.
# DATETIME : 9999-12-31 23:59:59 날짜, 시간 둘다 필요한 데이터타입이라 사용
# PRIMARY KEY : 메인키라는 의미(중요한 것). 중복을 방지. "데이터베이스야, id 컬럼은 가장 중요한 컬럼인데, 이 컬럼은 각각의 값들이 고유해야해. 중복되면 안돼."
✔︎ 데이터 타입


✔︎ 테이블 카테고리 삭제하기
# 잘못 입력했을 때나 삭제하고 싶을 때
DROP TABLE topic;
✔︎ 테이블 수정하기
✔︎ column(카테고리) 추가
ALTER TABLE topic ADD COLUMN hashtag varchar(30)
✔︎ column(카테고리) 변경
ALTER TABLE topic CHANGE COLUMN hashtag hashtag2 varchar(20) NULL;
✔︎ column(카테고리) 삭제
ALTER TABLE topic DROP COLUMN hashtag2
✔︎ table 이름 바꾸기
ALTER TABLE topic RENAME topic2;
(2)column(카테고리) 안의 데이터(row) 만들기
👍 검색팁
mysql create row
how to read row in mysql
데이터 생성(추가) 사용예시

만들어야 할 테이블

✔︎ 테이블 데이터(row) 생성하기
SHOW DATABASES # 데이터베이스(스키마) 확인하기
use test; # test 스키마 선택
SHOW TABLES; # test 스키마에 있는 table 목록 보기
DESC topic; # topic 자세히 보기(구조, 카테고리 보기)
# id column은 값을 지정하지 않으면 자동으로 auto_increment가 돼서 추가됨 -> title부터 입력
# NOW()는 현재시간 알아서 입력해주는 함수
INSERT INTO topic (title, description, created, author, profile)
VALUES ('MySQL','MySQL is ...', NOW(), "k", "developer");
DESC topic 결과보기

✔︎ 스키마에서 테이블 읽기 (SELECT)
👍 검색팁
mysql select syntax
# 모든 데이터(*) 가져오기
SELECT * from topic;
모든 데이터 가져오기 결과

# 원하는 데이터만(이 부분을 projection이라고 부름) 가져오기
SELECT id, title, created, author from topic;
# Projection : 여기서 id, title, created, author 이 부분, 원하는 것을 선택하는 부분을 projection이라고 부른다.
SELECT id, title, created, author from topic;
원하는 데이터만 가져오기 결과

✔︎ 이 외에 여러가지 select 문법 써보기
✔︎ column 가져오기
# select_expr (column 가져오는 문법)
# author column 가져오기
SELECT "k"
column 가져오기 결과

select 한거 위에 셀에, 가져온 것 아래셀에.
SELECT "k", 1+1;

select 한거 위에 셀에, 가져온 것 아래셀에.
✔︎ id, title, created, author만 있는 데이터 가져오면서 author가 "k"인 것만 가져오기
SELECT id, title, created, author FROM topic WHERE author='k';

✔︎ 큰 숫자대로 정렬하기 (내림차순)
정렬하기 전 (before)

정렬 후 (after)
SELECT id, title, created, author FROM topic where author = "m" ORDER BY id DESC;
# id 값을 기준으로 descending(큰 숫자 순, 내림차순)으로 정렬

❗️ 만약 데이터가 엄청 많은 상태에서 SELECT * from topic을 한다면 거대한 데이터를 불러오면서 시스템에 문제가 생긴다. 멈추거나 난리남.
-> 데이터를 가져올 때 제약을 걸어야한다.
✔︎ 데이터 원하는 갯수만 보기
# LIMIT 1 : 데이터를 한 개만 보겠다는(가져오겠다는) 의미
SELECT id, title, created, author FROM topic where author = "m" ORDER BY id DESC LIMIT 1;
LIMIT 하기 전과 LIMIT한 결과

✔︎ 스키마에서 테이블 수정 (UPDATE)
👍 검색팁
mysql update
update 문법

update 전 확인
SELECT * FROM topic;

update 하기
❗️😱 WHERE문을 빠뜨리면 테이블의 모든 값이 다 SET 값으로 바뀌기 때문에 조심!
UPDATE topic SET title='Oracle', description='Oracle is...' WHERE id=2;
UPDATE 원하는 스키마 이름 SET 원하는 키 = 'value' WHERE 바꾸려고하는카테고리=카테고리값

✔︎ 스키마에서 테이블 삭제 (DELETE)
👍 검색팁
SQL Delete in mySQL
delete 문법

delete 전 확인
SELECT * FROM topic;

delete 하기
❗️😱 WHERE문을 빠뜨리면 테이블의 모든 값이 다 삭제되기 때문에 조심!
# 삭제하기 (id = 5번째 줄 삭제)
DELETE FROM topic WHERE id = 5;
# 삭제 확인
SELECT * FROM topic;

계정 비밀번호 변경
ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';
참고자료
생활코딩 mySQL https://www.opentutorials.org/course/3161
mySQL 데이터타입 https://www.techonthenet.com/mysql/datatypes.php
mySQL INSERT w3school https://www.w3schools.com/sql/sql_insert.asp
mySQL SELECT https://dev.mysql.com/doc/refman/8.0/en/select.html
mySQL update https://dev.mysql.com/doc/refman/8.0/en/update.html
mySQL delete https://dev.mysql.com/doc/refman/8.0/en/delete.html