개발 R.I.P.

8.26 Dev.Feedback (SQL)

편행 2021. 8. 26. 12:22
반응형

SQL이란?

Structured Query Language ==> 구조화된 Query 언어

데이터베이스 용 프로그래밍 언어 MySQL, Oracle, SQLite, PostgreSQL등이 있다.

데이터베이스에 Query를 보내 원하는 데이터를 가져오거나 삽입할 수 있다. 또한 데이터가 구조화된 테이블을 사용하는 데이터베이스에서 활용할 수 있다.

 

SQL을 사용할 수 있는 데이터베이스와 달리, 구조가 고정되어 있지 않는 데이터베이스가 있는데 이를 NoSQL이라고 한다. 테이블을 사용하지 않고 데이터를 다른 형태로 저장하게 되는데 대표적인 예시는 MongoDB와 같은 문서 지향 데이터베이스를 볼 수 있다.

 

Query란?

직역을 하면 질의문

가장 친숙한 예시로는 검색창에 적는 검색어도 Query의 일종

저장되어 있는 정보를 필터하기 위한 질문

 

(조금 더 디테일하게 찾아서 정리)

 

데이터베이스는 왜 필요할까?

In-memory : 프로그램이 실행될 때에만 존재하는 데이터 프로그램을 종료하면 갖고 있던 데이터들이 사라지게 된다.

 

JavaScript 상에서 데이터를 다룰 때를 예시로 들면, 변수를 만들어 저장한 경우에 프로그램이 종료 될 때 해당 프로그램이 사용하던 데이터도 사라지게 된다. 즉 변수 등에 저장한 데이터가 프로그램의 실행에 의존하게 된다는 것. 만일 예기치 못한 상황(정전이 일어난다거나 갑자기 시스템 전체가 다운이 된다거나)이 발생하면 데이터를 보호할 수 없게 되고, 데이터를 원하는 시간에 받아올 수 없게 되고 또한 데이터의 수명이 프로그램의 수명에 의존하게 된다.

 

File I/O : 서버에 저장되어 있는 파일, 파일을 일근ㄴ 방식으로 작동하는 형태이다. 엑셀 시트나 CSV같은 파일의 형태

종료해도 데이터를 저장하고 있지만, 원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온 뒤 서버에서 필터링을 해야한다. (시간이 오래 걸리게 된다.) 그렇기에 파일이 손상되었을 때, 혹은 데이터의 양이 방대해졌을 때 어떤 데이터를 원하는 대로 가공하고 변경해야할 때 같은 상황들에는 적합하지 않다.

 

Database : 필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버

 

데이터베이스는 정확하게 무엇일까?

우리가 일반적으로 엑셀 스프레스 시트에서 여러 정보들을 정리한 것과 비슷한 형태로 정리가 된다.

 

 

데이터베이스 관련 명령어

데이터베이스 생성

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

데이터베이스 사용

데이터베이스를 이용해 테이블을 만들거나 수정하거나 삭제하는 등의 작업을 하려면, 먼저 데이터베이스를 사용하겠다는 명령을 전달해야 한다.

USE 데이터베이스_이름;

테이블 생성

USE 를 이용해 데이터베이스를 선택했다면, 이제 테이블을 만들 수 있다. 다음은 user라는 테이블을 만드는 예제이다. 테이블은 필드(표의 열)와 함께 만들어야 한다.

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

id === 숫자, Primary key이면서 자동 증가되도록 설정
name === 문자열 (최대 255개의 문자)
email === 문자열 (최대 255개의 문자)

테이블 정보 확인

명령어를 통해 테이블 정보를 확인할 수 있다.

DESCRIBE user;
mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

 

SQL 명령어 간략하게 살펴보기

파란색의 박스안의 문구를 보면 SELECT, FROM, WHERE로 파란색 글씨가 쓰여 있는데 이게 쿼리문이다.

 

SELECT데이터셋에 포함될 특성을 특정한다. 세가지의 타입이 있다.

SELECT 'hello world' //일반 문자열
SELECT 2 // 숫자
SELECT 2+18 // 간단한 연산

FROM테이블과 관련한 작업을 할 경우 반드시 입력해야 한다. FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시해준다.

SELECT 특성_1
FROM 테이블_이름 // 특정 특성을 테이블에서 사용

SELECT 특성_1, 특성_2
FROM 테이블_이름 // 몇 가지의 특성을 테이블에서 사용

SELECT *
FROM 테이블_이름 // 테이블의 모든 특성을 선택

WHERE필터 역할을 하는 쿼리문이다. WHERE은 선택적으로 사용할 수 있다.

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값" 

//  특정 값과 동일한 데이터 찾기

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 <> "특정 값" 

// 특정 값을 제외한 값을 찾기

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 > "특정 값"

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 <= "특정 값" 

// 특정 값보다 크거나 작은 데이터를 필터할 때에는 '<', '>', 
// 비교하는 값을 포함하는 '이상', '이하' 값은 '<=', '>=' 을 사용

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%특정 문자열%" 

// 문자열에서 특정 값과 비슷한 값들을 필터할 때에는 'LIKE'와 '\%' 혹은 '\*' 를 사용
                                
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2") 

// 리스트의 값들과 일치하는 데이터를 필터할 때에는 'IN' 을 사용

SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL

// 값이 없는 경우 'NULL' 을 찾을 때에는 'IS' 와 같이 사용

SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NOT NULL

//  값이 없는 경우를 제외할 때에는 'NOT' 을 추가해 사용

ORDER BY

돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정한다. ORDER BY는 선택적으로 사용할 수 있다.

SELECT *
FROM 테이블_이름
ORDER BY 특성_1

// 기본 정렬은 오름차순

SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC

// DESC를 추가함으로 내림차순으로도 정렬이 가능하다

LIMIT

결과로 출력할 데이터의 갯수를 정할 수 있다. LIMIT은 선택적으로 사용할 수 있다. 그리고 쿼리문에서 사용할 때에는 가장 마지막에 추가해야 한다.

SELECT *
FROM 테이블_이름
LIMIT 200

// 데이터 결과를 200개만 출력

DISTINCT

유니크한 값을 받고 싶을 때에는 SELECT DISTINCT 를 사용할 수 있다.

SELECT DISTINCT 특성_1
FROM 테이블_이름

// 특성_1을 기준으로 유니크한 값들만 선택

SELECT
  DISTINCT
    특성_1
    ,특성_2
    ,특성_3
FROM 테이블_이름

// 특성_1, 특성_2, 특성_3의 유니크한 '조합' 값들을 선택

INNER JOIN

둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결한다.

SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

// INNER JOIN 이나 JOIN 으로 실행할 수 있다

OUTER JOIN

SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

 // 'LEFT OUTER JOIN'으로 LEFT INCLUSIVE을 실행

SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

// 'RIGHT OUTER JOIN'으로 RIGHT INCLUSIVE을 실행

다음은 Brazil에서 온 고객을 도시별로 묶은 뒤에, 각 도시 수에 따라 내름차순 정렬해준 데이터이다. 그리고 그 데이터의  CustomerId에 따라 오름차순으로 정렬한 3개의 결과만 요청하는 예시이다.

SELECT c.CustomerId, c.FirstName, count(c.City) as 'City Count'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId
WHERE c.Country = 'Brazil'
GROUP BY c.City
ORDER BY 3 DESC, c.CustomerId ASC
LIMIT 3
반응형