코드스테이츠 11주차 / SQL

🗃 사라지는 데이터?

지금까지는 데이터를 저장할 때 js에서 변수를 만들어서 저장했다
변수에 저장하게 되면 프로그램이 실행 될때만 컴퓨터 메모리에 저장되고 서버가 종료되면 메모리가 정리되며 저장했던 데이터들이 사라진다
이렇게 데이터가 사라지는 현상을 방지하기 위해서 데이터베이스를 사용해야 한다

데이터 베이스란?

관련성을 가지며 중복이 없는 데이터들의 집합이고
이 데이터 베이스를 관리하는 시스템을 DBMS(데이터 관리 시스템)라고 부른다

데이터베이스를 관리하는 DBMS중에서 RDBMS(관계형 DBMS)가 많이 사용되는데
RDBMS에는 대표적으로 MySQL, Oracle, SQLite 등이 있고
SQL(Structured Query Language)라는 데이터베이스 언어를 사용해서 데이터를 관리한다

관계형 데이터 베이스란?

서로 관계가 있는 데이터 테이블을 모아둔 저장공간이다

테이블은 여러가지가 있을 수 있고 다른 특징을 가지게 된다
sns를 예로 들면 작게 유저 테이블, 게시글 테이블 이 있고
유저가 게시물을 쓰게 되면 두 테이블간의 관계가 성립된다

위와 같이 각 테이블의 행과 행이 연결되는 관계를 맺을 수 있는데
이때 테이블의 관계는 일대일(1:1) 일대다(1:N) 다대다(N:M) 가 있다

이런 관계가 성립되는 테이블들을 한군데 모아 놓은 것을 관계형 데이터 베이스라고 한다

데이터테이블

관계형 데이터베이스를 말할 때 데이터 테이블을 모아둔 저장공간이라고 한다

이때 데이터 테이블이란?
데이터가 들어갈 수 있는 틀을 의미하고
행과 열 그리고 행과 열에 대응하는 값을 가진다

행(레코드) : 데이터 항목을 저장한다
열(필드) : 항목의 이름을 나타내고 필드마다 텍스트, 정수와 같은 데이터 유형을 정할 수 있다

🖍 SQL이란?

데이터베이스용 프로그래밍 언어이고 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 추가할 수 있다
SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 한다

SQL을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 하고
관계형 데이터베이스와는 다르게 테이블을 사용하지 않고 데이터를 다른 형태로 저장한다
NoSQL에는 대표적으로 MongoDB가 있다

SQL 기본 문법

SQL구문을 입력할 때 중요한건 마지막에 세미콜론(;)을 꼭 붙여야 실행된다

데이터베이스 생성

CREATE DATABASE 데이터베이스_이름;

데이터베이스 사용

USE 데이터베이스_이름;

테이블 생성

USE를 통해서 데이터베이스를 선택 > 테이블만들기
테이블은 필드(열)과 같이 만들어야 한다

밑과 같은 필드 조건이 있다면 아래 코드로 테이블을 생성할 수 있다

필드이름필드타입그외 속성
id숫자primary key, 자동증가
name문자열(최대 255개의 문자)
email문자열(최대 255개의 문자)
CREATE TABLE user (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(255),
  email varchar(255)
);

테이블 정보 확인

DESCRIBE user;

SQL 명령어

CLUD 작업
Create, Read, Update, Delete 데이터베이스에서 많이 사용되는 네가지 작업을 말한다

Create(생성)

데이터를 생성해서 데이터베이스에 넣는 작업이다


CREATE TABLE `user` (
  `id` int PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(255) not NULL,
  `email` varchar(255) not NULL
);

Read(조회)

데이터베이스에 있는 데이터를 조회하는 작업이다

현재 있는 데이터베이스에 존재하는 모든 테이블 정보를 보기위한 SQL

SHOW TABLES;

user 테이블의 모든 데이터를 조회하는 SQL

SELECT * FROM user

일부 컬럼 조회

SELECT 컬럼1 [, 컬럼2, 컬럼3 ...] FROM 테이블;
// user 테이블에서 name 칼럼만을 확인
SELECT name FROM user

특정 조건을 가진 데이터 조회

// user테이블에서 이름이 jiwon인 데이터
SELECT name FROM user WHERE name = 'jiwon'
// user테이블에서 이름이 jiwon이 아닌 데이터
SELECT * FROM user WHERE name <> 'jiwon'

AS(별칭)

SELECT 문을 사용할때 결과로 나오는 컬럼에 AS를 사용하여 다른 이름을 만들어 줄 수 있다

SELECT user.name AS name FROM user

Update(수정)

데이터베이스에 있는 데이터를 수정하는 작업이다

UPDATE [테이블명] SET [컬럼명=바꿀 값] WHERE [조건]

UPDATE user SET name = 'jiwon' WHERE id = 2;
// user테이블에서 id가 2인 로우의 name을 jiwon으로 변경

Delete(삭제)

데이터베이스에 있는 데이터를 삭제하는 작업이다

DELETE FROM user WHERE id = 2;
// user테이블에서 id가 2인 행(로우)를 제거 

insert into(데이터 추가)

테이블 순서에 맞게 데이터를 넣으면 키값을 적지 않아도 된다
하지만 id키가 자동으로 증가되는 옵션일때 숫자를 적어넣으면 오류가 나므로 주의해야 한다

INCERT INTO user VALUES ('5', 'jiwon','[email protected]')
insert into user (name, email) values ('jiwon','[email protected]')

원하는 데이터만 추가

j의 id가 1일때 j가 작성한 컨텐츠를 추가
제목과 본문은 자유

insert into content (title, body, userId) values ('a', 'a', 1);

NULL or IS NOT NULL (null값 검색)

NULL 인 값 검색

WHERE 칼럼명 IS NULL

NULL 이 아닌 값 검색

WHERE 칼럼명 IS NOT NULL

COUNT (데이터 갯수)

COUNT 함수는 테이블에 컬럼의 데이터 갯수를 가져오는데
NULL인 데이터는 제외하고 계산한다
전체 행 갯수를 가져올 때는 컬럼 대신에 *를 써주면 된다

전체 행 갯수

SELECT COUNT(*) FROM 테이블;

컬럼 데이터 갯수

SELECT COUNT(컬럼) FROM 테이블;

GROUP BY

그룹단위로 묶어서 결과를 도출한다

// 각 국가의 고객 수를 나열
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;

JOIN(데이터 연결)

JOIN 참조

둘 이상의 테이블을 연결해서 데이터를 검색하는 방법이다
테이블을 연결하려면 적어도 하나의 칼럼은 서로 공유되고 있어야 하고
Primary key 또는 Foreign key로 두 테이블을 연결한다

1. INNER JOIN(교집합)

기준 테이블과 Join 한 테이블의 중복된 값을 보여준다
A의 테이블과 B테이블이 모두 가지고 있는 데이터만 나온다

SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
INNER JOIN 조인테이블 이름 
ON 기준테이블이름.기준키 = 조인테이블이름.기준키

2. LEFT/RIGHT JOIN(부분집합)

SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
LEFT JOIN 조인테이블 이름 
ON 기준테이블이름.기준키 = 조인테이블이름.기준키

ex) jiSungPark이 작성한 content의 title을 찾기위한 SQL을 작성

jiSungPark(user.name)이 작성한 content의 title(content.title)을 찾고싶을 때 두 테이블을 합쳐서 검색 할 수 있어야 한다

1 찾고자 하는 정보 content.title을 SELECT 한 뒤
2 기준이 되는 테이블을 FROM 뒤에 써준다
3 그리고 JOIN할 테이블을 써주고
4 두 테이블을 연결되어있는 키 값으로 연결(ON) 해준다
5 그 안에서 WHERE를 사용해 특정 조건을 가진 데이터를 조회한다

SELECT content.title FROM content 
LEFT JOIN user
ON user.id = content.userId
WHERE user.name = 'jiSungPark';

✅ FROM 뒤가 기준이라는걸 잊지 말자

다중테이블

3개 이상의 여러 테이블을 JOIN 해야 할 때도 조건만 잘 맞춰서 쓰면 된다

참고
SQL 연습에 좋은 사이트

w3schools SQL QUIZ

w3schools SQL Exercises

좋은 웹페이지 즐겨찾기